Шаг 34.
Серверы и контроллеры автоматизации. Создание коллекций объектов

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

    Во многих серверах автоматизации широко используются коллекции объектов. Их можно использовать и в собственных серверах автоматизации, например в приложениях, ориентированных на работу с документами или какими-либо иными однотипными объектами.

    Если вернуться к простейшему примеру, рассмотренному на 29 шаге, мы можем обнаружить в нем подходящий объект для создания коллекции - строки, содержащиеся в окне текстового редактора. Модифицируем его, добавив свойства Lines (коллекция строк) и LineCount (число строк, доступных только для чтения), а также методы для их считывания и метод для модификации строки с указанным номером (рисунок 1). Немодифицированное приложение можно взять здесь (нужно выбрать модуль AutoServ_TLB, а затем нажать клавишу F12).


Рис.1. Создание свойства LineCount

    Для добавления свойства LineCount, предназначенного только для чтения, следует раскрыть меню кнопки New Property на панели инструментов окна редактора библиотеки типов и выбрать команду Read Only (рисунок 1). При создании свойства, предназначенного только для чтения (или только для записи), вместо обоих методов (Get и Put) в интерфейсе будет реализован только один из них.

    После объявления свойства Lines следует изменить тип свойства на BSTR (WideString), перейти на страницу Parameters и при помощи кнопки Add добавить индексную переменную (рисунок 2).


Рис.2. Редактирование параметров метода Get_Lines для считывания свойства Lines

    После щелчка на кнопке Refresh панели инструментов методы можно реализовывать.

    Код реализации новых методов для считывания вновь введенных свойств Lines и LineCount и для модификации свойства Lines будет выглядеть следующим образом:

function TTest.Get_LineCount: Integer;
begin
  try
    Form1.LockForm;
    Result := Form1.Memo1.Lines.Count;
  finally
    Form1.UnlockForm;
  end;
end;

function TTest.Get_Lines(Index: Integer): WideString;
begin
  try
     Form1.LockForm;
     Result := Form1.Memo1.Lines[Index];
  finally
     Form1.UnlockForm;
  end;
end;

procedure TTest.Set_Lines(Index: Integer; const Value: WideString);
begin
  try
    Form1.LockForm;
    Form1.Memo1.Lines[Index] := Value;
  finally
    Form1.UnlockForm;
  end;
end;
Текст измененного сервера можно взять здесь (244,3 Кб).

    Теперь модифицируем контроллер, добавив несколько дополнительных интерфейсных элементов и несколько обработчиков связанных с ними событий (рисунок 3).


Рис.3. Модифицированный контроллер для тестирования сервера с коллекцией строк

    Обработчики событий, связанные со щелчками на кнопках Количество строк, Получить строку и Задать строку, выглядят следующим образом:

//Получить количество строк.
procedure TForm1.Button11Click(Sender: TObject);
begin
  if VarType(FServ) = varDispatch then
       Edit2.Text := IntToStr(FServ.LineCount);
end;

//Получить строку.
procedure TForm1.Button12Click(Sender: TObject);
begin
    if VarType(FServ) = varDispatch then
        Edit1.Text := FServ.Lines[StrToInt(Edit2.Text)-1];
end;

//Задать строку через коллекцию строк.
procedure TForm1.Button13Click(Sender: TObject);
begin
  if VarType(FServ) = varDispatch then
     FServ.Lines[StrToInt(Edit2.Text)-1]:= Edit1.Text;
end;
Текст измененного контроллера можно взять здесь (7,6 Кб).

    Поскольку элементы массива, реализующего коллекцию, нумеруются не с 1, а с 0, тогда как строки на экране более привычно начинать нумеровать с 1, в приведенном коде используется следующая конструкция:

    FServ.Lines[StrToInt(Edit2.Text) - 1];

    Модифицированные сервер и контроллер представлены на рисунке 4.


Рис.4. Модификация члена коллекции с помощью контроллера автоматизации

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




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