Осуществлять вывод сообщений при помощи
Осуществлять вывод сообщений при помощи макроязыка мы уже научились, однако это не единственная возможность компонента. Так, компонент 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.