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

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

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

   
Если вернуться к простейшему примеру, рассмотренному на 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. Модификация члена коллекции с помощью контроллера автоматизации

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий