調用DLL中窗體到MDI作為子窗體 |
尚未結案
|
dengguo
一般會員 發表:41 回覆:49 積分:23 註冊:2004-01-09 發送簡訊給我 |
我在作調用DLL中窗體程式時,想把DLL中的窗體調用為主程式(MDI)窗體中的MDICHILD..
以下為我將DLL作為NORMAL調用時的代碼(這時主程式也要為NORMAOL,否則出錯)
------------------------------------
testDLL.DPR:
-------------------------------
uses
SysUtils,
Classes,
dllform in 'dllform.pas' {Form1};
exports
getdllform;
begin
end.
----------------------------------
DLLFORM.PAS
------------------------------------
unit dllform;
.......... var
Form1: TForm1;
function getdllform:integer;stdcall; implementation {$R *.dfm} function getdllform:integer;stdcall;
begin
result:=0;
form1:=tform1.create(application);
form1.ShowModal;
form1.Free;
end;
-------------------------------------
main.pas
--------------------------------------
unit main;
..........
var
Form1: TForm1;
function getdllform:integer;stdcall;external 'testdll.dll';
implementation {$R *.dfm} procedure TForm1.dll1Click(Sender: TObject);
var i:integer;
begin
i:=getdllform;
end;
-------------------------------------------------- 請問,我要怎樣才能把DLL中的窗體調用為主窗體(MDI)的CHILDMDI?? ###############################
初學delphi,請各位多多提點!謝謝!
###############################
|
dengguo
一般會員 發表:41 回覆:49 積分:23 註冊:2004-01-09 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
1) make your exe form fsMDIForm
2) make your dll form fsMDIChild
3) set Application in dll to that in exe
4) create the MDI child in dll BTW, I think using runtime package is easier... DLL is running another instance of VCL other than the exe.. Some routines will fail in between them (e.g. is operator).
|
StrongLemon
高階會員 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
引言: 1) make your exe form fsMDIForm 2) make your dll form fsMDIChild 3) set Application in dll to that in exe 4) create the MDI child in dll BTW, I think using runtime package is easier... DLL is running another instance of VCL other than the exe.. Some routines will fail in between them (e.g. is operator).william版主寫的第三點是重點。 所以你的 function getdllform:integer;stdcall;->GetDllForm(EXEApplication:TApplication) begin Application:=EXEApplication; form1:=tform1.create(Application); end; 另外在置換DLL的Application時必須把DLL的Application儲存, 釋放時再換回來。 var SaveApp:TApplication; .... .... initialization SaveApp := Application; finalization Application:=SaveApp; 還有MDIChild不能夠ShowModal.. 沒置換時Debug看Application屬性MainForm &MainForm.ClientHandle 你就會瞭解william版主寫的有畫底線的部分了。 procedure TCustomForm.CreateWindowHandle(const Params: TCreateParams); var CreateStruct: TMDICreateStruct; NewParams: TCreateParams; begin if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then begin if (Application.MainForm = nil) or (Application.MainForm.ClientHandle = 0) then raise EInvalidOperation.Create(SNoMDIForm); with CreateStruct do |
dengguo
一般會員 發表:41 回覆:49 積分:23 註冊:2004-01-09 發送簡訊給我 |
|
StrongLemon
高階會員 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
|
kulius
一般會員 發表:13 回覆:23 積分:17 註冊:2002-03-15 發送簡訊給我 |
|
StrongLemon
高階會員 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
|
wuherong2000
一般會員 發表:26 回覆:21 積分:9 註冊:2003-06-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |