В результате в списке LBComand оказывается полный перечень дублей объектов разделов, как уже включенных в меню, так и тех, которые можно включать в меню.

В заключение обработки события OnCreate формы FMSetup на ней создаются дубли всех головных разделов главного меню. В эти дубли пока не включаются списки разделов соответствующих меню, так как эти списки могут впоследствии изменяться в результате настройки меню пользователем. Созданные дубли включаются в список ChLBMenu.

По окончании работы приложения в момент уничтожения формы FMSetup списки LBComand и ChLBMenu очищаются, и все временные дубли разделов удаляются из памяти.

В момент, когда форма FM Setup становится видимой (в обработчике ее события OnShow) в объектах списка ChLBMenu производится формирование списков разделов Items, повторяющих структуру соответствующих разделов главной формы, но ссылающихся не на настоящие разделы меню, а на их дубли из списка LBComand. Одновременно в зависимости от того, видно или нет соответствующее меню, устанавливаются индикаторы списка ChLBMenu.

Операции, производящиеся во время работы пользователя в окне настройки меню, в особых комментариях не нуждаются. Все необходимые пояснения будут сделаны в следующем разделе при рассмотрении программной реализации.

При нажатии пользователем кнопки Закрыть окно настройки меню закрывается. При этом прежнее содержимое свойств Items головных разделов главного меню удаляется, и в эти свойства заносятся составы разделов, соответствующие сформированным дублям этих разделов. Только ссылки, конечно, делаются не на дубли, а на их оригиналы на форме Forml. Такие свойства этих оригиналов, как Caption и ShortCut (надписи и "горячие" клавиши) заменяются на те, которые установлены пользователем для дублей. В результате главное меню приводится в соответствие с установками пользователя. А при следующем открытии пользователем окна настройки меню в него в качестве начальных условий занесутся уже эти измененные характеристики меню.

Конечно, рассмотренным алгоритмом дело не ограничивается. Должен быть еще механизм запоминания проведенных пользователем настроек меню на диске, чтобы при следующем выполнении приложения эти настройки можно было прочитать и меню появилось бы в виде, который сформировал пользователь. В примере Menu это реализовано. Но рассмотрение этой части алгоритма мы отложим до разд. 8.5.

Приведенный алгоритм, реализация которого будет рассмотрена в следующем разделе, один из многих. Достоинством его является то, что он не накладывает никаких ограничений на проектирование основной формы приложения. Так что форму FMSetup, реализующую этот алгоритм, можно подключать к любому вашему приложению. Единственное ограничение - этот алгоритм не предусматривает наличия каскадных меню. Точнее, он будет работать и с каскадными меню, но реорганизовывать разделы, относящиеся к каскадным подменю, будет невозможно.

Универсальность алгоритмы вызывает, конечно, некоторое его усложнение. Можно было бы намного упростить настройку, если потребовать, например, чтобы при разработке главной формы создавался бы дубль главного меню, невидимый пользователю. Это, вообще говоря, очень легко сделать. После формирования главного меню надо перенести на форму еще один компонент MainMenu - назовем его MainMenu2. Затем надо сделать двойной щелчок на MainMenu2, в появившемся окне редактора меню щелкнуть правой кнопкой мыши и выбрать раздел Select Menu. В открывшемся диалоговом окне выбрать ранее сформированное меню MainMenul. Вы попадете в это меню MainMenu 1. Выделите в нем все головные разделы и нажмите клавиши Ctrl-C. Меню скопируется в буфер обмена. Повторите команду Select Menu, выберите меню MainMenu2 и, перейдя в это меню, нажмите клавиши Ctrl-V. Все разделы меню окажутся перенесенными в меню MainMenu2.

Можно поступить еще проще. После того как вы создали меню MainMenul, выделите этот компонент и нажмите клавиши Ctrl-C, а затем - клавиши Ctrl-V. На форме создастся копия компонента MainMenu2, повторяющая все разделы созданного меню.

Если вы согласны создавать тем или иным образом подобный дубль главного меню, то рассмотренный выше алгоритм существенно упрощается, поскольку не надо будет создавать никаких объектов, дублирующих разделы меню. А если вы добавите в это дублирующее меню разделы, связанные со всеми действиями, не отраженными в главном меню, то алгоритм еще более упростится, так как не потребуется программно создавать соответствующих объектов разделов меню.

Дополнительное упрощение алгоритма можно получить, если не разрешать пользователю отказываться от проведенной им реорганизации меню, т.е. убрать из окна рис. 8.2 кнопку Отказаться. Тогда вообще не нужны дубли меню, создаваемые программно или во время проектирования.

Тем не менее, несмотря на подобные возможности кардинального упрощения алгоритма настройки, в следующем разделе рассмотрена программная реализацию полного алгоритма. Я пошел на это, так как такая программа позволяет показать работу с очень многими свойствами и методами компонентов меню, рассмотренными ранее. А указанные упрощения этой программы, надеюсь, вы сможете без особого труда сделать сами.

8.2 Настройка меню пользователем || Оглавление || 8.2.3 Программная реализация


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Апрель
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31