Обсуждение:Menu Navigator (RS-Bank 5.0)
0 (0)
Обсуждение:Menu Navigator (RS-Bank 5.0) ( Обсуждение примера 21.05.2008 11:36 )
0(0)Модуль для работы с пунктами меню пользователей и пользовательскими модулями.
Не дает править меню пользователя 9999, остальных пользователей - без ограничений.
Программа соответствует идеалогии программы The FAR manager.
Остальное в setup.txt.
Посмотреть пример
>> ОтветитьОтличное решение, спасибо. ( Sergey 22.05.2008 10:59 )
0(0)Есть похожий, тоже замечательный, инструмент. которым я уже почти 5 лет пользуюсь -
http://support.softlab.ru/Portal/Samples/sample.asp?Typ=12&Id=177
У Вашего есть преимущества - не используется VCH (а значит можно применить EasyWin), легко установить (впервый раз вижу такую заботу об самих автоматизаторах:)), более похож на привычный файлер по идеологии.
Есть, имхо, недостатки - нет, или я не нашел процедур массовой обработки меню (копирования, удаления), процедур поиска дублей, сравнения меню. Не нашел простой возможности поменять расположение источника или приемника меню (например - другой каталог DBFILE).
Вместе эти сервисы вообще сила :).
>> ОтветитьПроцедуры массовой обработки есть ( Vlada 22.05.2008 11:16 )
0(0)По Ins выделяете нужные пункты меню (выделение символом *) или программные модули (желтым цветом) и копируете (перемещаете, удаляете), сколько душе угодно! Поиск также есть (Alt+F7)- вводите или название пункта или номер программного модуля - выдаст список. Поиск идет в глубину от текущего уровня, поэтому в одном спике могут быть пункты из разных по глубине уровней вложенности. Эту процедуру еще буду додумывать, как сделать более наглядной))) Про источник-приемник меню - поясните, пожалуйста)))
>> ОтветитьЕще хорошо бы совместимость со старыми версиями RSL ( Ltybc 22.05.2008 11:38 )
0(0)Убрать break и continue, которые появились только с 5.0.90. И константы K_ENTER и прочие тоже, как мне кажется.
>> ОтветитьКонстанты - не проблема ( Vlada 22.05.2008 11:46 )
0(0)Их можно при необходимости заменить напрмяую кодами клавиш. А вот break и continue там очень нужны...:(
>> ОтветитьУбрать однозначно и подумать головой ( LeonL 22.05.2008 12:47 )
0(0)Сижу адаптирую, половина break меняется на return без изменений, сложнее с оператором continue, приходится переделывать циклы. Попалось пара функций смысл которых я не уловил (видимо женская логика).
Вобще конечно респект, особенно за читаемость кода.
>> ОтветитьИ какая же это "пара функций"? ( Vlada 22.05.2008 14:03 )
0(0)Not specified
>> ОтветитьНу вот мне например непонравился мухлеж с функцией GetAdminOper ( LeonL 22.05.2008 14:36 )
0(0)Macro GetAdminOper()//поиск опера с админскими правами
var oper = Tbfile("person.dbt");
oper.rec.oper = 9999;
if ( ( oper.GetGe ) and ( oper.rec.oper == 9999 ) ) /* GetEq какбы вроде логичнее */
return oper.rec.oper;
else
oper.rewind;
while ( oper.next )
if ( trim( strlwr( GetAccesOper( oper.rec.oper ) ) ) == "администратор" )
return oper.rec.oper;
end;
end;
end;//if ( ( oper.GetGe ) and ( oper.rec.oper == 9999 ) )
End;//Macro GetAdminOper()
>> ОтветитьУ кого как... ( Vlada 22.05.2008 14:40 )
0(0)У нас, например, в системе 2 опера с админскими правами. Эта функция - на случай, если опера 9999 по каким-то причинам не окажется. Тогда ищем другого опера с админскими правами.
>> ОтветитьУ нас например каждый второй с такими правами ( LeonL 22.05.2008 14:42 )
0(0)В силу старости системы, и безалаберности предшественников.
>> ОтветитьА вот это уже сугубо Ваша, как админа, проблема :) ( Vlada 22.05.2008 14:52 )
0(0)Not specified
>> ОтветитьНесогласен, это проблема RSки и абсолютно дебильной системы доступа ( LeonL 23.05.2008 08:16 )
0(0)Not specified
>> Ответить
Какой не справедливый мир! ( Vic_Tomsk 22.05.2008 14:32 )
0(0)Not specified
>> Ответить
Это массовая обработка источник, а хочется - приемника. Или я не понял. ( Sergey 22.05.2008 12:03 )
0(0)Массовое копирование от одного многим (выбранным пользователям, выбранным группам пользователей, всем) - вот что хочется. Понятно, что с синхронизацией. Это есть в варианте Грига, который я привел как используемый.
Еще всегда хотел, но руки не доходят, до процедуры массового удаления пунктов меню, которые в силу какой-то причины, могут стать не нужными всем.
Источник - приемник: Образец меню может быть не данном каталоге баз данных, а в другом. Например, рабочий каталог -C:\Rsbank\Dbfile, а тот, откуда берем выборы меню, выборы модулей - может находиться в другом месте D:\Rsbank.tst\DBFILE. И наоборот.
Для чего полезно? - На тестовой базе выполнили обновление, все настроили, проверили. Потом выполнили обновление на рабочем и все, что нужно, с помощью Вашей программой в меню добавили (удалили).
>> ОтветитьЯсно... ( Vlada 22.05.2008 12:13 )
0(0)Про источник-приемник понятно... Во время разработки эту потребность не учла((( Будет возможность - исправлю! Массовое копирование и удаление - та же история. Пока работает только в режиме "от одного к одному"...
>> ОтветитьНе уговариваю, но мне вот от одного-многим кажется необыкновенно полезным. ( Sergey 22.05.2008 12:29 )
0(0)например - написали новый макрос, проверили, а пользоваться им будут все. Т.е. я добавил его себе в меню в нужное место, а потом из своего выбора - остальным одним нажатием какой-то клавиши (Alt+F5, Ctrl+F5 или наподобие). И им всем счастье. А особенно мне :)
>> Ответить
Удаление Пункта меню у Всех пользователей хочется ( LeonL 22.05.2008 14:41 )
0(0)Допустим Shift+F8 грохнуть данный пункт меню у все пользователей сразу.
>> ОтветитьМассового удаления у меня нет, но есть полуавтомат: (+) ( григ 22.05.2008 14:44 )
0(0)Alt_F7 - поиск макроса, меню, задаем номер опера, с которого идет поиск - если поиск удачный меню приемника синхронизируется. Удаляем что хотим. Shift_F7 - поиск продолжается.
20.03.2006
По ALT_F7 поиск оперов, имеющих такое же наименование пункта меню или такой же макрос,
подключенный к текущему пункту меню (по умолчанию макрос берется текущий с полным путем
в скобочках)
По SHIFT_F7 - продолжение поиска.
В режиме поиска по ESC - можно выйти из поиска.
При поиске перебирается все меню пользователя, независимо от названия родительских
пунктов меню.
00.00.2007
По F1 можно задать образец ФИО пользователя (часть ФИО) и выбрать из найденных вариантов
нужный.
>> Ответить
Без VCH плохо ( LeonL 26.05.2008 15:31 )
0(0)Размеры окон неменяются, а с VCH можно было бы сделать автоматическое масштабирование под размеры окна. Иначе у меня получается что работа с меню идет гдето в уголке экрана.
>> Ответить
Ошибка. (+) ( $erge 22.05.2008 16:42 )
0(0)Вроде бы удалось выявить последовательность действий которая гарантированно вываливает программу с ошибкой.
Запускаем, затем сразу ALT+F2, "Модули пользователей", выбираем модуль, заходим (Enter) и сразу жмем PgDown. Вылетает с ошибкой на всех модулях, где есть пользовательские записи и которые не попадают на первую страницу списка (то есть их сразу "не видно"), например Системный сервис и Частные вклады.
>> ОтветитьУ себя такой ошибки не наблюдаю.... ( Vlada 23.05.2008 06:18 )
0(0)Повторила последовательсность действий - если в подсистеме есть модули, "не попадающие на первую страницу" - переход на следующую; если модулей мало (все попадают на "первую страницу") - переход на последний в списке модуль. Как выглядит ошибка (строка в коде, сообщение)?
>> ОтветитьЕщё одна ошибка в блоках обработки скролинга ( karakatica 23.05.2008 08:14 )
0(0)Неправильно организован вызов встроенных процедур при обработке скролинга
Вы пишите:
if ( this.GoUp( this.item(id), id ) == 0 )
updatefields( this );
return CM_IGNORE;
elif ( this.GoUp( this.item(id), id ) == 1 )
return CM_IGNORE;
end;
написав такую структуру Вы не отдаетё себе отчёт в том, что фунция GoUp (равно как и другие аналогичные)
Вызываются у ВАС дважды !!!!
Если уж Вы хотите, чтобы оформление выглядело подобным образом
нужно писать
if ( this.GoUp( this.item(id), id ) == 0 )
updatefields( this );
return CM_IGNORE;
else //только 2 значения может принимать функция GoUp (равно как и другие аналогичные) 0 или 1
return CM_IGNORE;
end;
В Вашем случае сначала выполняется строка
if ( this.GoUp( this.item(id), id ) == 0 )
а затем
elif ( this.GoUp( this.item(id), id ) == 1 )
т. е. происходит двойной вызов функции GoUp (равно как и другие аналогичные)
Если бы в эту структуру добавили строку
elif ( this.GoUp( this.item(id), id ) == 2 ) //при наличии ещё и значения 2
то функция GoUp (равно как и другие аналогичные) будет уже выполняться трижды !!!!
>> ОтветитьНе совсем так... ( Vlada 23.05.2008 08:26 )
0(0)Согласна с тем, что дважды вызывать фунцкию не нужно, это можно сделать по другому, но тот способ, который Вы предлагаете, работать не будет (попробуйте и убедитесь), так как ИНАЧЕ в данном случае будет означать не только возврат единицы... Всю работу функции скроллинга по массиву объяснять не буду - она простая.
>> ОтветитьСогласна с тем, что дважды вызывать фунцкию не нужно, это можно сделать по другому, но тот способ, к ( karakatica 23.05.2008 09:15 )
0(0)Не работает, потому что неверно выбран алгоритм обработки скролинга.
При просмотре Вашего макроса, я обратил внимание на то, что в скролинге пользователей отсутсвует
постраничное листание (PageDown и PageUp), установка в начало списка и конец списка, а также поиск.
Сложность построения этих функций связано с тем, что при инициализации Вы потеряли 16 значений переменной
Ind (все первые 16 значений == 0) - и переменная Ind потеряла идентичность по отношению к позиции курсора в скролинге,
что существенно усложняет написание кода по поиску и по страничному листанию.
С великим трудом мне удалось сделать на вашем материале (без изменения Вашего кода) листание вперёд (PageDown).
Данная ситуация приводит, к сожаления, к написанию лишнего кода.
Вы потому и фунции вызываете дважды - по причине неверно выбранной технологии обработки скролинга....
И дело не в простоте скролинга (по вашим словам ) а в его корректности (или некорректности написания).
Можно привести массу примеров работающих кодов, написанных по неверно выбранной технологии.
Выбор же технологии - это выбор между корректно правильным и неправильным использованием написания кода, выбор между красивым и не красивым.
Если бы мне сказали, то что я Вам сказал, - я бы потрудился переписать соответсвующий код.
И не стал бы полемизировать на эту тему...
>> ОтветитьУж простите меня, неразумную, но я не вижу смысла переписывать код))) ( Vlada 23.05.2008 09:30 )
0(0)Ваше объяснение моей технологии скроллинга (точнее, его "некорректности") у меня ничего кроме недоумения не вызвало. Советую либо внимательней читать код, либо писать свои программы. За сим дискуссию по поводу того, как надо правильно строить код, прекращаю.
>> Ответить
Последовательность действий: (+) ( $erge 23.05.2008 09:33 )
0(0)Выбираю подсистему, не попадающую на 1ю страницу списка (например ЧВ), захожу внутрь списка модулей пользователя этой подсистемы (их у нас больше 16) и сразу же (выделенными в этот момент являются "точки") нажимаю PgDown(PgUp) - вылетает с ошибкой "Undefined + Integer" на строке 3579. (при этом есть нажимать стрелки вверх/вниз все работает).
Эти же действия со списком системных модулей приводят к такому же результату.
>> ОтветитьТо есть, у Вас список самих подсистем не помещается на одну страницу? ( Vlada 23.05.2008 09:39 )
0(0)Not specified
>> ОтветитьАга (-) ( $erge 23.05.2008 09:43 )
0(0)Not specified
>> ОтветитьПонятно... у меня в системе такого нет, поэтому не было возможности протестить. Спасибо, учту! ( Vlada 23.05.2008 09:50 )
0(0)Not specified
>> Ответить
Re ( rs2004 23.05.2008 12:22 )
0(0)При пустом файле itemuser.dbt макрос install ломается на 113 строчке Undefined + Integer.....
Ф-я GetLastNumber() не определена......
>> Ответитьклассный модуль - очень полезная вещь..... ( rs2004 23.05.2008 12:33 )
0(0)в одном месте собрано все....и модули и меню.......не надо прыгать по всему системному сервису....
Спасибо.....
Еще бы массовую обработку операционистов :))))))))))......
>> ОтветитьСпасибо))) Хоть один положительный отзыв... ( Vlada 23.05.2008 12:35 )
0(0)Not specified
>> ОтветитьА по моему отрицательных отзывов и небыло, наоборот все с интузиазмом используют ( LeonL 23.05.2008 13:49 )
0(0)И раз столько человек пишет значит применение нашлось, а раз нашлось применение конечно хочется чтобы было лучше совершеннее, по этому и пишем. Идея классная, реализация хорошая, код очень аккуратный логика только подкачала местами (как писалось выше женская).
>> Ответитьre ( rs2004 23.05.2008 14:11 )
0(0)да, все тут хорошо......Спасибо,Влада !!!!!
и логика, и идея, и исполнение.....
я бы, например, поленился писать инсталлятор.....
а какой кусок про бэкапирование написан !!!!!!!! тоже лениво писать...Единственное, что этими бэкапами можно зарасти.....при каждом входе они делаются.....но, это уже на усмотрение разработчика....захочет она сделать более гибко или нет......тексты в руках - каждый может под себя сам сделать....
наша задача протестировать эту программку, а не копаться в тексте программ......выявить ошибки и сказать об этом автору.....без обратной связи не может быть хороших программ.....а что касается стиля написания, то у каждого свой стиль......
>> ОтветитьУгу :))))))))))))))))))))))))))))))))))))))))))))))))))))))) ( Vlada 23.05.2008 14:16 )
0(0)Not specified
>> Ответить
Как это хоть один? А мой первый отзыв разве не положителен? ( Sergey 23.05.2008 15:17 )
0(0)Он супер положителен. И если бы мне прграмма не понравилась, я бы и не стал просить в нее добавить сервисов :)
>> Ответить
Ну да... он пытается определить последний номер модуля в выбранной подсистеме. ( Vlada 23.05.2008 12:34 )
0(0)Чтобы прописать в нужное место под нужным номером навигатор... ошибка понятна, спасибо.
>> Ответить
Если установлена 7 версия первасива, то падает с ошибкой открытия mn.def ( LeonL 23.05.2008 12:51 )
0(0)конструкции типа OnError полезны.
>> Ответить