線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2088
推到 Plurk!
推到 Facebook!

調用DLL中窗體到MDI作為子窗體

尚未結案
dengguo
一般會員


發表:41
回覆:49
積分:23
註冊:2004-01-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-25 10:20:27 IP:218.16.xxx.xxx 未訂閱
我在作調用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-27 08:36:18 IP:218.16.xxx.xxx 未訂閱
我搜尋了整個論壇,沒找到相應的介紹,哪位大大能幫忙一下??謝謝!!    ############################### 初學delphi,請各位多多提點!謝謝! ###############################
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-27 09:55:49 IP:147.8.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-27 17:12:07 IP:221.169.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-31 12:50:53 IP:218.16.xxx.xxx 未訂閱
謝謝兩位的回答,請恕在下愚笨,看了帖子後按照這樣子調試沒能通過,能否給點簡單的例子,謝謝!!    ############################### 初學delphi,請各位多多提點!謝謝! ###############################
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-01 00:43:25 IP:210.68.xxx.xxx 未訂閱
kulius
一般會員


發表:13
回覆:23
積分:17
註冊:2002-03-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-06-02 16:13:15 IP:61.221.xxx.xxx 未訂閱
StrongLemon兄您好 由於目前的MDIFORM都是繼承過來的 想要採用您所述的MDI DLL 舉個簡單的列子 1.MDI_CHILD.....這個是繼承的源頭,裡面有對一個TABLE來作新增,刪除.等 2.MAINTAIN...繼承MDI_CHILD 目前程式採取此架構 呼叫MAINTAIN時.袛要傳入一個DATASET,便可直接做新增,刪除 碰到問題有二 1.如何傳DATASET到DLL中 2.以DLL繼承的方式如何使用 望您抽空指教
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-06-03 13:48:33 IP:221.169.xxx.xxx 未訂閱
引言: 碰到問題有二 1.如何傳DATASET到DLL中 2.以DLL繼承的方式如何使用 望您抽空指教
kulius你好: 1.上面的範例有更新過,請看。不過我不建議傳整個Dataset進去,而是傳連接的設定比如說連接字串..SQL字串..DB設定等。 2.DLL繼承..因為我不是用Build with runtime package..所以編譯DLL時其實 就已經連同底層unit編譯進去..還是請看範例吧..
wuherong2000
一般會員


發表:26
回覆:21
積分:9
註冊:2003-06-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-26 10:21:26 IP:219.130.xxx.xxx 未訂閱
to StrongLemon 可是范例程式下載後也運行不了,請問是怎麼回事,要做什麼設定嗎,可是我沒有看到相關的設定內容
系統時間:2024-11-22 12:15:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!