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

3. Формування бібліотеки типів

Клацніть на кнопці Refresh Implementation (Оновити реалізацію) панелі інструментів Турe Library Editor і закрийте редактор бібліотек типів. Зміст файла бібліотеки типів EventSrv_TLB.pas, що автоматично сформує Delphi, подано в лістингу.

//Застосунок EventSrv, файл EventSrv_TLB.pas

unit EventSrv_TLB;

interface

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

// GUID, об’явлені у бібліотеці типів. //

// Використовуються наступні префікси: //

// Бібліотеки типів : LIBID_xxxx //

// Сполучені класи : CLASS хххх //

// Інтерфейси диспетчерування : DIID хххх //

// Інші інтерфейси : IID_xxxx //

const

LIBID_EventSrv:TGUID='{34FB8111-476E-11D3-B83E-G040F67455FE}';

IID_IEventIntf:TGUID='{34FB8112-476E-11D3-BB3E-0040F67455FE}';

DIID_IEventIntfEvents:TGUID='{34FB8114-476E-11D3-B83E-0040F67455FE}'

CLASS EventIntf:TGUID='{34FB8116-476E-11D3-B83E-0040F67455FE}';

type

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

IEventIntf = interface;

IEventIntfDisp = dispinterface;

IEventIntfEvents = dispinterface;

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

EventIntf = IEventIntf;

// Об’явлення інтерфейсів

// Базовий інтерфейс

// Interface: ІEvеntIntf;

// Flags: (4416) Dual OleAutomation Dispatchable

IEventIntf = interface(IDispatch)

['{34FBB112-476E-UD3-B83E-0040F67455FE}']

procedure SendText(const Text: WideString); safecall;

end;

// Диспетчерський інтерфейс

// DispIntf: ІЕvеntIntfDіsр

// Flags: (4416) Dual OleAutomation Dispatchable

IEventIntfDisp = dispinterface

['{34FBB112-476E-UD3-B83E-0040F67455FE}']

procedure SendText(const Text: WideString); dispid 1;

end;

// Інтерфейс диспетчерування

// DispIntf: ІЕvеntІntfЕvеnts

// Flags: (0)

IEventIntfEvents = dispinterface

['{34FBB112-476E-UD3-B83E-0040F67455FE}']

procedure OnText(const Text: WideString); dispid 3;

end;

CoEventIntf=class

Class function Create:IEventIntf;

Class function CreateRemote(const MachineName:string): IEventIntf;

end;

implementation

uses ComObj;

class function CoEventIntf.Create:IEventIntf;

begin

Result := CreateComObject(Class_EventIntf) as EventIntf;

end;

class function CoEventIntf.CreateRemote(const MachineName:string): IEventIntf;

begin

Result := CreateRemoteComObject(MachineName, CLASS_EventIntf) as IEventIntf;

end;

end.

Збережіть файл під ім’ям EventIntf.pas.

4. Формування методів

Тепер нам залишається тільки наповнити змістом оболонку методу SendText:

procedure TEventIntf.SendText(const Text: WideString);

begin

FEvents.OnText(Text);

end;

5. Реєстрація сервера

Скомпілюйте цю програму-сервер і зареєструйте звичайним способом.

2.10.2. Створення клієнтського застосунка

Спочатку закрийте усі відкриті проекти (FileClose all) у Delphi, а потім виберіть у головному меню ProjectImport Type Library.

На екрані з'явиться діалогове вікно Import Type Library.

Зверніть увагу на те, що в діалоговому вікні Import Type Library з'явився додатковий прапорець Generate Component Wrapper (формувати компонент оболонки). У списку виберіть EventSrv Library (Ver 1.0), а в полі зі списком Palette Page виберіть бажану панель компонентів, наприклад ActiveХ. Перевірте, щоб прапорець Generate Component Wrapper був встановлений. Після цього клацніть на кнопці Install. У відповідь Delphi запросить у вас ім'я пакета, у який потрібно встановити компонент. Можна прийняти запропоноване за замовчуванням ім’я і клацнути на кнопці ОК. Підтвердіть формування (чи відновлення) пакета, якщо Delphi виведе на екран вікно підтвердження. Після завершення процесу Delphi виведе повідомлення про те, що компонент успішно встановлений у відповідний розділ палітри.

Важливо! Пакет, в який встановлено компонент, необхідно скомпілювати і зберегти перш ніж починати працювати з компонентом, інакше компонент може некоректно працювати.

Створіть новий проект (application) і перетягніть в його головну екранну форму компонент TEventIntf з того розділу палітри, у який він був поміщений хвилиною раніше. У компонента TEventIntf є три важливих властивості.

1. Властивість AutoConnect визначає, чи передбачає застосунок почати спробу автоматично підключитися до сервера відразу після запуску. Якщо цій властивості присвоєно значення False, то для підключення до сервера треба викликати EventIntf.Connect. У цьому випадку встановіть значення властивості AutoConnect = True.

2. Властивість ConnectKind визначає, як компонент буде підключатися до сервера. Властивість ConnectKind може мати такі значення:

ckAttachToInterface – цей тип підключення відноситься до найбільш складних випадків і зараз не розглядається;

ckNewInstance – при спробі підключення клієнтський застосунок завжди створює новий екземпляр сервера;

ckRemote – застосунок-сервер виконується на іншому комп'ютері; цей тип підключення буде розглянутий пізніше;

ckRunningInstance – клієнтський застосунок підключається тільки до раніше запущеного на виконання екземпляру сервера;

ckRunningOrNew – клієнтський застосунок починає спробу підключитися до раніше запущеного на виконання екземпляру сервера; якщо ж такого не виявиться, то клієнтський застосунок запускає на виконання новий екземпляр сервера.

Для застосунка, який розробляється, присвойте цій властивості значення ckRunningOrNew.

3. Властивість RemoteMachineName використовується при підключенні до віддаленого сервера.

Компонент TEventIntf також експортує одну подію OnText. Вона відповідає однойменній події, яку ми додали до інтерфейсу диспетчирування IEventIntfEvents.

Програмний код цього клієнтського застосунка подано у наступному лістингу.

unit MainForm;

interface

uses

Windows, Messages, ..., OleServer, EventSrv_TLB;

type

TForm1 = class(TForm)

EventIntf1: TEventIntf;

Panel1: TPanel; Panel2: TPanel;

Memo1: TMemo;

Edit1: TEdit;

Button1: TButton;

procedure Button1Click(Sender; TObject);

procedure EventIntfText(Sender: TObject; var Text: OleVariant);

private

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

public

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

end;

var Form1: TForm1;

implementation

{$R *.dfm}

...

end.

Виконання клієнтського застосунка. Після запуску клієнтського застосунка на екрані з'явиться вікно, зображене на рис. 2.8.

Застосунок EventCli дозволяє пересилати текст іншим підключеним клієнтам.