На этом шаге мы рассмотрим использование других элементов этой коллекции.
Рассмотрим свойства коллекции, отображающие состояние элементов управления, - ActionControl и ActiveMenuBar. Они являются ссылками на объекты-элементы коллекции и позволяют определить, какой элемент панели активен (т. е. какая кнопка запустила на выполнение команду) и какая панель, содержащая меню, активна в настоящее время. Далее представлен исходный текст процедуры, которая возвращает и отображает имя панели, на которой размещено активное меню.
procedure TForm1.Button2Click(Sender: TObject); //Получение названия активного меню var S:String; begin S:=E.CommandBars.ActiveMenuBar.Name; MessageBox(handle,PChar(S),'', 0); end;
Коллекция CommandBars также включает в себя список панелей управления, доступ к которым осуществляется с помощью метода Item(i), где i - индекс или имя панели. Этот метод возвращает ссылку на элемент коллекции.
Получим список всех элементов коллекции CommandBars. Для этого, используя свойство Count коллекции и свойство Name элемента коллекции, загрузим список элементов в объект типа TCheckListBox (список с флажками). Свойство Name имеет строковый тип и представляет собой имя элемента. Его можно использовать для доступа к любому элементу коллекции так же, как индекс, имеющий числовой тип. Рассмотрим следующую процедуру.
procedure TForm1.Button3Click(Sender: TObject); //Получение списка панелей var i:Integer; S:String; begin for i:=1 to E.CommandBars.Count do begin S:=E.CommandBars.Item[i].Name+' = '+E.CommandBars.Item[i].NameLocal; CheckListBox1.Items.Add (S); CheckListBox1.Checked[i-1]:=E.CommandBars.Item[i].Visible; end; end;
Данная процедура, последовательно перебирая все элементы коллекции, загружает их имена в объект CheckListBox1.
После этого можно загрузить значения двух свойств элемента коллекции:
Далее, после загрузки, перемещаясь по списку имен загруженных в CheckListBox1 элементов, можно получить и изменить значения некоторых свойств выбранной панели. Можно использовать и другие свойства, например Position, Left, Top, Width, Height:Integer (положение и размеры панели) и RowIndex:Integer (номер строки, которую занимает панель, когда панели собраны в какой-либо части главного окна). Если панель содержит кнопки или другие элементы управления, то свойство BuiltIn: Boolean находится в состоянии True, иначе - в состоянии False. Context:String - свойство панели, которое содержит строку со ссылкой на файл шаблона. Свойство Protection:Integer определяет режим зашиты панели от изменений со стороны пользователя.
Рассмотрим исходный текст процедуры, позволяющей скрывать/отображать выбранные панели с помощью свойства Visible панели.
procedure TForm1.CheckListBox1Click(Sender: TObject); //Выбор панели элементов управления и задание ее отображения begin try E.CommandBars.Item[CheckListBox1.ItemIndex+1].Visible:= CheckListBox1.Checked[CheckListBox1.ItemIndex]; except CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not CheckListBox1.Checked[CheckListBox1.ItemIndex]; MessageBox(handle,'Ошибка изменения свойства Visible!','Внимание!',0); end; end;
Обработка исключительных ситуаций позволяет управлять значением свойства Checked в случаях возникновения ошибок. На рисунке 1 представлена форма, которая отображает список элементов коллекции CommandBars главного окна приложения Excel и позволяет изменять положение панелей управления, выбранных в списке.
Для управления положением панели предназначено свойство Position. Оно имеет тип Integer, может принимать одно из нескольких значений констант и определяет положение панели в главном окне редактора Excel. Панели могут располагаться вдоль верхней, нижней, левой или правой стороны этого окна, а также в центральной части окна. В таблице 1 представлены константы, соответствующие различным положениям панели в главном окне Excel.
Константа | Значение | Описание |
---|---|---|
msoBarFloating | 4 | Отдельная панель в центральной части главного окна |
msoBarBottom | 3 | Панель с кнопками, расположенная вдоль нижней стороны главного окна |
msoBarLeft | 0 | Панель с кнопками, расположенная вдоль левой стороны главного окна |
msoBarMenuBar | 6 | Меню |
msoBarPopup | 5 | Всплывающее меню |
msoBarRight | 2 | Панель с кнопками, расположенная вдоль правой стороны главного окна |
msoBarTop | 1 | Панель с кнопками, расположенная вдоль верхней стороны главного окна |
Для изменения положения панели достаточно в свойство Position записать то или иное значение, указанное в таблице 1, например, с помощью следующей процедуры.
procedure TForm1.ComboBox1Click(Sender: TObject); //Изменение положения панели begin try E.CommandBars.Item[CheckListBox1.ItemIndex+1].Position:= ComboBox1.ItemIndex; except ComboBox1.ItemIndex:= E.CommandBars.Item[CheckListBox1.ItemIndex+1].Position; end; end;
Обратите внимание на то, что в этой процедуре используется обработка исключительной ситуации. Это необходимо в тех случаях, когда положение панели не может быть изменено. В таких случаях состояние объекта Position будет восстановлено в первоначальное состояние. Используя эту процедуру, изменим, положение панели Стандартная и поместим ее вдоль левой стороны главного окна (рисунок 1).
Рис.1. Изменение положения панели Стандартная
Приведем полный текст приложения.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComObj, CheckLst; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; CheckListBox1: TCheckListBox; Button2: TButton; Label2: TLabel; ComboBox1: TComboBox; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ComboBox1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure CheckListBox1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var E:variant; procedure TForm1.Button1Click(Sender: TObject); //Создание объекта Excel и отображение окна begin E:=CreateOleObject('Excel.Application'); E.Visible:=True; end; procedure TForm1.Button2Click(Sender: TObject); //Получение названия активного меню var S:String; begin S:=E.CommandBars.ActiveMenuBar.Name; MessageBox(handle,PChar(S),'', 0); end; procedure TForm1.ComboBox1Click(Sender: TObject); //Изменение положения панели begin try E.CommandBars.Item[CheckListBox1.ItemIndex+1].Position:= ComboBox1.ItemIndex; except ComboBox1.ItemIndex:= E.CommandBars.Item[CheckListBox1.ItemIndex+1].Position; end; end; procedure TForm1.Button3Click(Sender: TObject); //Получение списка панелей var i:Integer; S:String; begin for i:=1 to E.CommandBars.Count do begin S:=E.CommandBars.Item[i].Name+' = '+E.CommandBars.Item[i].NameLocal; CheckListBox1.Items.Add (S); CheckListBox1.Checked[i-1]:=E.CommandBars.Item[i].Visible; end; end; procedure TForm1.CheckListBox1Click(Sender: TObject); //Выбор панели элементов управления и задание ее отображения begin try E.CommandBars.Item[CheckListBox1.ItemIndex+1].Visible:= CheckListBox1.Checked[CheckListBox1.ItemIndex]; except CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not CheckListBox1.Checked[CheckListBox1.ItemIndex]; MessageBox(handle,'Ошибка изменения свойства Visible!','Внимание!',0); end; end; end.
На следующем шаге мы закончим изучение этого вопроса.