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

請教一個form之間傳值的怪現象

缺席
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-05 16:09:03 IP:220.161.xxx.xxx 未訂閱
我有一個問題很奇怪,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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-05 17:03:35 IP:222.35.xxx.xxx 未訂閱
你把代碼貼上來讓大家看一下比較好確認問題。我想可能是變量串了。
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-06 12:42:29 IP:220.161.xxx.xxx 未訂閱
請問一下fmMain.label1.caption和label1.caption這兩個有沒有什麽不同?我發現我在fmA更改fmMain的label1的值后,回到fmMain調試時,發現fmMain.label1.caption的值和label1.caption的值不一樣!被改動的是fmMain.label1.caption的值,這是爲什麽?兩個不是一樣嗎?
cxg
中階會員


發表:116
回覆:192
積分:76
註冊:2004-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-06 13:49:09 IP:222.35.xxx.xxx 未訂閱
這兩個LABEL當然不一樣。fmMain.label1.caption是指在fmMain上的LABEL1,而label1.caption省略了窗体名稱。比如你在fmA上用label1.caption時實際上應該是fmA.label1.caption,他當然和fmMain.label1.caption不一下。
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-06 17:55:20 IP:222.78.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-07 14:16:40 IP:222.35.xxx.xxx 未訂閱
watch list是什麽東東呢,我沒用過。怎麽添加label1.caption和fmMain.label1.caption。最好把代碼貼上來看一下,大家討論一下。
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-08 22:10:44 IP:222.78.xxx.xxx 未訂閱
不是小弟不想貼代碼上來,由於代碼比較長,我覺得只貼那幾個關鍵部分各位還是很難看出什麽原因來,因爲我新建一個測試就沒有這個問題。只是想請教一下什麽情況下才會出現這種問題?謝謝了。
cxg
中階會員


發表:116
回覆:192
積分:76
註冊:2004-02-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-09 09:22:49 IP:222.35.xxx.xxx 未訂閱
引言: 不是小弟不想貼代碼上來,由於代碼比較長,我覺得只貼那幾個關鍵部分各位還是很難看出什麽原因來,因爲我新建一個測試就沒有這個問題。只是想請教一下什麽情況下才會出現這種問題?謝謝了。
我做了一個例子或許對你有一點幫助: 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-09 09:34:19 IP:222.35.xxx.xxx 未訂閱
form1.Label1.caption 為100 form1.Label2.caption 為0    
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-09 17:57:22 IP:218.5.xxx.xxx 未訂閱
我終于解決了原來是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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-09 20:36:22 IP:61.31.xxx.xxx 未訂閱
這沒什麼好奇怪的! 在第一次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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-09 21:52:06 IP:220.161.xxx.xxx 未訂閱
嗯謝謝wameng大大,主要我之前都沒考慮到是project文件造成的問題,都把範圍鎖定在fmMain上了,今天無意調試一下才發現錯誤的,请问將Login部分寫成Function的用意何在?不好意思問了這麽多呵呵
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-10 09:39:53 IP:61.222.xxx.xxx 未訂閱
寫成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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-10 12:22:45 IP:218.5.xxx.xxx 未訂閱
謝謝wameng版主了!您講的很詳細,但是我還是把分數給cxg大大吧,感謝他的熱情回答,請別見怪!
eric039
中階會員


發表:57
回覆:126
積分:51
註冊:2002-11-30

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-09-08 17:25:08 IP:202.39.xxx.xxx 未訂閱
那要請問 wameng 要如何把 Login Form 的值傳到 Main From 麻煩到我發問的地方回應一下 謝謝 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=78099 Eric Lin
------
Eric Lin
系統時間:2024-04-24 21:32:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!