OLE 自動化是 Windows 應用程序操控另一程序的機制。OLE 2.0 允許定義命令集進入他程序,帶參數、如同調用函數/過程,實現無人參與的程序間交互。
Delphi 2.0 完全支持 OLE 2.0 自動化,可編寫控制器與服務端。潛能巨大:創建宏/命令使程序透過他程序工作,擴展現有宏語言包含他程序可執行命令/函數。
MemoEdit.dpr:MDI 文本編輯器,作為自動化服務端AutoForm.dpr:自動化控制器,按鈕操控 MemoEdit運行 AutoForm 前需在 IDE「運行|參數」輸入參數。AutoForm 多按鈕操控 MemoEdit:點「Create」產生三子窗體,點「AddText」子窗體出現字符串。
MemoEdit 三單元:MainForm (MDI 主窗體)、EditForm (MDI 子窗體+自動化類)、MemoAuto (應用程序自動化對象)。
所有自動化對象均繼承自 TAutoObject。automated 部分類似普通類的 public,控制器可引用此處聲明的屬性/方法。編譯器將其創建為 OLE 自動化對象入口。但有諸多限制:
SmallInt, Integer, Single, Double, Currency, TDateTime, String, WordBool, Variantread/write),禁用 index, stored, default, nodefault定義於 EditForm 單元:
type
TMemoDoc = class(TAutoObject)
private
FEditForm: TEditForm;
function GetFileName: String;
function GetModified: WordBool;
procedure SetFileName(const Value: String);
automated
procedure Clear;
procedure Insert(const Text: String);
procedure Save;
procedure Close;
property FileName: String read GetFileName write SetFileName;
property Modified: WordBool read GetModified;
end;
TMemoDoc 為內部類,無需註冊,外部控制器不可直接引用。若需外部操作,須在聲明單元調用 Automation.RegisterClass 註冊。例程 MemoAuto 單元定義 TMemoApp 並註冊:
unit MemoAuto;
...
type
TMemoApp = class(TAutoObject)
implementation
...
procedure RegisterMemoApp;
const
AutoClassInfo: TAutoClassInfo = (
AutoClass: TMemoApp;
ProgID: 'MemoEdit.Application';
ClassID: '{F1FF4880-200D-11CF-BDCF-D020AF0E5B81}';
Description: 'Memo Editor Application';
Instancing: acSingleInstance);
begin
Automation.RegisterClass(AutoClassInfo);
end;
initialization
RegisterMemoApp;
end.
註冊信息唯一標識服務端對象,initialization 節註冊。註冊後對象為引用計數,多控制器共享。用完調用 Release 減計數,歸零調用 Free 釋放。
通常以 Variant 輸出 OLE 對象。TAutoObject 提供 OleObject 屬性返回變體類型。控制器引用 OleObject 而非直接獲取類/指針。MemoAuto 單元 NewMemo 函數即通過 OleObject 提供 TMemoDoc 引用:
function TMemoApp.NewMemo: Variant;
begin
Result := MainForm.CreateMemo('').OleObject;
end;
SplitEx:支援多字元分隔符、Unicode、去重與排序
Delphi 滑鼠移動十字準線高效繪製:XOR 模式免閃爍