Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций РСОИ.doc
Скачиваний:
20
Добавлен:
04.11.2018
Размер:
1.93 Mб
Скачать

2.9.4. Створення клієнта автоматизації

Розглянемо процес розробки клієнтського застосунка, який буде автоматизувати серверний застосунок – носій СОМ-об’єкту.

У більшості випадків, коли бажано використовувати сервер автоматизації, у вас немає програмного коду інтерфейсів цього сервера. Розглянемо, як імпортувати бібліотеку типів у середовище Delphi і в такий спосіб автоматично відтворити необхідний програмний код.

Створіть у Delphi новий проект (application). Активізуйте діалогове вікно імпорту бібліотеки типів (в меню Project  Import Type Library). У списку знайдіть рядок MemoSrv (Version 1,0). Якщо необхідної бібліотеки у списку не виявиться, натисніть на кнопку Add, і виділіть файл MemoSrv.ехе в тім каталозі, де він розміщений на вашому комп'ютері.

Виділіть у списку рядок MemoSrv (Version 1.0) і натисніть на кнопку ОК. Delphi сформує бібліотеку під ім'ям MemoSrv_TLB.pas для сервера автоматизації MemoSrv. За замовчуванням файл буде вміщений у каталог Imports. Якщо на комп'ютері середовище Delphi установлене з параметрами, запропонованими за замовчуванням, повне ім'я каталогу буде C:\Program Files\Borland\Delphi\Imports. Тут Delphi відповідає номеру версії Delphi (Delphi6, Delphi7 тощо). У лістингу наведена частина програмного коду імпортованої бібліотеки типів MemoSrv_TLB.

unit MemoSrv;

interface

uses Windows, ActiveX, Classes, Graphics, OleCtrls, StdVCL;

//GUIDS declared in the TypeLibrary. Following prefixes are used:

//Type Libraries : LIBID XXXX

//CoClasses : CLASS xxxx

//DISPInterfaces : DIID XXXX

//Non-DISP interfaces: IID XXXX

const

LIBID MemoSrv:TGUID='{A1E420C7-F75F-11D2-B3B9-0040F67455FE}';

IID IMemoIntf:TGUID='{A1E420C8-F75F-11D2-B3B9-0040F67455FE}';

CLASS_MemoIntf:TGUID='{A1E420CA-F75F-11D2-B3B9-0040F67455FE}';

type

// Оголошення інтерфейсів, визначених у бібліотеці типів

IMemoIntf = interface;

IMemoIntfDisp = dispinterface;

//Оголошення сполучених класів, визначених у бібліотеці типів

MemoIntf = IMemoIntf;

IMemoIntf = interface(IDispatch);

['{A1E42QC8-F75F-11D2-B3B9-0040F67455FE}']

function Get_Color: OLE_COLOR; safecall;

procedure Set_Color(Value: OLE_COLOR); safecall;

function Get_Font: IFontDisp; safecall;

procedure Set_Font(const Value: IFontDisp); safecall;

function Get_Text: IStrings; safecall;

procedure Set_Text(const Value: IStrings); safecall;

property Color: OLE_COLOR read Get_Color write Set_Color;

property Font: IFontDisp read Get_Font write Set_Font;

property Text: IStrings read Get_Text write Set_Text;

end;

// DispIntf: ImemoIntDisp

// Flags: (4416) Dual OleAutomation

// GUID: {A1E420C8-F75F-11D2-B3B9-0040F67455FE}

IMemoIntfDisp = dispinterface

['{A1E420C8-F75F-11D2-B3B9-0040F67455FE}']

property Color: OLE_COLOR dispid 2;

property Font: IFontDisp dispid 1;

property Text: IStrings dispid 3;

end;

CoMemoIntf = class

class function Create: IMemoIntf;

class function CreateRemote (const MachineName: string): IMemoIntf;

end;

implementation

uses ComObj;

...

end.

Додайте ім'я файлу MemoSrv_TLB.pas у директиву uses модуля головної форми застосунка і скомпілюйте його, щоб переконатися, що Delphi знаходить імпортований модуль.

Розглянемо фрагменти програми, що відповідальні за взаємодію із сервером автоматизації.

procedure TForm1.btnConnectClick(sender: TObject);

begin

