Динамическая настройка меню в Delphi
Создание и настройка меню с помощью Конструктора меню выполняются при создании приложения. Кроме того, меню можно создавать или изменять динамически непосредственно при выполнении приложения. Например, возможно:
- создать новое меню любого типа или удалить его;
- заблокировать или разблокировать отдельные пункты;
- сделать пункт меню видимым или невидимым;
- добавить или удалить пункт меню;
- изменить название пункта;
- установить или убрать отметку пункта;
- изменить главное меню формы на другое;
- соединить два меню.
Эти возможности обеспечиваются установкой свойствам пунктов меню требуемых значений и вызовом соответствующих методов.
Методы Add и Insert — добавление пунктов меню
Для добавления пунктов меню используются методы Add и Insert, для удаления пунктов меню используется метод Delete.
Процедура Add(Item: TMenuItem) добавляет определяемый параметром Item элемент вконец подменю, которое вызвало этот метод. Если подменю не существовало, то оно создается.
- procedure Form1.mnuItemAddClick(Sender: TSender);
- var NewItem: TMenuItem;
- begin
- NewItem := TMenuItem.Create(Self);
- NewItem.Caption := 'Новый элемент1';
- mnuFile.Add(NewItem);
- end;
В этом примере новый пункт добавляется в конец подменю Файл. Добавляемый пункт имеет заголовок «Новый элемент». Предварительно новый пункт создается конструктором Create.
Процедура Insert(Index: Integer; Item: TMenuItem), в отличие от предыдущего метода, добавляет новый пункт меню в указанное положение. Параметр index определяет позицию в массиве элементов меню, в которую вставляется новый пункт. Если значение параметра index выходит за пределы допустимого диапазона, например, больше, чем число элементов подменю модифицируемого пункта меню, то возникает исключение.
- procedure Form1.mnuItemInsertClick (Sender: TSender);
- var NewItem: TMenuItem;
- begin
- NewItem := TMenuItem.Create(Self);
- NewItem.Caption := 'Второй элемент';
- mnuFile.Insert(2, NewItem);
- end;
Процедура добавляет новый пункт меню в подменю Файл. Новый пункт имеет заголовок «Второй элемент» и добавляется во вторую позицию (отсчет начинается с нуля).
Процедура Delete (index: integer) удаляет указанный пункт меню. Если удаляемый пункт имеет подменю, то оно также удаляется.
- procedure Form1.mnuItemDeleteClick(Sender: TSender);
- begin
- if mnuFile.Items[2].Caption = 'Второй элемент' then mnuFile.Delete(2);
- end;
Процедура удаляет пункт меню Файл. Удаляемый пункт имеет заголовок Второй элемент и находится на второй позиции. Предварительно производится проверка, действительно ли удаляется пункт с нужным названием.
Форма может иметь больше одного главного меню. Это используется, например, в случае, когда одно из них содержит заголовки на английском языке, а другое — на русском. Для реализации такой возможности в форму следует поместить два компонента MainMenu и подготовить соответствующие меню. После этого при выполнении программы можно подключить к форме любое из этих меню. Для подключения к форме главного меню используется свойство Menu формы.
- if Form1.Menu = EnglishMenu then Form1.Menu := RussianMenu else Form1.Menu := EnglishMenu;
Меню имеют имена EnglishMenu и RussianMenu. Код, выполняющий переключение меню, можно включить в соответствующий обработчик.
Напомним, что Menu является одним из свойств формы, указывающим на главное меню, которое в настоящий момент является активным.
При организации приложений, содержащих несколько взаимосвязанных форм, может возникнуть необходимость соединения (слияния) меню различных форм. Обычно это нужно для меню MainMenu главной и подчиненной форм. Для многодокументных приложений соединение меню главной и дочерней формы выполняется автоматически при создании дочерней формы. В однодокументном приложении соединение меню выполняется программно.
Метод Merge - соединения двух строчных меню
Для соединения двух строчных меню служит метод Merge. Процедура Merge (Menu: TMainMenu) соединяет меню, заданное параметром Menu, с меню, вызвавшим этот метод. Соединение меню выполняется на уровне пунктов меню, расположенных непосредственно в строке меню. Например, если первое и второе меню выглядят как File Help и File Edit View соответственно, то результирующее (полученное после соединения) меню будет представлять собой строку вида: File Edit View Help.
Свойство AutoMerge - автоматическое соединение меню
Соединение меню можно выполнить автоматически при создании форм, установив свойство AutoMerge типа Boolean в значение True для подчиненных (вторичных, или дочерних) форм. Для главной формы приложения свойство AutoMerge должно быть установлено в значение False. Поскольку в многодокументном приложении соединение выполняется автоматически, свойство AutoMerge меню всех форм должно иметь значение False.
Cвойства GroupIndex - определяет порядок пунктов меню при соединении
Порядок следования пунктов меню при соединении определяется значениями свойства GroupIndex типа Byte отдельных пунктов обоих меню. Если значения свойства GroupIndex для обоих пунктов меню равны, то пункт второго меню заменяет пункт первого меню, для которого был вызван метод Merge. Если эти значения не равны, то в объединенном меню пункт с меньшим значением размещается слева от пункта с большим значением. По умолчанию свойство GroupIndex имеет нулевое значение для всех пунктов меню.
Такое соединение двух меню обычно применяется при создании многооконных приложений. При вызове из главного окна подчиненного окна, например, окна документа в текстовом процессоре Microsoft Word, пункты меню этого окна «вливаются» в главное меню родительского окна, предоставляя пользователю дополнительные команды и возможности. После закрытия подчиненного окна «лишние» пункты меню главного окна автоматически исчезают.
Метод unMerge — разъединение соединенных меню
Для разъединения соединенных меню используется метод unMerge. Процедура unMerge (Menu: TMainMenu) разъединяет два меню, соединенных с помощью метода Merge. Параметр Menu указывает меню, которое было соединено с главным меню и которое необходимо отсоединить.