На этом шаге мы рассмотрим коллекции объектов, их создание и использование.
Во многих серверах автоматизации широко используются коллекции объектов. Их можно использовать и в собственных серверах автоматизации, например в приложениях, ориентированных на работу с документами или какими-либо иными однотипными объектами.
Если вернуться к простейшему примеру, рассмотренному на 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;
Теперь модифицируем контроллер, добавив несколько дополнительных интерфейсных элементов и несколько обработчиков связанных с ними событий (рисунок 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;
Поскольку элементы массива, реализующего коллекцию, нумеруются не с 1, а с 0, тогда как строки на экране более привычно начинать нумеровать с 1, в приведенном коде используется следующая конструкция:
FServ.Lines[StrToInt(Edit2.Text) - 1];
Модифицированные сервер и контроллер представлены на рисунке 4.
Рис.4. Модификация члена коллекции с помощью контроллера автоматизации
На следующем шаге мы рассмотрим стандарты, которых принято придерживаться при создании таких серверов.