請教一個form之間傳值的怪現象 |
缺席
|
oktony
中階會員 發表:67 回覆:132 積分:64 註冊:2004-12-05 發送簡訊給我 |
我有一個問題很奇怪,fmLogin是登陸界面,輸入密碼正確后我要傳一個權限值給fmMain,然後根據fmMain的這個值來判斷是否有有權按下fmA的一個button(fmA為fmMain的一個按鈕呼叫出來),不知道爲什麽fmA讀這個值得時候就是為空,我換了一個方法debug:把這個值用fmMain的一個label替代(默認caption爲"label1"),fmLogin把這個值傳給fmMain的label1,運行時可以看到label的值的確是被改掉了,但是非常奇怪的是,fmA呼叫出來的時候在fmA讀這個label的值卻是默認的"label1",畫面上明明還可以看到label的值已經改變了阿,而且在fmA寫個更改這個label的值也沒有作用,不會提示任何錯誤。但是我重新建一個空白的project測試卻完全正常,不知道什麽會這樣。以前也踫到過類似的情況很是無奈,請問到底是怎麽回事?謝謝!
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
|
oktony
中階會員 發表:67 回覆:132 積分:64 註冊:2004-12-05 發送簡訊給我 |
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
|
oktony
中階會員 發表:67 回覆:132 積分:64 註冊:2004-12-05 發送簡訊給我 |
謝謝cxg,您說的意思我明白,但我的意思是我在fmMain裏向watch list同時添加了label1.caption和fmMain.label1.caption這2個變量(fmA沒有任何label),然後通過fmA改變了fmMain的label值后,可以在watch list裏看到label1.caption和fmMain.label1.caption的值是不一樣的,label1.caption的值並沒有被改變,只有後者才變了,可以推斷fmMain畫面上那個label的值是label1.caption的而不是fmMain.label1.caption,搞不懂爲什麽會這樣,我看了應該沒有變量串了啊?
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
|
oktony
中階會員 發表:67 回覆:132 積分:64 註冊:2004-12-05 發送簡訊給我 |
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
引言: 不是小弟不想貼代碼上來,由於代碼比較長,我覺得只貼那幾個關鍵部分各位還是很難看出什麽原因來,因爲我新建一個測試就沒有這個問題。只是想請教一下什麽情況下才會出現這種問題?謝謝了。我做了一個例子或許對你有一點幫助: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } a : integer; end; var Form1: TForm1; a : integer=100; implementation {$R *.dfm} procedure test; begin form1.Label1.caption := inttostr( a); end; procedure TForm1.Button1Click(Sender: TObject); begin test; Label2.caption := inttostr( a); end; end. 執行後的結果如下圖,兩個變量a的值顯然不同。 |
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
|
oktony
中階會員 發表:67 回覆:132 積分:64 註冊:2004-12-05 發送簡訊給我 |
我終于解決了原來是project文件寫法錯誤的問題,如下:
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TfmMain, fmMain);
fmLogin:= TfmLogin.Create(Application);
if fmLogin.ShowModal <> mrOK then
Application.Terminate
else
begin
Application.CreateForm(TfmMain, fmMain);
Application.Run; 重寫了兩次Application.CreateForm(TfmMain, fmMain);,導致fmMain傳值不正常,估計是建立了兩個副本,我不太懂怎麽解釋呵呵,我驗證登錄密碼的事件改寫在fmMain就正常了。也麻煩前輩幫我分析一下這種寫法的錯誤。謝謝!
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
這沒什麼好奇怪的!
在第一次Create fmMain 被 Application誤認為是 MainForm。
因此 畫面上當然顯示 第一個。
爾後第二個相同的fmMain 又被建立了。然第一次的位址就被覆蓋了。
第一次所Create fmMain 變成了幽靈。
所以你改變的為第二次Create fmMain 。當然畫面上無動於衷。
begin Application.Initialize; Application.CreateForm(TDM, DM); fmLogin:= TfmLogin.Create(Application); if fmLogin.ShowModal=mrOK then begin Application.CreateForm(TfmMain, fmMain); Application.Run; end; end.另外建議將Login部分寫成Function 。 除非你在OnClose 設成 CaFree 否則fmLogin是沒有被釋放掉的。 參考。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ 發表人 - wameng 於 2005/06/09 21:01:59 |
oktony
中階會員 發表:67 回覆:132 積分:64 註冊:2004-12-05 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
寫成Function 的用於主要讓程式看起來比較簡潔有力。
另外也可讓其強制釋放所建立的表單資源(如:fmLogin)。
假設我在 fmLogin 該單元中定義一公有函數 Function UserLogin:Boolean; .. Function UserLogin:Boolean; begin fmLogin:= TfmLogin.Create(Application); Try Result := fmLogin.ShowModal=mrOK ; {一般會在此檢查輸入帳號及密碼的正確性} Finally FreeandNil(fmLogin);{釋放物件避免重複呼叫造成資源浪費} end; end; 在 Project Source 中就變成。 begin Application.Initialize; Application.CreateForm(TDM, DM); if UserLogin then begin Application.CreateForm(TfmMain, fmMain); Application.Run; end; end.參考 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ |
oktony
中階會員 發表:67 回覆:132 積分:64 註冊:2004-12-05 發送簡訊給我 |
|
eric039
中階會員 發表:57 回覆:126 積分:51 註冊:2002-11-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |