程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中接口與類實例的轉換

Delphi中接口與類實例的轉換

編輯:Delphi

自己需要封裝一個COM,能夠實現類似於ADODB相似的功能,然後綜合想來,感覺直接的基於UniDac封裝比較好,於是馬上動手就做,在封裝的過程中碰到如下問題

 1   //數據庫連接類
 2   TCnConnection = class(TAutoObject, ICnConnection)
 3   private
 4     FConn: TConnection;
 5     function GetConnObj: TConnection;
 6   protected
 7   public
 8     destructor Destroy; override;
 9     procedure Initialize; override;
10     property ConnObj: TConnection read GetConnObj;
11   end;
12  
13   TCnQuery = class(TCnDataBase, ICnQuery)
14   private
15     FQuery: TQuery;
16   protected
17   public
18     procedure Set_Connection(const Param1: ICnConnection); safecall;
19   end;

 

TCnConnection就是ICnConnection接口的類實現

然後TCnQuery是ICnQuery接口的類實現,現在要實現直接的將ICnConnection作為連接屬性傳給TQuery。

在TUniQuery中,默認的賦值Connection語句應該為

TUniQuery.Connection= TUniConnection

如果再封裝一個一模一樣的IUniConnection代碼量比較大,因此想著能夠直接的傳入一個接口,然後自動的得到接口的類實例,然後在接口的類實現當中,串出來一個TUniConnection,方案找到,接下來困難點就是從接口轉到類對象

經過多次測試,得出最後的實現方法為

 1 procedure TCnDataBase.Set_Connection(const Param1: ICnConnection);
 2 var
 3   FConnObj: TCnConnection;
 4   eAutoObjFactory: TAutoObjectFactory;
 5   eEntry: PInterfaceEntry;
 6 begin
 7   //得到類工廠,Class_CnConnection就是在創建COM的時候,自動生成的
 8   eAutoObjFactory:= TAutoObjectFactory(ComClassManager.GetFactoryFromClassID(Class_CnConnection));
 9   //得到接口標識的接口項
10   eEntry:= eAutoObjFactory.DispIntfEntry;
11   //IOffset為接口的偏移地址,eResource減去IOffset所得到的地址就是對象實例
12   FConnObj:= TCnConnection(Integer(Param1)-eEntry.IOffset);
13   FDataSet.Connection:= FConnObj.ConnObj;
14 end;

至此,得到所需要的結果

 摘自 cntlis

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved