Прежде, чем переходить к вопросам настройки меню во время выполнения, надо рассмотреть некоторые свойства и методы компонентов MainMenu и Popup-Menu, которые будут использоваться в дальнейшем изложении. При создании меню во время проектирования автоматически формируется свойство Items компонента MainMenu (или PopupMenu). Это индексированный список объектов - разделов меню, отображающий структуру меню и имеющий тип TMenuItem. Кроме того, формируются сами объекты всех разделов меню, имеющие тот же тип TMenuItem.

Тип TMenuItem имеет в свою очередь свойство Items - индексированный список объектов разделов меню того же типа TMenuItem. Таким образом, объекты типа TMenuItem могут образовывать цепочки и разветвленные деревья. Например, MainMenul.ltems[0].Caption - надпись головного раздела первого меню, построенного на основе MainMenul. Выражение MainMenul.Items[0].Items[3].Cap-tion - надпись четвертого (так как индексы начинаются с 0) раздела первого меню. Выражение MainMenul.Items[0].Items[3]. Itemsfl].Caption - надпись второго раздела подменю, относящегося к четвертому разделу первого меню.

Объект Items имеет свойство Count - число разделов. Его можно использовать для организации циклов по разделам. Например, код

for i:=0 to MainMenul.Items.Count - 1 do

ComboBoxl.Items.Add(MainMenul.Items[i].Caption);

обеспечит отображение в выпадающем списке ComboBoxl надписей всех головных разделов меню MainMenul. Код

for i:=0 to MainMenul.Items.Count - 1 do begin ComboBoxl.Items.Add(MainMenul.Items[i].Caption); for j:=0 to MainMenul.Items[i].Count - 1 do

ComboBoxl.Items.Add(MainMenul.Items[i].Caption +'->'+ MainMenul.Items[i].Items[j].Caption);
end;

обеспечит отображение в ComboBoxl надписей всех головных разделов меню и каждого раздела раскрывающегося меню в виде строк: "имя_головного_раздела -> имя_раздела".

Код

for i:=0 to MainMenul.Items.Count - 1 do begin ComboBoxl.Items.Add(MainMenul.Items[i].Caption); for j:=0 to MainMenul.Items[i].Count - 1 do begin

ComboBoxl.Items.Add(MainMenul.Items[i].Caption +'->'+ MainMenul.Items[i].Items[j].Caption); for k:=0 to MainMenul.Items[i].Items[j].Count - 1 do

ComboBoxl.Iterns.Add(MainMenul.Items[i].Caption +'->'+ MainMenul.Items[i].Items[j].Caption +

' ->
' + MainMenul.Items[i] .Items[j].Items[k] .Caption) ;
end end;

дополнительно обеспечит отображение надписей всех подменю (каскадных меню) первого уровня, если они, конечно, существуют.

Каждый объект раздела меню имеет свойство Parent типа TMenuItem - головной раздел того меню, в котором расположен данный раздел. Для объектов головных разделов Parent указывает на объект Items компонента MainMenu или PopupMenu. Свойство Menulndex объекта типа TMenuItem определяет индекс раздела в меню. Этот индекс может отличаться от видимого пользователем местоположения раздела, если в каких-то предшествующих разделах свойство Visible равно false. Изменение свойства Menulndex приводит к перемещению раздела в меню.

Наличие свойств Parent и Menulndex однозначно привязывает раздел к определенному месту в определенном меню. Поэтому надо иметь в виду, что один объект типа TMenuItem не может одновременно относиться к нескольким меню или располагаться на нескольких местах в одном меню. По той же причине невозможно методом Assign присвоить все значения свойств одного объекта типа TMenuItem другому.

Рассмотрим некоторые методы объекта типа TMenuItem. Метод Clear очищает меню, удаляя из памяти все его элементы. В отличие от этого метод Delete:

procedure Delete(Index: Integer);

удаляет раздел с индексом Index из списка Items, но не удаляет из памяти. Так что удаленный раздел может быть впоследствии снова включен в то же, или другое меню.

Метод Add, имеющий две формы:

procedure Add(Item: TMenuItem);

procedure Add(const Altems: array of TMenuItem); добавляет объект Item или массив объектов Altems в конец меню. Метод Insert:

procedure Insert(Index: Integer;
Item: TMenuItem);

вставляет объект Item в позицию, указанную индексом Index. Метод IsLine:

function IsLine: Boolean;

возвращает true, если объект является разделителем. Методы InsertNewLineAfter и InsertNewLineBefore:

function InsertNewLineAfter(Altem: TMenuItem): Integer;
function InsertNewLineBefore(Altem: TMenuItem): Integer;

вставляют разделитель после или перед элементом Altem.

Остановимся еще на двух свойствах AutoHotkeys и AutoLineReduction, присущих как компонентам MainMenu и PopUpMenu, так и объектам типа TMenuItem. Эти свойства могут иметь одно из следующих значений: ma Automatic, maManual или maParent.

Значение maAutomatic свойства AutoHotkeys обеспечивает автоматическую установку клавиш быстрого доступа (подчеркнутых символов) тех элементов меню, в которых они не заданы явно. В этом случае Delphi автоматически ищет в Caption первый символ быстрого доступа, не дублирующий установленные ранее. Если такой символ не находится, то подчеркивание не вводится. При таМа-nual установка подчеркнутого символа и проверка его уникальности возлагается на программу. При maParent поведение определяется родительским разделом меню.

Свойства AutoLineReduction указывает, исправляет ли Delphi появление в начале или конце подменю разделителей или двух разделителей подряд: maAutomatic - исправляет, maManual - исправление возлагается на программу, maParent - поведение определяется родительским разделом меню.

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


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



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

  • Февраль
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс