Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delfi_1.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
341.5 Кб
Скачать

Інструкційна картка – завдання

Створення елементів управління ActiveX

  1. Розробка елементів управління ActiveX

  2. Створення ActiveX з компонентів vcl Delphi

  3. Створення ActiveX з форм

1. Розробка елементів управління ActiveX

Як такий майстер для створення елементів управління ActiveX в Delphi відсутній. Розробник зазвичай вибирає один з двох можливих шляхів:

- використання майстра перетворення будь-якого віконного компоненту (нащадка TWinControl) в елемент управління ActiveX. Для цього застосовується майстер, якого ви можете викликати за допомогою пункту головного меню File/New (Файл/новий), і перейшовши на вкладку ACTIVEX вибрати піктограму ActiveX Control;

- використання майстра перетворення форм в елемент ActiveX. Для цього ви можете викликати майстер, розташований на вкладці ActiveX (як в попередньому варіанті), при цьому вибравши піктограму ActiveForm.

2. Створення ActiveX з компонентів vcl Delphi

Одній з можливостей створення елементу управління ActiveX в Delphi - це перетворення будь-якого віконного компоненту VCL Delphi в ActiveX.

Примітка

Не дивлячись на те, що майстер ActiveX Control не дає можливості автоматично створювати елементи управління ACTIVEX з компонентів, що не є нащадками TWinControl, розробник може створити такий елемент управління самостійно за допомогою системи розробки Delphi ACTIVEX (DAX).

Викличемо майстер ActiveX Control. З'явиться вікно майстра створення елементу ACTIVEX з віконного компоненту Delphi (Рис. 1).

В процесі використання даного майстра вам потрібно виконати наступне:

1. Вибрати компонент VCL з випадного списку VCL Class Name (Ім'я класу VCL).

Примітка

Як ви, ймовірно, відмітили, у випадному списку знаходяться далеко не всі компоненти VCL. У даний список внесені тільки ті компоненти, які задовольняють наступним вимогам: знаходяться в поточному пакеті, який використовується в процесі розробки (отже, знаходяться в палітрі компонентів); є нащадками компоненту TWinControl; не виключаються з даного списку за допомогою процедури RegisterNonActiveX.

Багато хто з компонентів виключений із списку через те, що вони або не можуть бути елементами управління ActiveX (наприклад, компонент TDBGrid, оскільки для його роботи потрібний інший VCL-класс TDataSource), або необхідно самостійно скоректувати їх перед запуском майстра, щоб вони могли функціонувати як елементи ActiveX (наприклад, TTreeView, оскільки вузли компоненту дуже складно представляти в ActiveX).

2. Вибрати нове ім'я ActiveX в полі для введення New ActiveX Name (Нове ім'я ActiveX), якщо вас не влаштовує ім'я, пропоноване Delphi автоматично.

3. Вибрати ім'я модуля реалізації створюваного елементу ActiveX в полі для введення Implementation Unit (Модуль реалізації).

4. Вибрати ім'я проекту в полі для введення Project Name (Ім'я проекту).

5. Вибрати потокову модель у випадному списку Threading Model (Модель потоку).

6. Після цього ви можете встановити три додаткові опції:

Include About Box (Включити вікно "Про програму") - включити в проект діалогове вікно, яке міститиме інформацію про розробника. Дане діалогове вікно є звичайною формою Delphi;

Include Version Information (Включити інформацію про версію) - включити в проект інформацію про версію елементу управління ActiveX (даний пункт потрібний для деяких контейнерів, наприклад, створених в Visual Basic);

Make Control Licensed (Включити ліцензійну інформацію) - включити в проект ліцензійну інформацію (в разі комерційного розповсюдження елементу управління). В результаті використовувати даний елемент управління зможуть тільки ті розробники, які мають ліцензійний ключ, причому дане обмеження працюватиме у всій середі розробки (Delphi, Visual Basic і ін.). При установці даного прапорця разом з проектом елементу управління має згенерувати файл ліцензії, що має розширення LIC. Щоб дати можливість іншим розробникам використовувати цей ActiveX, вам доведеться передавати ліцензійним користувачам файл ліцензії разом з елементом управління ActiveX (що має розширення OCX).

Рис. 1. Майстер перетворення компонентів VCL Delphi в ActiveX

Після внесення необхідних значень до полів, майстер автоматично створить всі файли, які потрібні для підтримки даного елементу управління. До числа таких файлів входять: сам проект, бібліотека типів і файл реалізації. Звернете увагу на те, що всі елементи ActiveX є або бібліотеками DLL, або файлами OCX (що, в принципі, одне і те ж).

