全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1451
推到 Plurk!
推到 Facebook!

如何傳物件參考..???

尚未結案
cosuki
一般會員


發表:10
回覆:40
積分:10
註冊:2003-06-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-24 15:50:41 IP:61.219.xxx.xxx 未訂閱
我寫了一個程序,希望動態開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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-25 10:25:28 IP:61.222.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-25 13:56:02 IP:61.219.xxx.xxx 未訂閱
另外,在宣告Tf12320_HoTktnoError的單元裡,要在一開始時註冊該物件,如下: initialization begin RegisterClasses([Tf12320_HoTktnoError]); end; ================================================= 不好意思...我不太懂上面這段要怎麼作哩....^^"
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-25 15:13:47 IP:61.222.xxx.xxx 未訂閱
引言: 另外,在宣告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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-25 16:56:14 IP:61.219.xxx.xxx 未訂閱
請問是把那段加在Tf12320_HoTktnoError的單元檔裡(最下面)囉... 可是我執行到 Form := TFormClass(FindClass(FormName)).Create(Application); 後出現class f12320_HoTktnoError not found哩... 那表示還沒有註冊啊,真的不用use嗎... 發表人 - cosuki 於 2003/12/25 16:58:48
cosuki
一般會員


發表:10
回覆:40
積分:10
註冊:2003-06-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-25 17:06:11 IP:61.219.xxx.xxx 未訂閱
啊...小妹我實在是太笨啦..這個也要改成輸入物件 aForm:=ExecuteProcess('Tf12320_HoTktnoError'); 但是,和我一開始寫的一定... 一個視窗會被重複開起哩...><
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-25 17:49:59 IP:61.222.xxx.xxx 未訂閱
引言: 請問是把那段加在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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-25 17:55:22 IP:61.219.xxx.xxx 未訂閱
嗯..我有發現到... 所以就是每個會被呼叫到的from的最下面都加入 initialization begin RegisterClasses([t******]); end; 可是這樣form還是重複開哩... if Form = nil Then或if Screen.Forms[i].ClassName = ID then 都無法過濾重複的from ,show時,不要開
cosuki
一般會員


發表:10
回覆:40
積分:10
註冊:2003-06-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-25 18:06:54 IP:61.219.xxx.xxx 未訂閱
可以啦..我改成下面 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^
系統時間:2024-11-25 4:24:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!