
- •Створення елементів управління ActiveX
- •Розробка елементів управління ActiveX
- •Створення ActiveX з компонентів vcl Delphi
- •Створення ActiveX з форм
- •1. Розробка елементів управління ActiveX
- •2. Створення ActiveX з компонентів vcl Delphi
- •Ріс.2. Елемент управління RichEdit в редакторові бібліотеки типів
- •2. Створення ActiveX з форм
- •Рекомендована література
Інструкційна картка – завдання
Створення елементів управління ActiveX
Розробка елементів управління ActiveX
Створення ActiveX з компонентів vcl Delphi
Створення 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 і контейнерами, в яких розміщуватиметься створений елемент управління.