На этом шаге мы приведем общие сведения о главном меню.
В отличие от панели инструментов, главное меню и его элементы имеют несколько иные свойства, основным отличием является возможность для каждого элемента меню содержать свою коллекцию элементов. Проще говоря, каждый элемент меню может содержать подменю, элементы которого также могут содержать свое подменю. Таким образом, меню имеет древовидную структуру. В этом случае доступ к любым элементам обеспечивается посредством элементов коллекций Controls, принадлежащих индивидуально каждому элементу меню. На рисунке 1 представлен пример объектной модели меню.
Рис.1. Объектная модель главного меню
Используя коллекции Controls и методы элементов этих коллекций Execute и SetFocus, можно развернуть главное меню примерно так, как показано на рисунке 2.
Рис.2. Анализ объекта Главное меню
Из рисунка 2 понятно, что мы раскрываем подменю (дочерний набор элементов меню), используя свойства и методы родительских объектов, которым принадлежат коллекции Controls (раскрываемое подменю). Метод Execute запускает команду, связанную с данным элементом меню, а если с этим элементом связано подменю, то данная команда раскрывает его. Метод SetFocus устанавливает фокус на данный элемент меню.
Приведем полный текст приложения.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComObj, CheckLst; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; ListBox1: TListBox; Label1: TLabel; CheckBox1: TCheckBox; Button3: TButton; Button4: TButton; Label3: TLabel; Edit2: TEdit; Label4: TLabel; Label5: TLabel; Button5: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation var E: Variant; MM,MI: Variant; Kol:Integer; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); //Создание объекта Excel и его визуализация begin E:=CreateOleObject('Excel.Application'); E.Visible:=True; end; procedure TForm1.Button2Click(Sender: TObject); //Исследовать главное меню var i:integer; S:string; begin if Kol=0 then begin MM:=E.CommandBars.Item['WorkSheet Menu bar']; Kol:=Kol+1; end else MM:=MI; ListBox1.Clear; for i:=1 to MM.Controls.Count do begin S:=MM.Controls.Item[i].Caption+' = '+ MM.Controls.Item[i].TooltipText; ListBox1.Items.Add(S); end; MI:=MM.Controls.Item[1]; end; procedure TForm1.Button4Click(Sender: TObject); //Выполнение действия begin MI.Execute; end; procedure TForm1.Button3Click(Sender: TObject); //Показать begin MI.SetFocus; end; procedure TForm1.ListBox1Click(Sender: TObject); //Запомнить выбранный элемент и вывести его свойства begin MI:=MM.Controls.Item[ListBox1.ItemIndex+1]; CheckBox1.Checked:=MI.Visible; Edit2.Text:=MI.DescriptionText; Memo1.Lines.Text:=MI.HelpFile+' |'+IntToStr(MI.HelpContextID)+'|'; end; procedure TForm1.CheckBox1Click(Sender: TObject); //Видимость/невидимость элемента управления begin MI.Visible:=CheckBox1.Checked; end; procedure TForm1.FormCreate(Sender: TObject); //Количество обращений к форме begin Kol:=0; end; procedure TForm1.Button5Click(Sender: TObject); //Кнопка "Открыть" begin Button2Click(Self); end; end.
От исследования существующих элементов меню и элементов управления на обычных панелях перейдем к созданию собственных элементов управления.
На следующем шаге мы рассмотрим создание пользовательского элемента управления.