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

    На этом шаге мы рассмотрим изменение местоположения панелей.

    Отметим некоторые особенности расположения панелей в главном окне приложения Excel. He каждая панель может принимать все возможные положения, для некоторых панелей допустимы только определенные положения, а остальные являются недопустимыми. Для того чтобы выяснить, можно или нельзя изменить положение панели, достаточно проанализировать значение свойства Туре элемента коллекции CommandBars. Если значение этого свойства равно msoBarTypeNormal (0), то панель может быть расположена в центральной части главного окна (как обычное окно) или пристыкована к одной из сторон главного окна (кроме некоторых панелей, например, Цвет заливки). Если свойство Туре имеет другое значение, то расположить панель можно только определенным образом.

    Панель Цвет заливки может находиться только в виде дочернего окна в главном окне приложения (ее нельзя пристыковать к одной из сторон главного окна). При попытке изменить положение этой панели мы получим ошибку выполнения, при этом панель останется на своем месте. В таких случаях желательно обрабатывать ошибку с выводом сообщения пользователю, используя программные скобки try ... except, либо проверять свойство Туре и затем изменять позицию панели. В следующем примере используется второй способ.

var
  CommandBar:Variant;
.   .   .   .   .
CommandBar:=CommandBars.Item[CheckListBox1.ItemIndex+1]; 
if CommandBar.Type=msoBarTypeNormal then
   CommandBar.Position:=Position.ItemIndex;

    В случае, когда панель не может быть размещена вдоль какой-либо стороны главного окна (представляет собой дочернее окно), положение панели определяется только ее координатами. Для изменения координат используем свойства Left и Тор.

procedure TForm1.Button4Click(Sender: TObject);
//Перемещение влево на 10 точек
begin
  E.CommandBars.Item[CheckListBox1.ItemIndex+1].Left:=
    E.CommandBars.Item[CheckListBox1.ItemIndex+1].Left-10;
end;

procedure TForm1.Button5Click(Sender: TObject);
//Перемещение вправо на 10 точек
begin
  E.CommandBars.Item[CheckListBox1.ItemIndex+1].Left:=
    E.CommandBars.Item[CheckListBox1.ItemIndex+1].Left+10;
end;

procedure TForm1.Button6Click(Sender: TObject);
//Перемещение вверх на 10 точек
begin
  E.CommandBars.Item[CheckListBox1.ItemIndex+1].Top:=
    E.CommandBars.Item[CheckListBox1.ItemIndex+1].Top-10;
end;

procedure TForm1.Button7Click(Sender: TObject);
//Перемещение вниз на 10 точек
begin
  E.CommandBars.Item[CheckListBox1.ItemIndex+1].Top:=
    E.CommandBars.Item[CheckListBox1.ItemIndex+1].Top+10;
end;

    Используя представленные процедуры, мы сможем перемещать панель в любое место окна (рисунки 1-3).


Рис.1. Начальное положение панели Стандартная


Рис.2. Панель Стандартная после перемещения вправо


Рис.3. Внешний вид приложения

    Иногда требуется запретить или огрничить доступ пользователя к той или иной панели. Ограничение доступа к панели может быть как полным, так и частичным. Например, нужно заблокировать для пользователя возможность перемещения панели. Для этих целей используем свойство Protection (тип Integer), при этом способ блокировки определяется значением этого свойства и задается определенными константами или их комбинациями.

    Рассмотрим еще одно свойство панели, позволяющее активировать/деактивировать панель в главном окне приложения Excel. Свойство Enabled панелей имеет тип Boolean и определяет возможность доступа пользователя к ним. Когда свойство Enabled имеет значение False, пользователь не может пользоваться данной панелью (она вообще не отображается). Если изменить значение этого поля и установить его в True, то панель будет доступна и займет свое прежнее место в главном окне приложения Excel.

    Этими свойствами удобно пользоваться, чтобы блокировать доступ пользователя к некоторым элементам управления. Рассмотрим следующую процедуру.

procedure TForm1.CheckBox1Click(Sender: TObject);
//Отключение отображения панелей управления
Var
  i:Integer;
begin
  for i:=1 to E.CommandBars.Count do
    E.CommandBars.Item[i].Enabled:=CheckBox1.Checked;
end;

    Данная процедура, перебирая все элементы коллекции CommandBars, устанавливает их свойства Enabled либо в значение True, либо в значение False. Воспользуемся ею и установим для всех панелей свойство Enabled в значение False. Результат представлен на рисунке 4.


Рис.4. Отключаем отображение панелей управления

    Приведем полный текст приложения.

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;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ComboBox1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure CheckListBox1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure CheckBox1Click(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;

procedure TForm1.Button4Click(Sender: TObject);
//Перемещение влево на 10 точек
begin
  E.CommandBars.Item[CheckListBox1.ItemIndex+1].Left:=
    E.CommandBars.Item[CheckListBox1.ItemIndex+1].Left-10;
end;

procedure TForm1.Button5Click(Sender: TObject);
//Перемещение вправо на 10 точек
begin
  E.CommandBars.Item[CheckListBox1.ItemIndex+1].Left:=
    E.CommandBars.Item[CheckListBox1.ItemIndex+1].Left+10;
end;

procedure TForm1.Button6Click(Sender: TObject);
//Перемещение вверх на 10 точек
begin
  E.CommandBars.Item[CheckListBox1.ItemIndex+1].Top:=
    E.CommandBars.Item[CheckListBox1.ItemIndex+1].Top-10;
end;

procedure TForm1.Button7Click(Sender: TObject);
//Перемещение вниз на 10 точек
begin
  E.CommandBars.Item[CheckListBox1.ItemIndex+1].Top:=
    E.CommandBars.Item[CheckListBox1.ItemIndex+1].Top+10;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
//Отключение отображения панелей управления
Var
  i:Integer;
begin
  for i:=1 to E.CommandBars.Count do
    E.CommandBars.Item[i].Enabled:=CheckBox1.Checked;
end;

end.
Текст этого приложения можно взять здесь (8,3 Кб).

    Мы рассмотрели некоторые свойства встроенных панелей приложения MS Excel. Есть возможность программно создавать и удалять пользовательские панели и меню. Работа со встроенными панелями и меню имеет некоторые особенности, например их нельзя удалить.

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




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