我現在想把對資料庫操作的單元進行封裝。但是要封裝的單元函式式用三層架構,把控制元件傳進去賦值
例如:function GetDataList(DBGrid: TDBGrid;QryCon: Res_QryCondition;out PageCount: Integer;PageNum:Integer):String;
現在我把這個函式封成dll會指標錯誤。
請問有什么辦法可以把我的那個單元封裝成dll
謝謝
uj5u.com熱心網友回復:
在dll里封裝物件的限制:1)呼叫dll的應用程式只能使用dll中物件的動態系結的方法。
2)dll封裝物件的實體只能在dll中創建。
3)在dll和呼叫dll的應用程式中都需要對封裝的物件及其被呼叫的方法進行宣告。
uj5u.com熱心網友回復:
1:你可以封裝資料源控制元件進去,如ADOQuery,不要封裝DBGrid進去2:回傳值不要用string,用PChar
uj5u.com熱心網友回復:
也可以考慮一下封閉成bpl庫uj5u.com熱心網友回復:
那我回傳來的是一個資料集。。很多資料 也不能用一個pchar就可以的啊 我還是要給dbgrid賦值 有什么方法嗎
uj5u.com熱心網友回復:
dll匯出物件的話,物件需要在dll內創建,另外應該是傳遞指標進去。uj5u.com熱心網友回復:
如果你只是給delphi呼叫的話,建議你改用bpl,以達到最大的靈活度。dll這樣玩肯定不行。uj5u.com熱心網友回復:
我之前寫了其他的方法 比如保存啊什么的 都正常 現在突然invalid class typecast錯誤。
但是效果還實作了 這是什么原因。
uj5u.com熱心網友回復:
//DLL
uses
SysUtils, Windows, Dialogs,
Classes;
type
TRec = record
s: string[255];
end;
PRec = ^TRec;
{$R *.res}
procedure Doit(sIn: Pointer; sOut: Pointer); stdcall;
begin
ShowMessage(PRec(sIn)^.s);
PRec(sOut)^.s := 'hello China.';
end;
exports Doit;
begin
end.
//主程式
procedure Doit(sIn: Pointer; sOut: Pointer); stdcall; external 'Project1.dll';
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
pIn, pOut: PRec;
begin
try
GetMem(pIn, Sizeof(TRec));
GetMem(pOut, Sizeof(TRec));
pIn^.s := 'hello world.';
Doit(pIn, pOut);
ShowMessage(pOut^.s);
finally
FreeMem(pIn);
FreeMem(pOut);
end;
end;
所有的操作都是用指標的,傳進去的物件,其實也是指標。
uj5u.com熱心網友回復:
主程式也要申明一下結構體。uj5u.com熱心網友回復:
建議使用interface方式呼叫uj5u.com熱心網友回復:
mark,以后可能用得上uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/133619.html
標籤:VCL組件開發及應用
上一篇:非線性方程組的問題
