如何傳物件參考..??? |
尚未結案
|
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
我寫了一個程序,希望動態開form,所以我傳參考進去...
CreatJobForm(Tf12320_HoTktnoError,f12320_HoTktnoError,0,0);
可是有錯....
[Error] SystemMainU.pas(119): Types of actual and formal var parameters must be identical
但若我程序宣告時只有var Reference 沒有:Tform 給參考類別,
則程序裡Reference.Tag:=SelectJob;等就會有
[Error] SystemMainU.pas(145): Record, object or class type required 二者有何差別,還有請問要如何修改哩...>< ===================================================================
procedure TSystemMain.CreatJobForm(clsform:TComponentClass;var Reference:Tform ;ShowType,SelectJob:integer);
var i,showCount:integer;
begin
if showType=1 then
begin
try
Application.CreateForm(clsform,Reference);
Reference.Tag:=SelectJob;
Reference.ShowModal;
finally
Reference.Free;
end;
end else
begin
showCount :=0;
for I := 0 to Screen.FormCount-1 do
begin // Screen.Forms[i].Name= form_name.Name
if form_name=nil then inc(showCount);
end;
if showCount=0 then
begin
Application.CreateForm(clsform,Reference);
Reference.Tag:=SelectJob;
Reference.Parent:=Self;
Reference.show;
end;
end;
end;
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
procedure TSystemMain.CreatJobForm(clsform:TComponentClass;var Reference:Tform ;ShowType,SelectJob:integer); var i,showCount:integer; begin if showType=1 then begin try Application.CreateForm(clsform,Reference); Reference.Tag:=SelectJob; Reference.ShowModal; finally Reference.Free; end; end else begin showCount :=0; for I := 0 to Screen.FormCount-1 do begin // Screen.Forms[i].Name= form_name.Name if form_name=nil then inc(showCount); end; if showCount=0 then begin Application.CreateForm(clsform,Reference); Reference.Tag:=SelectJob; Reference.Parent:=Self; Reference.show; end; end; end; CreatJobForm(Tf12320_HoTktnoError,f12320_HoTktnoError,0,0); [Error] SystemMainU.pas(119): Types of actual and formal var parameters must be identical 我想這裡是因為沒有uses有宣告f12320_HoTktnoError這個變數的單元進來的原因. 給你一個範例: function TfrmMainForm.ExecuteProcess(FormName: string): TForm; var i : Integer; Form : TForm; PFormName: PChar; Begin PFormName:=PChar('T' FormName); Form := nil; for i := 0 to Screen.FormCount-1 do begin if Screen.Forms[i].ClassName = ID then begin Form:=Screen.Forms[i]; Form.BringToFront; Break; end; end; if Form = nil Then Form := TFormClass(FindClass(ID)).Create(Application); Result := Form; end; //呼叫建立一個Form的程式 var aForm:TForm; begin aForm:=ExecuteProcess('f12320_HoTktnoError'); end; 另外,在宣告Tf12320_HoTktnoError的單元裡,要在一開始時註冊該物件,如下: initialization begin RegisterClasses([Tf12320_HoTktnoError]); end; 這樣你就可以動態產生你要的Form了,且不需要去uses所有的單元 |
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
引言: 另外,在宣告Tf12320_HoTktnoError的單元裡,要在一開始時註冊該物件,如下: initialization begin RegisterClasses([Tf12320_HoTktnoError]); end; ================================================= 不好意思...我不太懂上面這段要怎麼作哩....^^"RegisterClasses是用來註冊物件類別用的.而initialization是在整個AP一開始執行時最先執行到的區段.利用這個區段,去註冊你所有的form物件.然後,你就可以用TFormClass(FindClass(FormName)).Create(Application)去create任何的form了. ps:我發我弄了一個地方,FormName其實指的是Form的ClassName,應是 if Form = nil Then Form := TFormClass(FindClass(FormName)).Create(Application); //<--這裡的FormName指的是Form的ClassName才對,即傳入function的參數要傳form的ClassName,而不是formName Result := Form; |
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
|
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
引言: 請問是把那段加在Tf12320_HoTktnoError的單元檔裡(最下面)囉... 可是我執行到 Form := TFormClass(FindClass(FormName)).Create(Application); 後出現class f12320_HoTktnoError not found哩... 那表示還沒有註冊啊,真的不用use嗎... 發表人 - cosuki 於 2003/12/25 16:58:48你應該是傳入參數打錯了吧,出現的訊息是"class f12320_HoTktnoError not found",表示是f12320_HoTktnoError這個類別找不到,但你應該是要建立Tf12320_HoTktnoError這個類別才對,應該是Form := TFormClass(FindClass('Tf12320_HoTktnoError')).Create(Application); |
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
|
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
可以啦..我改成下面
PFormName:=PChar('T' FormName);
Form := nil;
for i := 0 to Screen.FormCount-1 do
begin
if Screen.Forms[i].ClassName = FormName then
begin
Form:=Screen.Forms[i];
Form.BringToFront;
Break;
end else
begin
Form := TFormClass(FindClass(FormName)).Create(Application);
Form.Parent:=self;
end;
end;
Result := Form; 呼叫時用
aForm:=ExecuteProcess('Tf12320_HoTktnoError');
aForm.Show;==>一定要在此show才不會重複哩... 謝謝你哦...讓我多學了一點^o^
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |