動態create form 的問題 |
尚未結案
|
cd109
一般會員 發表:23 回覆:33 積分:11 註冊:2003-12-22 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
|
cd109
一般會員 發表:23 回覆:33 積分:11 註冊:2003-12-22 發送簡訊給我 |
大哥你好:
function FormShowChild( sId: String; eWindowState: TWindowState;Pent:TWinControl): THandle; var form : TForm; i, formTag : Integer; begin if sId='' then exit; form := nil; for i := 0 to Screen.FormCount - 1 do begin if UpperCase(Screen.Forms[i].ClassName) = UpperCase('Tfrm' sId) then begin form := Screen.Forms[i]; form.BringToFront; break; end; end; if form = nil then begin formTag:= AuthorizeCode(sId); if formTag = -1 then exit ; form := TFormClass( FindClass('Tfrm' sId)).Create(Application); form.Tag := formTag; end; // form.WindowState:= eWindowState; form.Show; form.BorderStyle := bsNone; form.Parent := Pent; form.Align := alClient; Result := form.Handle; end; //maim procedure Tfrmmain.FormCreate(Sender: TObject); begin FormShowChild(TR,wsMaximized,pnlMain); end; //TR frmToolGroupName := TfrmToolGroupName.Create(Self); //TRNAME procedure TfrmToolGroupName.FormCreate(Sender: TObject); begin TR.btnName <<==TR 全域變數 end; |
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
經過測試,是因為您動態產生的function是用Create(Application),如果改為Creat(Self)就可以了,Creat(Self)或Create(Application)。如果Owner是屬於別的視窗或控制項的話,當它的Owner被釋放的時候,該Owner所擁有的也會被釋放。關鍵的區別是由誰來管理該表單的資源。用第一種方法創建,該表單的資源由編程者來負責管理;用第二種方法創建,該表單的資源由Application來管理。 如果不想改為Creat(Self)的話,可以用下列方式取得變數
showmessage(TfrmTR(Application.FindComponent('frmTR')).btnName); 發表人 - shinjie 於 2005/01/13 14:16:13
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。 得之;我幸。不得;我命。 |
cd109
一般會員 發表:23 回覆:33 積分:11 註冊:2003-12-22 發送簡訊給我 |
function FormShowChild( sId: String; eWindowState: TWindowState;Pent:TWinControl): THandle; var form : TForm; i, formTag : Integer; begin if sId='' then exit; form := nil; for i := 0 to Screen.FormCount - 1 do begin if UpperCase(Screen.Forms[i].ClassName) = UpperCase('Tfrm' sId) then begin form := Screen.Forms[i]; form.BringToFront; break; end; end; if form = nil then begin formTag:= AuthorizeCode(sId); if formTag = -1 then exit ; form := TFormClass( FindClass('Tfrm' sId)).Create(Application);<==請問大哥你是說這裡改成self嗎? 好像沒有這個關鍵字ㄝ form.Tag := formTag; end; // form.WindowState:= eWindowState; form.Show; form.BorderStyle := bsNone; form.Parent := Pent; form.Align := alClient; Result := form.Handle; end; |
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
|
cd109
一般會員 發表:23 回覆:33 積分:11 註冊:2003-12-22 發送簡訊給我 |
|
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
如果不想改為Creat(Self)的話,可以用下列方式取得變數
showmessage(TfrmTR(Application.FindComponent('frmTR')).btnName); 傳Self要改三個地方
function FormShowChild( sId: String; eWindowState: TWindowState;Pent:TWinControl;AOwner: TComponent): THandle; form := TFormClass( FindClass('Tfrm' sId)).Create(AOwner); FormShowChild(TR,wsMaximized,pnlMain,Self);
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。 得之;我幸。不得;我命。 |
cd109
一般會員 發表:23 回覆:33 積分:11 註冊:2003-12-22 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
以下是幾篇討論動態Create Form的問題,希望能幫你離一些
觀念,理論上來說,在Form Class中加入Global的物件指標變
數,有些狀況必須要多加考量,尤其在架構整個程式的UI部分,
更要在初期就架構清楚. http://delphi.ktop.com.tw/topic.php?TOPIC_ID=61566
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=62015
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=62150
|
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
|
cd109
一般會員 發表:23 回覆:33 積分:11 註冊:2003-12-22 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |