首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi OLE 自動化編程:控制器操控服務端、TAutoObject 基類、自動化對象定義與註冊

     編輯:Delphi

8.4 OLE 自動化

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 (應用程序自動化對象)。

8.4.1 TAutoObject 基類

所有自動化對象均繼承自 TAutoObject。automated 部分類似普通類的 public,控制器可引用此處聲明的屬性/方法。編譯器將其創建為 OLE 自動化對象入口。但有諸多限制:

  • 可定義屬性/方法,不能定義字段
  • 屬性/參數/函數類型必須為:SmallInt, Integer, Single, Double, Currency, TDateTime, String, WordBool, Variant
  • 屬性聲明僅含訪問定義符 (read/write),禁用 index, stored, default, nodefault
  • 訪問定義符必須列出方法標識符,不能用字段標識符
  • 支持數組類型
  • 不允許屬性重載
  • 方法可為虛擬,不能為動態,允許方法重載

內部自動化類 TMemoDoc

定義於 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;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved