Создание элементов меню во время выполнения программы
Как и все компоненты коллекции VCL, пункт меню вооружен своим конструктором и деструктором. Эти методы выполняют задачи по созданию и уничтожению элемента меню:
constructorCreate(AOwner: TComponent); override;
destructorDestroy; override;
При создании нового экземпляра класса TMenuItem конструктор делает пункт меню видимым (Visible=true) и включенным (Enabled=True). В качестве владельца (AOwner) нового элемента TMenuItem следует назначать пункт меню, к которому мы рассчитываем подключить новый элемент. Операция присоединения нового пункта меню осуществляется одной из следующих функций:
procedureAdd(Item: TMenuItem); overload;
procedureAdd(constAItems: array ofTMenuItem); overload;
procedureInsert(Index: Integer; Item: TMenuItem);
Первые два метода перегружаемые и поэтому называются одинаково – Add().
Разница между ними в том, что первый добавляет только один элемент Item,
а второй способен подключить целый массив пунктов меню AItems. Если методы Add() присоединяют новые пункты меню к концу списка, то метод Insert() вставит новый пункт меню Item в позицию, определяемую параметром Index.
В качестве индексов группировки старайтесь не использовать значения 1, 3 и 5. Эти значения применяются при слиянии меню приложения и серверов OLE-объектов. Впрочем, если в приложении не планируется работа с OLE, то можно не обращать внимания на это ограничение. Подробнее о технологии OLE 2.0 мы поговорим в главе 26 «Связывание и внедрение объектов – технология OLE».
Допустим, что в нашем проекте существует некий пункт меню с именем miMenuItem. Тогда простейший пример создания нового пункта меню и присоединения его к пункту miMenuItem программным способом будет выглядеть примерно так:
procedureTForm1.miFileClick(Sender: TObject);
varmi:TMenuItem;
Begin
mi:=TMenuItem.Create(miMenuItem); //создание нового пункта меню mi
mi.Caption:='Новый пункт меню'; //назначение заголовка этому пункту
miMenuItem.Add(mi); //присоединение нового пункта меню к miMenuItem
end;
А теперь реализуем пример посложнее. Наше приложение будет создавать
три новых пункта меню и назначать им обработчики события OnClick(). Начните новый пустой проект и разместите на нем всего один компонент – главное меню. В свою очередь в главном меню определите один-единственный пункт меню с именем miMenuItem. В секции частных объявлений проекта (private) опишите процедуру NewMenuClick(). Она будет выполнять роль обработчика события OnClick() для новых пунктов меню. Сами пункты меню создаются при вызове процедуры OnCreate() главной формы проекта. Все остальное вы найдете в следующем листинге:
unitUnit1;
Interface
usesWindows, Graphics, Controls, Forms, Menus, Classes;
Type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
miMenuItem: TMenuItem;
procedureFormCreate(Sender: TObject);
Private
procedureNewMenuClick(Sender: TObject);
end;
varForm1: TForm1;
Implementation
{$R *.dfm}
procedureTForm1.FormCreate(Sender: TObject);
varAItems: array ofTMenuItem;
i:integer;
Begin
SetLength(AItems,3); //распределяем память динамического массива для 3-х элементов
AItems[0]:=TMenuItem.Create(miMenuItem); //создаем первый элемент
AItems[0].Caption:='Красный'; //назначаем ему заголовок
AItems[1]:=TMenuItem.Create(miMenuItem);
AItems[1].Caption:='Синий';
AItems[2]:=TMenuItem.Create(miMenuItem);
AItems[2].Caption:='Зеленый';
forI:=Low(AItems) toHigh(AItems) do{инициализируем созданные пункты меню}
Begin
AItems[I].Tag:=I; //пункты меню различаются значением в свойстве Tag
AItems[I].AutoCheck:=True;
AItems[I].RadioItem:=True;
AItems[I].OnClick:=NewMenuClick; //назначаем реакцию на щелчок по пункту
end;
miMenuItem.Add(AItems); //подключаем все три новых пункта меню к элементу miMenuItem AItems[0].Click; //программным образом щелкаем по пункту меню 'Красный'
end;
procedureTForm1.NewMenuClick(Sender: TObject);
Begin
{Процедура проверяет свойство Tag источника Sender и в зависимости от значения перекрашивает форму в один из трех цветов}
Дата добавления: 2016-03-15; просмотров: 786;