Шаг 209.
Автоматизация Microsoft Excel. Программирование свойств MS Excel.
Элементы коллекции CommandBars (продолжение)

    На этом шаге мы рассмотрим использование других элементов этой коллекции.

    Рассмотрим свойства коллекции, отображающие состояние элементов управления, - 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.

Таблица 1. Возможные положения панели
Константа Значение Описание
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.
Текст этого приложения можно взять здесь (7,1 Кб).

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг