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

MDI Form 中要如何指定關閉 MDIChild

答題得分者是:Elic
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-11 14:38:27 IP:211.75.xxx.xxx 未訂閱
程式架構有三張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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-11 14:58:29 IP:61.218.xxx.xxx 未訂閱
改一下 原為 //第三張表 Form3 := TForm3.Create(Self); <<< Form3.Show; 改為 //第三張表 Form3 := TForm3.Create(Form1); <<< Form3.Show; 發表人 - jeffreck 於 2005/03/11 15:02:25
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-11 17:15:43 IP:211.75.xxx.xxx 未訂閱
感謝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-11 18:11:12 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-13 23:32:05 IP:218.170.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-14 08:31:51 IP:211.20.xxx.xxx 未訂閱
感謝 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-14 20:23:45 IP:218.170.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-15 08:59:43 IP:211.75.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-15 09:35:16 IP:61.221.xxx.xxx 未訂閱
HIHI 關於這個問題呢 可以參考 http://delphi.ktop.com.tw/topic.php?topic_id=48788 http://delphi.ktop.com.tw/topic.php?topic_id=45708 Action=caFree 只有Free 的動作 並沒有作Nil的指向 所以如果只有Free掉Form 你再重建時會出現個錯誤訊息QQ 搞不懂!搞不懂!永遠都搞不懂!!
系統時間:2024-06-02 1:34:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!