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

【動態Form】副程式處理上,無法正常傳值

尚未結案
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-11 19:43:46 IP:211.74.xxx.xxx 未訂閱
各位前輩高手大家好: 我遇到了一件對我而言,蠻棘手的問題…:::(>_<)::: 希望前輩們能大發慈悲為我解答~謝謝~    是這樣的,在討論區有看到這篇文章: http://delphi.ktop.com.tw/topic.php?topic_id=19627請問該如何去做到動態開啟Form呢? 就試著去寫了一個Menu的程式來測試一下… 卻發現我這Form跟另一獨立開啟的unit(用來當副程式處理) 無法正常傳遞變數… 環境: 1,我開了二 Form和單一的unit : Form1、Form2、unit1、unit2、unit3 2,Form1:放了一MainMenu元件,只有一選項,其功能是開啟Form2,所以,該選單的Name我設為Form2。 3,其Form1的程式寫入下: procedure TForm1.Form2Click(Sender: TObject); //按下該選項 var o_Form:TForm; s_FormName:String; begin x:='test1'; //已在public宣告x為string s_FormName := 'T' TmenuItem(Sender).Name ; try o_Form := f_CreateFormByClassName(s_FormName); if o_Form = Nil then begin ShowMessage('錯誤'); Abort; end; o_Form.ShowModal; finally FreeAndNil(o_Form); end; end; function TForm1.f_CreateFormByClassName(const s_ClassName: string): TForm; var o_Class: TPersistentClass; begin o_Class := GetClass(as_ClassName); If o_Class <> nil then Result := TComponentClass(o_Class).Create(Application) as TForm else Result := nil; end; 4,接著在Form2上放了二個button:button1、button2是為了測試傳遞變數的差異處。 5,button1中寫下: showmessage(Form1.x); 此button1能正常的顯示出message為「test」。 6,button2中寫下這段: x:='test'; //已在Form2中的public宣告此變數x -> string testForm.send ; //呼叫unit3中的副程式★有問題的地方 7,再至unit3中寫下程式,大致如下: type Tunit03 = class(TForm) public procedure send ; end; var testForm: Tunit03; implementation uses unit2; procedure Tunit03.send ; begin showmessage(Form2.x) ; //★主要有問題處 end; initialization RegisterClass(Tunit03); end.
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-11 19:49:19 IP:211.74.xxx.xxx 未訂閱
而我主要的問題是… 程式中無法將變數傳至unit中的副程式作處理, 不知道是否還需任何的處理程序?? 剛開始,在unit3我將其class是歸給TObject, 可是發現無發傳值,所以才改為TForm, 然後,在每個unit最下方加上 initialization RegisterClass(Tunit03); 不過,發現仍無法正常傳值, 大概是我仍太嫰了…><||||||||||| 不知道該加上些什麼關鍵程式? 希望前輩們能不吝給予指導~謝謝~m(_ _)m
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-11 20:37:49 IP:61.56.xxx.xxx 未訂閱
你好:
procedure Tunit03.send ;
begin
   showmessage(Form2.x) ; //★主要有問題處
end;    var
  Form1: TForm1;    
上面紅色的部分可能是你犯的錯誤,藍字的宣告通常是 AutoCreate 時由 系統所帶入的。由於你的 Form 是由 f_CreateFormByClassName 函式產稱,但 你卻未將該值手動帶入 Form2 的變數內。因此產生結果與你的預期不符。 < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-11 23:05:00 IP:211.74.xxx.xxx 未訂閱
引言: 你好:
procedure Tunit03.send ;
begin
   showmessage(Form2.x) ; //★主要有問題處
end;    var
  Form1: TForm1;    
上面紅色的部分可能是你犯的錯誤,藍字的宣告通常是 AutoCreate 時由 系統所帶入的。由於你的 Form 是由 f_CreateFormByClassName 函式產稱,但 你卻未將該值手動帶入 Form2 的變數內。因此產生結果與你的預期不符。 < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
謝謝ha0009前輩的指點迷津~^0^ 我大致瞭解您所表達的含意了… 不過,恕我功力太淺了,不知道您說將該值手動帶入Form2的變數~ 是指將o_Class…還是什麼??帶入Form2中呢? 不好意思~~麻煩前輩了…(^__^")
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-11 23:57:35 IP:61.56.xxx.xxx 未訂閱
你好:
procedure TForm1.Button1Click(Sender: TObject);
begin
   testForm.send(Self);
end;    procedure Tunit03.send (Form : TForm2);
begin
   showmessage(Form.x) ; //★主要有問題處
end;
提供這個範例給你參考 < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-13 23:32:42 IP:211.74.xxx.xxx 未訂閱
引言: 你好:
procedure TForm1.Button1Click(Sender: TObject);
begin
   testForm.send(Self);
end;    procedure Tunit03.send (Form : TForm2);
begin
   showmessage(Form.x) ; //★主要有問題處
end;
提供這個範例給你參考 < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
謝謝ha0009前輩的範例, 有試著照您的指點去修改, 但是,debug後它的錯誤出現在procedure Tunit03.send (Form : TForm2); 這一行,不知道哪裡未宣告到,還是… 不好意思…::>0<::: 一直麻煩您…感激~ 下面這裡是我上傳了我的程式,煩請您過目,謝謝~ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38899
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-13 23:41:57 IP:61.56.xxx.xxx 未訂閱
你好:
unit Unit3;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, unit2;    type
  Tunit03 = class(TForm)
  public
    procedure send (Form:TForm2);
    { Public declarations }
  end;    var
  testForm: Tunit03;    implementation
{
因為宣告區已經有使用到 Unit2 內 TForm2 的宣告,所以須往上移    uses
  unit2;
}
procedure Tunit03.send(Form:TForm2) ;
begin
   showmessage(Form.x);
end;    initialization
  RegisterClass(Tunit03);    end.
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-14 00:02:39 IP:211.74.xxx.xxx 未訂閱
引言: 你好:
unit Unit3;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, unit2;    type
  Tunit03 = class(TForm)
  public
    procedure send (Form:TForm2);
    { Public declarations }
  end;    var
  testForm: Tunit03;    implementation
{
因為宣告區已經有使用到 Unit2 內 TForm2 的宣告,所以須往上移    uses
  unit2;
}
procedure Tunit03.send(Form:TForm2) ;
begin
   showmessage(Form.x);
end;    initialization
  RegisterClass(Tunit03);    end.
感謝ha0009前輩的指點~終於恍然大悟了…^0^ 好高興喔~又學到東西了~ 在宣告區使用到其它unit type內的宣告,就必需要將該unit宣告在interface下方, 是這樣嗎?? 嗯嗯…經過這次,我又要來加深研究一番了… 免得每欠都麻煩前輩您…^^" 總之,謝謝您,問題已迎刃而解了~
系統時間:2024-04-29 18:28:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!