Розглянемо дії, які виконує майстер в процесі створення елементу управління ActiveX з компоненту:

- майстер визначає, в якому модулі міститься елемент управління VCL. Даний модуль передається компілятору, який створює спеціальну символьну інформацію для опису властивостей, подій і методів елементу управління VCL;

- генерується бібліотека типів для проекту;

- майстер аналізує всю символьну інформацію про елемент управління VCL і додає відповідні властивості і методи до інтерфейсу і в бібліотеку типів;

Примітка

Для визначення, чи личить дана властивість, метод або подія для включення в бібліотеку типів, майстер перевіряє, чи поєднаємо з автоматизацією типа властивості, його параметри, а також значення подій і методів, що повертаються. З автоматизацією сумісні наступні типи: Byte, Smallint, Integer, Single, Double, Currency, TDateTime, WideString, WordBool, PSafeArray, TDecimal, OleVariant, lUnknown, IDispatch. Окрім перерахованих, дозволені параметри типів TStrings, TPicture і TFont. Для даних типів майстер створить проміжні об'єкти, які дозволять їм бути інкапсульованими в IDispatch або Dispinterface.

- редактор бібліотеки типів генерує файл перетвореної бібліотеки типів відповідно до доданих властивостей, подій і методів;

- майстер створює файл реалізації елементу управління ActiveX. Даний файл містить елемент управління TActiveXcontroi. Крім того, майстер автоматично створює так звані пересилки (forwarders) властивостей і методів інтерфейсу. Пересилки направляють виклики методу з елементу управління ActiveX в елемент управління VCL, а події - з елементу управління VCL в елемент ActiveX.

Лістинг 1 містить код файлу проекту елементу управління ActiveX, створеного на основі компоненту TRichEdit.

Лістинг 1

library RichEditXControll;

uses

ComServ

RichEditXControllJTLB in 'RichEditXControllJTLB.pas',

RichEditlmpll in 'RichEditlmpll.pas' {RichEditX: CoClass};

{$E ocx}

exports

DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer;

{$R *.TLB}

{$R *.RES}

begin

end.

Описувати даний лістинг не має особливого сенсу, оскільки його зміст достатній очевидно.

Лістинг 2 містить код реалізації елементу ActiveX.

Лістинг 2

unit RichEditlmpll;

interface

uses

Windows, ACTIVEX, Classes, Controls, Graphics, Menus, Forms, StdCtrls, ComServ, STDVCL, AXCtrls, RichEditXControllJTLB, ComCtrls;

type

TRichEditX = class(TActiveXControl, IRichEditX)

private

{ Private declarations }

FDelphiControl: TRichEdit;

FEvents: IRicnEditXEvents;

procedure ChangeEvent(Sender: TObject);

procedure KeyPressEvent(Sender: TObject; var Кеу: Char);

procedure ProtectChangeEvent(Sender: TObject; StartPos, EndPos:

Integer;

var AllowChange: Boolean);

procedure SaveClipboardEvent(Sender: TObject; NumObjects, NumChars: Integer; var SaveClipboard: Boolean);

procedure SelectionChangeEvent(Sender: TObject);

protected

{ Protected declarations }

procedure DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); override;

procedure EventSinkChanged(const EventSink: lUnknown); override;

procedure InitializeControl; override;

function Get_Alignment: TxAlignment; safecall;

function Get_BorderStyle: TxBorderStyle; safecall;

function Get_CanUndo: WordBool; safecall;

function Get_Color: OLE_COLOR; safecall;

function Get_Ctl3D: WordBool; safecall;

function Get_Cursor: Smallint; safecall;

function Get_DoubleBuffered: WordBool; safecall;

function Get_DragCursor: Smallint; safecall;

function Get_DragMode: TxDragMode; safecall;

function Get_Enabled: WordBool; safecall;

function Get_Font: IFontDisp; safecall;

function Get_HideScrollBars: WordBool; safecall;

function Get_HideSelection: WordBool; safecall;

function Get_ImeMode: TxImeMode; safecall;

function Get_ImeName: WideString; safecall;

function Get_Lines: IStrings; safecall;

function Get_MaxLength: Integer; safecall;

function Get_Modified: WordBool; safecall;

function Get_ParentColor: WordBool; safecall;

function Get_ParentCtl3D: WordBool; safecall;

function Get_PlainText: WordBool; safecall;

function Get_ReadOnly: WordBool; safecall;

function Get_ScrollBars: TxScrollStyle; safecall;

function Get_SelLength: Integer; safecall;

function Get_SelStart: Integer; safecall;

function Get_SelText: WideString; safecall;

function Get_Text: WideString; safecall;

function Get_Visible: WordBool; safecall;

function Get_VisibleDockClientCount: Integer; safecall;

function Get_WantReturns: WordBool; safecall;

function Get_WantTabs: WordBool; safecall;

function Get_WordWrap: WordBool; safecall;

procedure _Set_Font(const Value: IFontDisp); safecall;

procedure Set_Alignment(Value: TxAlignment); safecall;

procedure Set_BorderStyle(Value: TxBorderStyle); safecall;

procedure Set_Color(Value: OLE_COLOR); safecall;

procedure Set_Ctl3D(Value: WordBool); safecall;

procedure Set_Cursor(Value: Smallint); safecall;

procedure Set_DoubleBuffered(Value: WordBool); safecall;

procedure Set_DragCursor(Value: Smallint); safecall;

procedure Set_DragMode(Value: TxDragMode); safecall;

procedure Set_Enabled(Value: WordBool); safecall;

procedure Set_Font(var Value: IFontDisp); safecall;

procedure Set_HideScrollBars(Value: WordBool); safecall;

procedure Set_HideSelection(Value: WordBool); safecall;

procedure Set_ImeMode(Value: TxImeMode); safecall;

procedure Set_ImeName(const Value: WideString); safecall;

procedure Set_Lines(const Value: IStrings); safecall;

procedure Set_MaxLength(Value: Integer); safecall;

procedure Set_Modified (Value: WordBool); safecall;

procedure Set_ParentColor(Value: WordBool); safecall;

procedure Set_ParentCtl3D(Value: WordBool); safecall;

procedure Set_PlainText(Value: WordBool); safecall;

procedure Set_ReadOnly(Value: WordBool); safecall;

procedure Set_ScrollBars(Value: TxScrollStyle); safecall;

procedure Set_SelLength(Value: Integer); safecall;

procedure Set_SelStart(Value: Integer); safecall;

procedure Set_SelText(const Value: WideString); safecall;

procedure Set_Text(const Value: WideString); safecall;

procedure Set_Visible(Value: WordBool); safecall;

procedure Set_WantReturns(Value: WordBool); safecall;

procedure Set_WantTabs(Value: WordBool); safecall;

procedure Set_WordWrap(Value: WordBool); safecall;

end;

implementation

uses ComObj;

{ TRichEditX }

procedure TRichEditX.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage);

begin

{TODO: Визначите тут сторінки властивостей. Вони визначаються шляхом виклику методу DefinePropertyPage з ідентифікатором класу.

Наприклад, DefinePropertyPage(Class_RichEditXPage); }

end;

procedure TRichEditX.EventSinkChanged(const EventSink: lUnknown);

begin

FEvents := EventSink as IRichEditXEvents;

end;

procedure TRichEditX.InitialiZeControl;

begin

FDelphiControl :=* Control as TRichEdit;

FDelphiControl.OnChange := ChangeEvent;

FDelphiControl.OnKeyPress := KeyPressEvent;

FDelphiControl.OnProtectChange := ProtectChangeEvent;

FDelphiControl.OnSaveClipboard := SaveClipboardEvent;

FDelphiControl.OnSelectionChange := SelectionChangeEvent;

end;

function TRichEditX.Get_Alignment: TxAlignment;

begin

Result := Ord(FDelphiControl.Alignment);

end;

function TRichEditX.Get_BorderStyle: TxBorderStyle;

begin

Result := Ord(FDelphiControl.BorderStyle);

end;

function TRichEditX.Get_CanUndo: WordBool;

begin

Result := FDelphiControl.CanUndo;

end;

function TRichEditX.Get_Color: OLE_COLOR;

begin

Result := OLE_COLOR(FDelphiControl.Color);

end;

function TRichEditX.Get_Ctl3D: WordBool;

begin

Result := FDelphiControl.Ctl3D;

end;

function TRichEditX.Get_Cursor: Smallint;

begin

Result := Smallint(FDelphiControl.Cursor);

end;

function TRichEditX.Get_DoubleBuffered: WordBool;

begin

Result := FDelphiControl.DoubleBuffered;

end;

function TRichEditX.Get_DragCursor: Smallint;

begin

Result := Smallint(FDelphiControl.DragCursor);

end;