FMemo := CoMemoIntf.Create;

end;

procedure TForm1.btnDisconnectClick(sender: TObject);

begin

FMemo := nil;

end;

Додамо також у головну форму три кнопки для керування шрифтом, кольором і текстом. Як підкреслювалося раніше, Delphi забезпечує підтримку маршалінгу типів даних, що містять шрифти, списки рядків і зображення. Відповідні фрагменти програми виглядають тривіально.

procedure TForm1.btnSetFontClick(Sender: TObject);

var FontDisp: IFontDisp;

begin

if FontDialog1.Execute then

begin

Memo1.Font.Assign(FontDialog1.Font);

GetOleFont(FontDialog1.Font, FontDisp);

FMemo.Set_Font(FontDisp);

end;

end;

Повний текст програми клієнтського застосунка MemoCli:

unit MainForm;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MemoSrv_TLB;

type

TForm1 = class(TForm)

btnSetColor: TButton;

btnConnect: TButton;

btnSetFont: TButton;

btnSetText: TButton;

btnGetColor: TButton;

btnGetFont: TButton;

btnGetText: TButton;

Memo1: TMemo;

FontDialogls: TFontDialog;

ColorDialogl: TColorDialog;

procedure btnConnectClick(Sender: TObject);

procedure btnDisconnectClick(Sender: TObject);

procedure btnSetColorClick(Sender: TObject);

procedure btnSetFontClick(Sender: TObject);

procedure btnSetTextClick(Sender: TObject);

procedure btnGetColorClick(Sender: TObject);

procedure btnGetFontClick(Sender: TObject);

procedure btnGetTextClick(Sender: TObject);

private

{ Оголошення закритих членів}

FMemo: IMemoIntf;

public

{ Оголошення загальнодоступних членів }

end;

var

Form1: TForm1;

implementation

uses ActiveX, AXCtrls, StdVCL;

{$R *,DFM}

procedure TForm1.btnConnectClick(Sender: TObject);

begin

FMemo := CoMemoIntf.Create;

end;

procedure TForm1.btnDisconnectClick{Sender; TObject);

begin

FMemo := nil;

end;

procedure TForm1.btnSetColorClick(Sender; TObject);

begin

if ColorDialog1.Execute then

begin

Memo1.Color := ColorDialog1.Color;

FMemo.Set_Color(ColorToRGB(ColorDialog1.Color));

end;

end;

procedure TForm1.btnSetFontClick(Sender: TObject);

var

FontDisp: IFontDisp;

begin

if FontDialog1.Execute then

begin

Memo1.Font.Assign(FontDialog1.Font);

GetOleFont(FontDialog1.Font,FontDisp);

Fmemo.Set_Font(FontDisp);

end;

end;

procedure TForm1.btnSetTextClick(Sender: TObject);

var

Strings: IStrings;

begin

GetOleStrings(Memo1.Lines, Strings);

FMemo.Set_Fext(Strings);

end;

procedure TForm1.BtnGetColorClick(Sender: TObject);

begin

Memol.Color := FMemo.Get_Color;

end;

procedure TForm1.btnGetFontClick(Sender: TObject);

var

FontDisp: IFontDisp;

begin

FontDisp :=FMemo.Get Font;

SetOleFont(Memo1.Font, FontDisp);

end;

procedure TForm1.btnGetTextClick(Sender: TObject);

var

Strings: IStrings;

begin

Strings := FMemo.Get_Text;

SetOleStrings(Memo1.Lines, Strings);

end;

end.

Отже, основні операції, що знадобилися нам для створення клієнта автоматизації:

  • створити новий проект (application);

  • імпортувати бібліотеку типів сервера автоматизації;

  • звернутися до СОМ-об’єкту і отримати вказівник на інтерфейс;

  • сформувати методи для викликання функцій сервера.

Контрольні запитання та завдання:

  1. Як працює зовнішній сервер автоматизації?

  2. Дайте опис засобів створення зовнішнього сервера автоматизації та методів інтерфейсу автоматизації.

  3. Наведіть опис побудови клієнта зовнішнього сервера.

  4. В чому полягає проблема маршалінгу і як вона вирішується?

  5. Яким чином Delphi забезпечує підтримку маршалінгу типів даних, що містять шрифти, списки рядків і зображення?