Delphi - сбориник статей

         

Осуществлять вывод сообщений при помощи


Осуществлять вывод сообщений при помощи макроязыка мы уже научились, однако это не единственная возможность компонента. Так, компонент TScriptControl представляет нам возможность использования собственной объектной модели в создаваемых макросах - то есть доступ к специфическим объектам нашего приложения. Для этого в нашем приложении потребуется сначала создать объект автоматизации Automation Object (пользователи Microsoft Visual Basic могут пропустить этот раздел, так как в Visual Basic поддержка объектов автоматизации встроена изначально). Чтобы создать этот объект, при открытом приложении щелкнем на пункте меню Новый и выберем закладку ActiveX. Здесь выберем пункт Automation Object.
Далее предстоит создать интерфейс, который мы собираемся включить в объектную модель ScriptControl. Для начала просто создадим объект с единственной функцией print, которая будет выводить в компонент TlistBox, размещенный на главной форме, некоторый текст. Все существенные настройки показаны на рис. 2.
Далее обновляем информацию об объекте, щелкнув для этого на соответствующей кнопке (рис. 2), и переходим к секции реализации объекта.
Здесь уже нас поджидает созданный средой разработки шаблон, в который остается внести только некоторые исправления:
unit SimpleTest; {$WARN SYMBOL_PLATFORM OFF} interface uses ComObj, ActiveX, ScriptTest_TLB, StdVcl; type TSimpleTest = class (TAutoObject, ISimpleTest) protected procedure Print (Data: OleVariant); safecall; {Protected declarations} end; implementation uses ComServ,Main; procedure TSimpleTest.Print (Data: OleVariant); begin Main.Form1.ListBox1.Items.Add (Data); end; initialization TAutoObjectFactory.Create (ComServer, TSimpleTest, Class_SimpleTest, ciMultiInstance, tmApartment); end. Осталось один раз прогнать наше приложение вхолостую - для регистрации и проверки на наличие ошибок. Если все прошло удачно, можно приступать к дальнейшему написанию макросов.
Регистрация объекта
Как и в прошлый раз, создадим на нашей главной форме кнопку и объект ListBox1. Затем в реакцию кнопки на нажатие напишем следующий код:
procedure TForm1.Button1Click (Sender: TObject); var SC:TScriptControl; Test:ISimpleTest; begin SC:=TScriptControl.Create (Self); Test:=CoSimpleTest.Create; try SC.Language:='VBScript'; SC.AddObject ('PrintTest',Test,True); SC.ExecuteStatement ('PrintTest.Print "This is the Test"'); finally Test:=nil; SC.Free; end; end; Опять же, как и в прошлый раз, сначала создаем компонент ScriptControl, затем инициализируем интерфейс ISimpleText и добавляем его в нашу объектную модель посредством функции:
procedure AddObject (const Name: WideString; const Object_: IDispatch; AddMembers: WordBool); safecall; Где:
  • Name - название нашего компонента во внутреннем пространстве имен.
  • Object - ссылка на наш объект.
  • AddMembers - опциональный параметр, который устанавливается в True, если все члены класса Object должны быть доступны глобально, и False - в противном случае.
Следующая строка кода демонстрирует использование объекта Test при написании макроса. Как видно, в тексте макроса мы пользуемся названием, определенным при помощи параметра Name функции AddObject. Результат - на рис. 3.

Содержание раздела