function TRichEditX.Get_DragMode: TxDragMode;

begin

Result := Ord(FDelphiControl.DragMode);

end;

function TRichEditX.Get_Enabled: WordBool;

begin

Result := FDelphiControl.Enabled;

end;

function TRichEditX.Get_Font: IFontDisp;

begin

GetOleFont(FDelphiControl.Font, Result);

end;

function TRichEditX.Get_HideScrollBars: WordBool;

begin

Result := FDelphiControl.HideScrollBars;

end;

function TRichEditX.Get_HideSelection: WordBool;

begin

Result := FDelphiControl.HideSelection;

end;

function TRichEditX.Get_ImeMode: TxImeMode;

begin

Result := Ord(FDelphiControl.ImeMode);

end;

function TRichEditX.Get_ImeName: WideString;

begin

Result := WideString(FDelphiControl.ImeName);

end;

function TRichEditX.Get_Lines: IStrings;

begin

GetOleStrings(FDelphiControl.Lines, Result);

end;

function TRichEditX.Get_MaxLength: Integer;

begin

Result := FDelphiControl.MaxLength;

end;

function TRichEditX.Get_Modified: WordBool;

begin

Result := FDelphiControl.Modified;

end;

function TRichEditX.Get_ParentColor: WordBool;

begin

Result := FDelphiControl.ParentColor;

end;

function TRichEditX.Get_ParentCtl3D: WordBool;

begin

Result := FDelphiControl.ParentCtlSD;

end;

function TRichEditX.Get_PlainText: WordBool;

begin

Result := FDelphiControl.Plaintext;

end;

function TRichEditX.Get_ReadOnly: WordBool;

begin

Result := FDelphiControl.Readonly;

end;

function TRichEditX.Get_ScrollBars: TxScrollStyle;

begin

Result := Ord(FDelphiControl.ScrollBars);

end;

function TRichEditX.Get_SelLength: Integer;

begin

Result := FDelphiControl.SelLength;

end;

function TRichEditX,Get_SelStart: Integer;

begin

Result := FDelphiControl.SelStart;

end;

function TRichEditX.Get_SelText: WideString;

begin

Result := WideString(FDelphiControl.SelText);

end;

function TRichEditX.Get_Text: WideString;

begin

Result := WideString(FDelphiControl.Text);

end;

function TRichEditX.Get_Visible: WordBool;

begin

Result := FDelphiControl.Visible;

end;

function TRichEditX.Get_VisibleDockClientCount: Integer;

begin

Result := FDelphiControl.VisibleDockClientCount;

end;

function TRichEditX.Get_WantReturns: WordBool;

begin

Result := FDelphiControl.WantReturns;

end;

function TRichEditX.Get_WantTabs: WordBool;

begin

Result := FDelphiControl.WantTabs;

end;

function TRichEditX.Get_WordWrap: WordBool;

begin

Result := FDelphiControl.Wordwrap;

end;

procedure TRichEditX._Set_Font(const Value: IFontDisp);

begin

SetOleFont(FDelphiControl.Font, Value);

end;

procedure TRichEditX.ChangeEvent(Sender: TObject);

begin

if FEvents <> nil then FEvents.OnChange;

end;

procedure TRichEditX.KeyPressEvent(Sender: TObject; var Кеу: Char);

var

TempKey: Smallint;

begin

TempKey := Smallint(Кеу);

if FEvents <> nil then FEvents.OnKeyPress(TempKey);

Кеу := Char(TempKey);

end;

procedure TRichEditX.ProtectChangeEvent(Sender: TObject; StartPos, EndPos: Integer; var AllowChange: Boolean);

var

TempAllowChange: WordBool;

begin

TempAllowChange := WordBool(AllowChange);

if FEvents <> nil then FEvents.OnProtectChange(StartPos, EndPos, TempAllowChange);

AllowChange := Boolean(TempAllowChange);

end;

procedure TRichEditX.SaveClipboardEvent(Sender: TObject; NumObjects, NumChars: Integer; var SaveClipboard: Boolean);

var

TempSaveClipboard: WordBool;

begin

TempSaveClipboard := WordBool(SaveClipboard);

if FEvents <> nil then FEvents.OnSaveClipboard(NumObjects, NumChars, TempSaveClipboard); SaveClipboard := Boolean(TempSaveClipboard);

end;

procedure TRichEditX.SelectionChangeEvent(Sender: TObject);

begin

if FEvents <> nil then FEvents.OnSelectionChange;

end;

