【動態Form】副程式處理上,無法正常傳值 |
尚未結案
|
uuujjj
一般會員 發表:31 回覆:59 積分:18 註冊:2002-09-28 發送簡訊給我 |
各位前輩高手大家好:
我遇到了一件對我而言,蠻棘手的問題…:::(>_<):::
希望前輩們能大發慈悲為我解答~謝謝~ 是這樣的,在討論區有看到這篇文章:
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 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
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 發送簡訊給我 |
引言: 你好:謝謝ha0009前輩的指點迷津~^0^ 我大致瞭解您所表達的含意了… 不過,恕我功力太淺了,不知道您說將該值手動帶入Form2的變數~ 是指將o_Class…還是什麼??帶入Form2中呢? 不好意思~~麻煩前輩了…(^__^")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
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
uuujjj
一般會員 發表:31 回覆:59 積分:18 註冊:2002-09-28 發送簡訊給我 |
引言: 你好:謝謝ha0009前輩的範例, 有試著照您的指點去修改, 但是,debug後它的錯誤出現在procedure Tunit03.send (Form : TForm2); 這一行,不知道哪裡未宣告到,還是… 不好意思…::>0<::: 一直麻煩您…感激~ 下面這裡是我上傳了我的程式,煩請您過目,謝謝~ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38899procedure 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
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
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 發送簡訊給我 |
引言: 你好:感謝ha0009前輩的指點~終於恍然大悟了…^0^ 好高興喔~又學到東西了~ 在宣告區使用到其它unit type內的宣告,就必需要將該unit宣告在interface下方, 是這樣嗎?? 嗯嗯…經過這次,我又要來加深研究一番了… 免得每欠都麻煩前輩您…^^" 總之,謝謝您,問題已迎刃而解了~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. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |