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

2.9.2. Виконання маршалінгу з рядками, шрифтами і зображеннями

Delphi підтримує маршалінг типів даних, що описують списки рядків, шрифти і графічні зображення, а саме інтерфейсів IPicture, IStrings і IFontDisp. Це дуже корисне нововведення, оскільки Delphi інтенсивно використовує ці типи в бібліотеці візуальних компонентів VCL. Оголошення інтерфейсу ІStrings наведені у файлі stdvcl.pas. Інтерфейси IFontDisp і IPicture оголошені у файлі activex.pas.

Для виконання маршалінгу вказаних типів корисно використовувати спеціальні функції Delphi, описані нижче.

П роцедура "перетворює" об'єкт класу TFont в інтерфейс IFontDisp, маршалінг якого забезпечує технологія автоматизації.

З воротна до неї процедура, що копіює значення властивостей, переданих через змінну OleFont, у відповідні властивості об’єкту Font типу TFont.

П роцедура створює інтерфейс IStrings з об’єкту класу TStrings.

З воротна до неї процедура, що встановлює значення властивостей об’єкту Strings типу TStrings відповідно до наповнення параметру OleString.

П роцедура створює інтерфейс IPicture з об’єкту класу TPicture.

Зворотна до GetOlePicture процедура.

2.9.3. Перетворення наявного застосунка в сом-сервер автоматизації

Наявний застосунок часто буває бажано оснастити можливістю роботи з механізмом автоматизації, тобто перетворити його на сервер автоматизації. Наприклад, існує розроблений раніше застосунок для оформлення замовлень, який, крім іншого, дозволяє в режимі on-line переглядати ціни на біржі. Якщо додати до нього можливість взаємодіяти з механізмом автоматизації (створити на його основі сервер автоматизації), то пізніше можна розробити клієнтський застосунок, який звертається до сервера для отримання даних про ціни на біржі з визначеним інтервалом часу.

Зауваження. Більшість зовнішніх серверів автоматизації є закінченими автономними застосунками. Найпоширеніший приклад такого сервера — Microsoft Word. Сама собою програма Microsoft Word досить складна, але вона ще й може надати свої послуги застосункам-клієнтам, виступаючи стосовно них як сервер автоматизації.

Розглянемо на конкретному прикладі, як додати можливість роботи з механізмом автоматизації до наявного застосунку. Як такий, буде виступати проста програма, в екранній формі якої розміщуються дві кнопки і табло повідомлень. Активізація однієї кнопки змінює шрифт, яким виводиться текст у вікні повідомлень, а іншої — його колір (рис. 2.7). Звичайно, вразити когось такими можливостями навряд чи можна, але для демонстрації використання інтерфейсів автоматизації для роботи зі шрифтами, рядками та картинками цього цілком достатньо.

Припустимо, вказані можливості, реалізовані у застосунку MemoSrv з таким текстом модуля.

Unit MainForm;

Uses ...Type ... Var ...

implementation

procedure TForm1.Button1Click(Sender:TObject)

begin

//встановлення шрифта

if FontDialog1.Execute then

Memo1.Font.Assign(FontDialog1.Font);

end;

procedure TForm1.btnColorClick(Sender: TObject);

begin

// встановлення кольору

if ColorDialog1. Execute then

Memo1.Color := ColorDialog1.Color;

end;

end.

Додавання СОМ-об’єкту автоматизації. Проаналізуємо, що потрібно додати в застосунок, щоб наділити його функціями сервера автоматизації.

Одне з найважливіших питань при додаванні автоматизації в наявний застосунок — як використати наявний у цьому застосунку програмний код. В ідеалі, тіло методу автоматизації має містити лише один рядок коду, який викликає наявні у програмі функції. Якщо розробка застосунка із самого початку відбувається із припущенням, що воно буде використовуватися і як сервер автоматизації, то врахувати цю вимогу нескладно. У такому випадку найпростіше — почати з того, щоб додати до застосунку необхідні функції. Наприклад, для застосунка MemoSrv бажано, з одного боку, мати можливість зчитувати, який шрифт і колір використовується в цей момент, і який текст виведений, а з іншого боку — керувати шрифтом, кольором і текстом з іншого застосунка. Для цього необхідно додати в клас головної екранної форми застосунка методи GetColor, SetColor, GetFont, SetFont, GetText і SetText.

Отримаємо такий програмний код (застосунок MemoSrv):

unit MainForm;

interface

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

type

TForm1 = class(TForm)

Memo1: TMemo;

btnFont: TButton;

btnColor: TButton;

FontDialog1: TFontDialog;

ColorDialog1; TColorDialog;

procedure btnFontClick(Sender:TObject);

procedure btnColorClick(Sender: TObject);

private

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

public

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

function GetColor: TColor;

procedure SetColor(aColor: TColor);

function GetFont: TFont;

procedure SetFont(aFont: TFont);

function GetText: TStrings;

procedure SetText(aText: TStrings);

end;

var

Form1: TForm1;

Implementation

{$R *.DFM}

procedure TForm1.btnFontClick(Sender: TObject);

begin

if FontDialog1.Execute then

Memo1.Font.Assign(FontDialog1.Font);

end;

procedure TForm1.btnColorClick{Sender: TObject);

begin

if ColorDialog1.Execute then

Memo1.Color := ColorDialog1.Color;

end;

procedure TForm1. SetColor (aColor: TColor);

begin

Memo1.Color := aColor;

end;

procedure TForm1.SetFont(aFont: TFont);

begin

Memo1.Font.Assign(aFont);

end;

procedure TForm1.SetText(aText: TStrings);

begin

Memo1.Lines.Assign(aText);

end;

function TForm1.GetColor: TColor;

begin

Result := Memo1.Color;

end;

function TForm1.GetFont: TFont;

begin

Result := Memo1.Font;

end;

function TForm1.GetText: TStrings;

begin

Result := Memo1.Lines;

end;

end.

Тепер клас головної форми підтримує методи доступу до потрібних параметрів. Додамо в застосунок MemoSrv об'єкт автоматизації. Для цього необхідно виконати подану далі послідовність дій.

1. Створити об’єкту автоматизації.

Ланцюжок: File  New  New Items  ActiveХ  Automation Object

Введемо ім'я об’єкту - MemoIntf. Після цього Delphi сформує модуль для MemoIntf, а потім автоматично запустить редактор Type Library Editor.

2. Додати в бібліотеку типів три властивості — Color, Font і Text.

Натисніть на кнопку New Property панелі інструментів Type Library Editor. У меню, що спливає, виберіть пункт Read, Write. У колонку Name введіть ім'я властивості Color, а в колонку Турe встановіть тип ОLE_COLOR.

Аналогічно додайте властивість Font, до якої можливий доступ для читання і запису, а її тип встановіть як IFontDisp. Цього типу може не бути в меню типів, але Type Library Editor сприйме його й у тому випадку, якщо ви просто наберете цей текст з клавіатури.

Додайте нову властивість Text, до якої можливий доступ для читання і запису, тип властивості встановіть як IStrings.

3. Натисніть на кнопку Refresh Implementation, щоб оновити програмний код відповідно до маніпуляцій, виконаних у вікні Type Library Editor.

4. Збережіть модуль під ім'ям MemoІntf.

5. У секцію оголошення інтерфейсів interface у директиву uses додайте модулі ActiveХ, StdVCL і AxCtrls, оскільки в цих модулях оголошені відповідно інтерфейси IFont, ISrtings і процедури GetOLEXxx.

6. У директиву uses секції implementation додайте MainForm.

7. У кожний з методів доступу в модулі MemoIntf вставте оператор викликання відповідного методу класу TForm1 (це показано в лістингу).

8. Скомпілюйте програму та запустіть її на виконання, щоб сервер автоматизації зареєструвався в системному реєстрі Windows на вашому комп'ютері. Після реєстрації закрийте застосунок.

Зауваження. Врахуйте, що зовнішні СОМ-сервери реєструються в системному реєстрі після кожного чергового запуску. Щоб зареєструвати такий сервер без фактичного виконання, запустіть його з ключем /regserver. Щоб видалити реєстрацію, треба запустити сервер із ключем /unregserver.

Програмний код модуля реалізації методів СОМ-об’єкту MemoІntf наведений у лістингу:

unit MemoIntf;

interface

uses

ComObj, ActiveX, AXCtrls, StdVCL, MemoSrv_TLB;

type

TMemoIntf = class(TAutoObject, IMemoIntf)

protected

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

function Get_Сolor: OLE_COLOR; safecall;

procedure Set_Color(Value: OLE_COLOR); safecall;

function Get_Font: IFontDisp; safecall;

function Get_Text: IStrings; safecall;

procedure Set_Font(const Value; IFontDisp); safecall;

procedure Set_Text(const Value: IStrings); safecall;

end;

implementation

uses ComServ, MainForm;

function TMemoIntf.Get_Color(Value:OLE_Color);

begin

result := Form1.GetColor;

end;

procedure TMemoIntf.Set_Color(Value:OLE_Color);

begin

Form1.SetColor(Value);

end;

function TMemoIntf.Get_Font: IFontDisp;

begin

GetOleFont(Form1.GetFont, Result);

end;

function TMemoIntf. Get_Text: IStrings;

begin

Get0leStrings(Form1.GetText, Result) ;

end;

procedure TMemoIntf,Set_Font(const Value: IFontDisp);

begin

SetOleFont(Form1.GetFont, Value);

end;

procedure TMemoIntf.Set_Text(const Value: IStrings);

begin

SetOleStrings(Form1.GetText, Value);

end;

initialization

TAutoObjectFactory.Create(ComServer, TMemoIntf, Class_MemoIntf, ciMultilnstance, tmApartment);

end.