MDI Form 中要如何指定關閉 MDIChild |
答題得分者是:Elic
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
程式架構有三張Form 其中有Main Form 與 MDIChild (Form2 Form3 )
架構如下圖
程式由MAIN 開啟Logun Form 當輸入的帳號密碼正確,會開啟 VIEW Form,這時候Login Form 應該要關閉,依照我的程式碼,他會連View Form 一起關閉, Login Form程式碼如下
implementation uses Unit1,Unit3; {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin Form1.Names := Edit1.Text; Form1.Passw := Edit2.Text; //判斷條件 if Form1.Names = '123' then Begin if Form1.Passw = '456' then begin try //第三張表 Form3 := TForm3.Create(Self); Form3.Show; //Form2.Close; finally FreeAndNil(Form2); end; end else begin ShowMessage('帳號密碼有誤'); end; end else Begin ShowMessage('帳號密碼有誤'); end; end; procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:= cafree; end;程式在此下載:http://delphi.ktop.com.tw/topic.php?TOPIC_ID=66650 數學+程式+經驗=不懂^^ |
jeffreck
高階會員 發表:247 回覆:340 積分:197 註冊:2003-01-23 發送簡訊給我 |
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
感謝Jeffreck的回覆
因為 Tform3 的父表單是TForm2
所以關閉的時候會連TFoem3一同關閉
下面是改過的
implementation uses Unit1,Unit3; {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin Form1.Names := Edit1.Text; Form1.Passw := Edit2.Text; //判斷條件 if Form1.Names = '123' then Begin if Form1.Passw = '456' then begin try //第三張表 Form3 := TForm3.Create(Form1); Form3.Show; finally Form2.Close; //使用Form2的釋放表單記憶體,不然第二次開啟後會錯誤 end; end else begin ShowMessage('帳號密碼有誤'); end; end else Begin ShowMessage('帳號密碼有誤'); end; end; procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:= cafree; end;數學 程式 經驗=不懂^^ |
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
HIHI樓上二位大大好
我只是來插花的看了一下程式碼 依功能需求
小的有幾個建議如果有錯還請大大指正
Unit1 if (Assigned(Form2)=False) then begin//用來判別子視窗是否已經存在 // 因為你的功能看起來不像點一次就要出現一次Form2 QQ Form2 := TForm2.Create(Self); try //Form2.ShowModal; //出現錯誤不可使用此型態的win 視窗 Form2.Show; except FreeAndNil(Form2); end; end; Unit2 Unit3 在Form2及Form3.OnClose的程序中 可以直接用FreeAndNil(Form2) 去取代Action=caFree;如果是這種方式要去判別關掉特定子視窗您可以用 Assigned(Form2)=True 來取得Form2 是否存在 再下Close指令 但這種方式不適合類似Word的程式 利用Assigned可以順便判別Form3是否已存在 加上一些小動作 來避免已經登入又再登入的問題 希望這有點幫助 搞不懂!搞不懂!永遠都搞不懂!! |
Elic
一般會員 發表:9 回覆:9 積分:8 註冊:2003-10-08 發送簡訊給我 |
juneo大大您好:
小弟大概把您的程式看了一下,並做了小修改,請juneo大大參考一下吧!
希望能幫上忙 Form1.Names := Edit1.Text;
Form1.Passw := Edit2.Text;
//判斷條件
if Form1.Names = '123' then
Begin
if Form1.Passw = '456' then
begin
try
//第三張表
//Form3 := TForm3.Create(Self);
//Form3.Show;
Application.CreateForm(TForm3,Form3);
Form3.Show; finally
FreeAndNil(Form2);
end;
end else begin
ShowMessage('帳號密碼有誤');
end;
end else Begin
ShowMessage('帳號密碼有誤');
end;
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
感謝 mine & Elic 熱烈的回答,
提供的方式我測試過都可以使用,令我又產生另一各困擾
可以直接用FreeAndNil(Form2) 去取代Action=caFree;
這兩各指令有什麼不同嗎?適合在哪種情況下用
我看過好幾本書 方式都有些不同,但是書中沒說什麼情況下能用
希望大大們能夠幫忙解說一下 謝謝 當我加上If(Assigned(Form2)=False) Then Begin
如果我要再度叫出Form2 的視窗 是不是要改變哪各屬性=True 數學 程式 經驗=不懂^^ 發表人 - juneo 於 2005/03/14 09:24:08
|
Elic
一般會員 發表:9 回覆:9 積分:8 註冊:2003-10-08 發送簡訊給我 |
Juneo大大您好
關於FreeAndNil(Form2)與Action=caFree的用法
小弟曾經試過一些做法,在這邊讓您參考一下: 舉個簡單的例子給您參考一下吧! 1.開2個Form分別為Form1與Form2
2.在Form1加入2個Button分別為Button1與Button2
3.在Button1加入下列程式碼
Application.CreateForm(TForm2,From2);
Form2.show;
4.在Button2加入FreeAndNil(Form2)
5.在Form2的OnClose事件中加入Action=caFree
6.Run 這樣您大概就可以了解了
希望對您有幫助
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
引言: Juneo大大您好 關於FreeAndNil(Form2)與Action=caFree的用法 小弟曾經試過一些做法,在這邊讓您參考一下: 舉個簡單的例子給您參考一下吧! 1.開2個Form分別為Form1與Form2 2.在Form1加入2個Button分別為Button1與Button2 3.在Button1加入下列程式碼 Application.CreateForm(TForm2,From2); Form2.show; 4.在Button2加入FreeAndNil(Form2) 5.在Form2的OnClose事件中加入Action=caFree 6.Run 這樣您大概就可以了解了 希望對您有幫助不好意思 照你的方式做 還是搞不懂有哪些差異,雖然有各種不同的變化 但是.....都可以想到解決的方式,例如 FreeAndNil(Form2) 是將FORM結束掉並且設定為Nil Action=caFree 是將FORM 結束掉且清除記憶體位址 是不是這樣 數學 程式 經驗=不懂^^ |
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |