Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Меньшикова / Пособие - 5 курс / К.Г.Меньшикова -32 с.doc
Скачиваний:
15
Добавлен:
13.03.2016
Размер:
321.02 Кб
Скачать
    1. Контроллер позднего связывания (Delphi)

Код контроллера позднего связывания в Delphi будет выглядеть проще, так как в этом случае можно обращаться к методам и свойствам объектов внутри вариантных переменных. При позднем связывании может быть заранее неизвестно, существуют ли такие свойства и методы. Просто компилятор не проверяет их наличие, а воспринимает их названия как обычную символьную строку. Ошибки в этом случае проявятся лишь на этапе выполнения программы.

Для связи с сервером понадобится переменная типа Variant. Serv:Variant, а в секции uses должны присутствовать ссылки на модули Variants и ComObj.

Рассмотрим код контроллера. Установка связи и разрыв связи с сервером выполняются точно также, как и при создании контроллера в Builder C++:

if VarType(Serv)<>varDispatch then Serv:=CreateOLEObject('Project_DayWeek.DayWeek'); if VarType(Serv)=varDispatch then Serv:=Unassigned;

Операторы установки и получения значения свойства Visible сервера будут выглядеть так, как будто речь идет о свойстве обычного компонента среды Delphi:

if VarType(Serv)=varDispatch then Serv.Visible:=CheckBox1.Checked; if VarType(Serv)=varDispatch then CheckBox1.Checked:=Serv.Visible;

Для получения текущей даты и дня недели потребуется объявить переменную специального типа WideString (аналог типа BSTR):

var str:WideString; Serv.Today(str); Label1.Caption:=str;

При обращении к методу Data_Day придется объявить переменные для получения результатов (тип WideString и integer), а входную строку можно взять прямо из поля Edit1.Text:

var str:WideString; i:integer; Serv.Data_Day(Edit1.Text,i,str); Label2.Caption:=str; Label3.Caption:=IntToStr(i);

    1. Контроллер на основе библиотеки типов (Delphi)

Для того чтобы правильность обращений к серверу можно было выявить уже на этапе компиляции и не допустить внесения в код контроллера незамеченных ошибок, на стороне контроллера можно создать набор классов для управления сервером. Классы строятся на основе библиотеки типов объектов предполагаемого для использования сервера. Для этого следует:

  • выбрать команду Project | Import Type Library…;

  • в списке открывшегося диалогового окна выбрать импортируемый сервер (в нашем случае Project_DayWeek Library);

  • снять флажок Generate Component Wrapper (внесения компонента на панель компонентов не требуется);

  • нажать кнопку Create Unit для создания файла с расширением .pas, который должен быть включен в проект контроллера. Файл содержит набор классов с теми же методами и свойства, что и объект автоматизации.

После импорта библиотеки типов создать контроллер можно двумя способами (раннее и позднее связывание).

Раннее связывание (early binding) подразумевает создание в приложении-клиенте (в контроллере) таблицы виртуальных методов, аналогичной виртуальной таблице сервера. Для этого

  • в модуль клиента добавить строку: uses Project_DayWeek_TLB;

  • в секции private класса формы (TForm1) объявить:

Serv: IDayWeek;

Интерфейс IDayWeek объявлен в импортируемом модуле как наследник интерфейса IDispatch, оболочкой для него является класс CoDayWeek. Для связи с сервером необходимо обратиться к методу Create этого класса (с точки зрения программы - просто создать объект класса CoDayWeek):

if not Assigned(Serv) then Serv:=CoDayWeek.Create;

Для разрыва связи с сервером необходимо проверить наличие ссылки на объект в переменной Serv и присвоить ей значение nil. При этом Delphi проверяет наличие ссылки на интерфейс сервера и вызывает его метод Release.

if Assigned(Serv) then Serv:=nil;

Остальные операторы контроллера ничем не отличаются от случая позднего связывания (отличие только в операторе проверки наличия сервера). Однако стоит обратить внимание на одну особенность, которая осталась за рамками нашего примера. При позднем связывании (без использования библиотеки типов) в коде контроллера можно было бы поместить такой оператор:

Label1.Caption:=Serv.Visible;

Так как компилятор при этом не проверяет правильность обращения к серверу, а для обращения используются вариантные переменные, то код работоспособен (преобразование типа происходит автоматически). В случае раннего связывания (и вообще в случае использования библиотеки типов) такое присваивание невозможно.

При раннем связывании поиск методов сервера осуществляется гораздо быстрее благодаря наличию таблицы виртуальных функций. Однако если при замене сервера соответствие между таблицами будет нарушено, то контроллер перестанет работать. В случае же позднего связывания этого не произойдет (если, конечно, не будет нарушена спецификация COM-технологии, которая требует совместимости версий на уровне свойств и методов).

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

uses Project_DayWeek_TLB, ComObj;

Переменную Serv объявить как ссылку на диспетчерский интерфейс:

Serv: IDayWeekDisp;

Связаться с сервером можно так:

if not Assigned(Serv) then Serv:=CreateOLEObject ('Project_DayWeek.DayWeek') as IDayWeekDisp;

Остальной код ничем не отличается от раннего связывания.