不好意思,想再問清楚一點 |
尚未結案
|
bonjovi999
一般會員 發表:4 回覆:1 積分:1 註冊:2005-08-05 發送簡訊給我 |
首先多謝你的回覆,但其實我在這個程序裡有一個接收參數的字串常數,或許我再寫清楚一點,如下 Function tFmG_MainMenu.BuildForm(Const FormName:String):Boolean;
Var
ExeForm:TForm;
Begin
If Application.FindComponent(FormName) = nil Then
ExeForm:=(TForm(FindComponent('T' FormName)).Create(Self))
Else
ExeForm:=Application.FindComponent(FormName) ; With ExeForm Do
Begin
Try
ShowModal;
finally
Free;
End;
End;
End;
|
G01
高階會員 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
您似乎誤解了FindComponent的用意 首先FindComponent只用在尋找已經被TApplication建立的Form
而當這個函式傳回 nil 時,TApplication並無任何物件指標指向該nil
它純脆只是傳回nil的值而已!!所以您不能拿 nil 值來建立元件!! 其次,建立一個元件前;通常我們必須宣告一個屬於該類別的指標
EX
var Comp:TButton; //告訴compiler , 宣告一個TButton的物件指標"Comp"
begin
Comp := TButton.Create(nil);//配置一個TButton物件給"Comp" 在你的例子中,以下的一行犯了幾個錯誤
ExeForm:=(TForm(FindComponent('T' FormName)).Create(Self)) 1.不能拿 nil 值來建立元件!!
2.FindComponent('T' FormName) 並不能讓Compiler找到該Form的類別 所以總結如下
假設我們要動態產生一個叫做"TfDemoForm" 的自定Form類別元件
則程式碼應該如下
Function tFmG_MainMenu.BuildForm(Const FormName:String):Boolean;
var ExeForm:TForm;
TmpForm:TfDemoForm;
begin
If Application.FindComponent(FormName) = nil Then
begin
TmpForm := TfDemoForm.Create(self);
ExeForm := TmpForm as TForm;
TmpForm := nil;
end
Else
ExeForm:=Application.FindComponent(FormName) ;
....以下照舊.... 努力不一定成功 , 不努力一定不成功!!
|
bonjovi999
一般會員 發表:4 回覆:1 積分:1 註冊:2005-08-05 發送簡訊給我 |
|
G01
高階會員 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
假設TfDemoForm 所屬的檔案為UTfDemoForm.pas 而要使用 TmpForm := TfDemoForm.Create(self) as TForm;的單元名稱為
UDataModule.pas
則在 UDataModule.pas的implementation區段和END. 之間就要加上這一行 Uses UTfDemoForm; //-->這樣就行了 當Compiler看到這一行,它就會到UTfDemoForm.pas找出TfDemoForm類別出來 這樣說清楚吧 ?? 努力不一定成功 , 不努力一定不成功!!
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |