Разработка интегрированных прикладных программ (Меньшикова К. Г.). Разработка интегрированных прикладных программ (Меньшикова К. Г.. Методическое пособие по курсу Проектирование программного обеспечения автоматизированных систем для студентов, обучающихся по направлению Прикладная математика и информатика
Скачать 313.5 Kb.
|
2.2.Контроллер на C++Builder (позднее связывание)Приложения, управляющие серверами автоматизации, называются контроллерами автоматизации. Создадим контроллер, управляющий сервером «День недели», основываясь на информации о методах класса его объекта автоматизации. На рис. 3 представлено окно контроллера, содержащее кнопки для установки и разрыва связи с объектом, флажок видимости сервера и кнопки управления свойством Visible, а также кнопки для получения данных, метки для отображения данных в окне, поле Edit1 для ввода даты. После запуска контроллера (при нажатии кнопки Connect) запускается сервер. При нажатии кнопки Disconnect он выгружается. Кнопка SetVisible проявляет и скрывает окно сервера в зависимости от наличия флажка на компоненте CheckBox1, но и будучи невидимым, сервер продолжает выполнять свои функции. Нажатие кнопки GetVisible приводит флажок в соответствие значению свойства Visible сервера. Рис. 3 Чтобы общение с COM-объектом сервера стало возможно, в модуль следует включить строку #include Для управления сервером следует создать переменную Serv типа Variant, во время работы она будет содержать указатель на интерфейс IDispatch COM-объекта. Для создания экземпляра COM-объекта можно использовать функцию CreateOleObject из модуля ComObj библиотеки VCL: Variant Serv; Serv=CreateOleObject("Project_DayWeek.DayWeek"); Эта функция создаст IDispatch и вернет указатель на него. IDispatch дает доступ к диспетчерскому интерфейсу объекта сервера, методы которого мы хотим вызывать. Для создания объекта CreateOleObject вызывает функцию CoCreateInstance, являющуюся частью спецификации COM Windows API. Прерывание связи контроллера с сервером: if (VarType(Serv)==varDispatch) Serv=Unassigned; Выражение VarType(Serv)==varDispatch проверяет, содержит ли вариантная переменная Serv указатель на диспетчерский интерфейс. Эта проверка производится перед любым обращением к объекту сервера. Обращение к процедурам сервера осуществляет метод OleProcedure, первым параметром которого является имя метода диспетчерского интерфейса, а остальные – фактические параметры этого метода. Примеры таких вызовов: WideString s, str1, str2; int n; // Вызов метода Today: if (VarType(Serv)==varDispatch) Serv.OleProcedure("Today",&s); // Вызов метода Data_Day: str1=Edit1->Text; if (VarType(Serv)==varDispatch) Serv.OleProcedure("Data_Day",str1,&n,&str2); За работу со свойствами COM-объекта отвечают методы OlePropertyGet и OlePropertySet. Примеры работы со свойством Visible нашего сервера: // Установить значение свойства по заданию пользователя: if (VarType(Serv)==varDispatch) Serv.OlePropertySet("Visible",CheckBox1->Checked); // Запросить у сервера значение свойства: if (VarType(Serv)==varDispatch) CheckBox1->Checked=Serv.OlePropertyGet("Visible"); 2.3.Контроллер позднего связывания (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); |