procedure TRichEditX.Set_Alignment(Value: TxAlignment);

begin

FDelphiControl.Alignment := TAlignment(Value);

end;

procedure TRichEditX.Set_BorderStyle(Value: TxBorderStyle);

begin

FDelphiControl.BorderStyle := TBorderStyle(Value);

end;

procedure TRichEditX.Set_Color(Value: OLE_COLOR);

begin

FDelphiControl.Color := TColor(Value);

end;

procedure TRichEditX.Set_Ctl3D(Value: WordBool);

begin

FDelphiControl.Ctl3D := Value;

end;

procedure TRichEditX.Set_Cursor(Value: Smallint);

begin

FDelphiControl.Cursor := TCursor(Value);

end;

procedure TRichEditX.Set_DoubleBuffered(Value: WordBool);

begin

FDelphiControl.DoubleBuffered := Value;

end;

procedure TRichEditX.Set_DragCursor(Value: Smallint);

begin

FDelphiControl.DragCursor := TCursor(Value);

end;

procedure TRichEditX.Set_DragMode(Value: TxDragMode);

begin

FDelphiControl.DragMode := TDragMode(Value);

end;

procedure TRichEditX.Set_Enabled(Value: WordBool);

begin

FDelphiControl.Enabled := Value;

end;

procedure TRichEditX.Set_Font(var Value: IFontDisp);

begin

SetOleFont(FDelphiControl.Font, Value);

end;

procedure TRichEditX.SetJHideScrollBars(Value: WordBool);

begin

FDelphiControl.HideScrollBars := Value;

end;

procedure TRichEditX.Set_HideSelection(Value: WordBool);

begin

FDelphiControl.HideSelection := Value;

end;

procedure TRichEditX.Set_ImeMode(Value: TxImeMode);

begin

FDelphiControl.ImeMode := TImeMode(Value);

end;

procedure TRichEditX.Set_ImeName(const Value: WideString);

begin

FDelphiControl.ImeName := TImeName(Value);

end;

procedure TRichEditX.Set_Lines(const Value: IStrings);

begin

SetOleStrings(FDelphiControl.Lines, Value);

end;

procedure TRichEditX.Set_MaxLength(Value: Integer);

begin

FDelphiControl.MaxLength := Value;

end;

procedure TRichEditX.Set_Modified(Value: WordBool);

begin

FDelphiControl.Modified := Value;

end;

procedure TRichEditX.Set_ParentColor(Value: WordBool);

begin

FDelphiControl.ParentColor := Value;

end;

procedure TRichEditX.Set_ParentCtl3D(Value: WordBool);

begin

FDelphiControl.ParentCtl3D := Value;

end;

procedure TRichEditX.Set_PlainText(Value: WordBool);

begin

FDelphiControl.PlainText := Value;

end;

procedure TRichEditX.Set_ReadOnly(Value: WordBool);

begin

FDelphiControl.Readonly := Value;

end;

procedure TRichEditX.Set_ScrollBars(Value: TxScrollStyle);

begin

FDelphiControl.ScrollBars := TScrollStyle(Value);

end;

procedure TRichEditX.Set_SelLength(Value: Integer);

begin

FDelphiControl.SelLength := Value;

end;

procedure TRichEditX.Set_SelStart(Value: Integer);

begin

FDelphiControl.SelStart := Value;

end;

procedure TRichEditX.Set_SelText(const Value: WideString);

begin

FDelphiControl.SelText := String(Value);

end;

procedure TRichEditX.Set_Text(const Value: WideString};

begin

FDelphiControl.Text := TCaption(Value);

end;

procedure TRichEditX.Set_Visible(Value: WordBool);

begin

FDelphiControl.Visible := Value;

end;

procedure TRichEditX.Set_WantReturns(Value: WordBool);

begin

FDelphiControl.WantReturns := Value;

end;

procedure TRichEditX.Set_WantTabs(Value: WordBool);

begin

FDelphiControl.WantTabs := Value;

end;

procedure TRichEditX.Set_WordWrap(Value: WordBool);

begin

FDelphiControl.Wordwrap := Value;

end;

initialization

TActiveXControlFactory.Create (ComServer, TRichEditX,TRichEdit,Class_RichEditX

1

''

0

tmApartment);

end.

Описаний в даному файлі клас TRichEditx є нащадком TActiveXcontrol. Цей клас застосовується для установки відповідності між колишнім компонентом Delphi TRichEdit і контейнерами, в яких розміщуватиметься створений елемент управління.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]