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

請問如何在Button中撰寫關閉MDIChild的程式?

尚未結案
clio4177
一般會員


發表:28
回覆:21
積分:9
註冊:2002-07-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-27 22:14:03 IP:140.135.xxx.xxx 未訂閱
各位大大: 請問我用MDI設計撰寫程式,首先是先進入login的畫面,但經過登入確認後,卻無法關閉login這個子畫面,請問該如何解決?我的程式碼如下: void __fastcall TEDDMLogin::OKClick(TObject *Sender) { input_uname= Edit1->Text; input_pword= Edit2->Text; if(time_check <= 3) { if ((input_uname == "guest") && (input_pword == "555")) { MainForm->ToolButton13->Enabled= true; MainForm->ToolButton14->Enabled= true; MainForm->ToolButton15->Enabled= true; time_check= 0; EDDMLogin->Action= caFree; //關閉這個子視窗 } else { Edit1->Text=""; Edit2->Text=""; ShowMessage("The Username or Password is not correct."); time_check= time_check ; } } else { ShowMessage("The EDDM login is over 3 times."); EDDMLogin->Action= caFree; //關閉這個子視窗 } }
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-28 09:21:50 IP:61.224.xxx.xxx 未訂閱
引言: 各位大大: 請問我用MDI設計撰寫程式,首先是先進入login的畫面,但經過登入確認後,卻無法關閉login這個子畫面,請問該如何解決?我的程式碼如下:
void __fastcall TEDDMLogin::OKClick(TObject *Sender)
{
  input_uname= Edit1->Text;
  input_pword= Edit2->Text; 
  if(time_check <= 3)
  {
    if ((input_uname == "guest") && (input_pword == "555"))
    {
      MainForm->ToolButton13->Enabled= true;
      MainForm->ToolButton14->Enabled= true;
      MainForm->ToolButton15->Enabled= true;
      time_check= 0;
      EDDMLogin->Action= caFree;  //關閉這個子視窗
    }
     else
     {
       Edit1->Text="";
       Edit2->Text="";
       ShowMessage("The Username or Password is not correct.");
       time_check= time_check  ;
     }
  }
   else
    {
      ShowMessage("The EDDM login is over 3 times.");
      EDDMLogin->Action= caFree; //關閉這個子視窗
    }
}
對不起,請問一下,為什麼
      EDDMLogin->Action= caFree; //關閉這個子視窗
這樣就可以關閉子視窗呢? 我只知道,在 TForm 的 OnClose 事件中,有可能用到 caFree 這個東西,如下是 BCB 的 Online Help
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if (MessageDlg("Close application ?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0) == mrYes)
    Action = caFree;
  else
    Action = caMinimize;
}
我想,如果您要關閉視窗,只需要
      EDDMLogin->Close(); //關閉這個子視窗
這樣就可以了。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
clio4177
一般會員


發表:28
回覆:21
積分:9
註冊:2002-07-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-28 10:06:49 IP:140.135.xxx.xxx 未訂閱
dell 您好: 因為我之前也是使用 EDDMLogin->Close(); 會發生無法關閉的現象,其次即使利用Hide來隱藏視窗也會發生錯誤!! 所以想請教各位大大,類似這種問題該如何解決?
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-28 12:00:16 IP:203.204.xxx.xxx 未訂閱
clio4177, 您好 我修改了一下您的code,您再試試看這樣是否符合您的需求。  
EDDMLogin->Action= caFree; //關閉這個子視窗
改為
Close();
然後在EDDMLogin的OnClose的Event裡增加
Action = caFree;
 
================================= 涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 是非終日有,不聽自然無 天下本無事,庸人自擾之
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-28 14:31:19 IP:203.204.xxx.xxx 未訂閱
引言: dell 您好: 因為我之前也是使用 EDDMLogin->Close(); 會發生無法關閉的現象,其次即使利用Hide來隱藏視窗也會發生錯誤!! 所以想請教各位大大,類似這種問題該如何解決?
因為沒有您的 code 只能由您提供部分的 code 來判斷,有可能是您的 EDDMLogin 根本就不能用。 也許在 .cpp 的前面可以看到 TEDDMLogin *EDDMLogin; void __fastcall TEDDMLogin::TEDDMLogin( 這樣,這個 EDDMLogin 在整個 .cpp 中都可以使用,甚至別的 .cpp 只要有 include 該 header 檔也可以用,但如果不小心用,就會發生 exception!! 發生的原因是,如果這個表單是您自己 new 的,而不是由 project 幫您 new 的,這時,如果您不是用 EDDMLogin = new TEDDMLogin(Application); 而是另外宣告的話,如: TEDDMLogin *LoginForm= new TEDDMLogin(Application); 這時,使用 EDDMLogin 就會 exception。 在 .cpp 中,最好使用 this 來取代 EDDMLogin ,例如: this->Close(); 當然,這個 this 是可以省略的,也就如 tech_state 版主所說的方法,用 Close() 就可以了。如果您的 OnClose 本來就沒有用,那就不必特別去寫 Action=caFree; 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
clio4177
一般會員


發表:28
回覆:21
積分:9
註冊:2002-07-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-28 20:38:59 IP:140.135.xxx.xxx 未訂閱
dllee: 以下是我的MDI主頁的程式碼: //--------------------------------------------------------------------------- #include  #pragma hdrstop #include "EDDMMain.h" #include "About.h" #include "login.h" //-------------------------------------------------------------------- #pragma resource "*.dfm" TMainForm *MainForm; //-------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent *Owner) : TForm(Owner) { } //-------------------------------------------------------------------- void __fastcall TMainForm::CreateMDIChild(String Name) { TMDIChild *Child; //--- create a new MDI child window ---- Child = new TMDIChild(Application); Child->Caption = Name; if (FileExists (Name)) Child->Memo1->Lines->LoadFromFile(Name); } //------------------------------------------------------------------- void __fastcall TMainForm::FormShow(TObject *Sender) { ToolButton13->Enabled= false; //功能鍵false ToolButton14->Enabled= false; ToolButton15->Enabled= false; ToolButton16->Enabled= false; ToolButton19->Enabled= false; ToolButton20->Enabled= false; TEDDMLogin *EDDMLogin; //呼叫EDDMLogin頁面 EDDMLogin = new TEDDMLogin(Application); } 而下面是EDDMLogin的程式碼: //-------------------------------------------------------------------- #include #pragma hdrstop #include "login.h" #include "EDDMMain.h" //-------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TEDDMLogin *EDDMLogin; int time_check=0; //參數宣告 String input_uname,input_pword; String set_uname,set_pword; //-------------------------------------------------------------------- __fastcall TEDDMLogin::TEDDMLogin(TComponent* Owner) : TForm(Owner) { } //-------------------------------------------------------------------- void __fastcall TEDDMLogin::BitBtnOK1Click(TObject *Sender) { input_uname= Edit1->Text; input_pword= Edit2->Text; set_uname= "guest"; //內定之使用者及密碼 set_pword= "5555"; if(time_check <= 3) { if ((input_uname == set_uname) && (input_pword == set_pword)) { MainForm->ToolButton13->Enabled= true; MainForm->ToolButton14->Enabled= true; MainForm->ToolButton15->Enabled= true; MainForm->ToolButton16->Enabled= true; MainForm->ToolButton19->Enabled= true; MainForm->ToolButton20->Enabled= true; time_check= 0; EDDMLogin->Close(); //關閉EDDMLogin頁面 //出現無法關閉此頁面的情形 } else { Edit1->Text=""; Edit2->Text=""; ShowMessage("The Username or Password is not correct. Please Check it."); time_check= time_check ; } } else { ShowMessage("The EDDM login is over 3 times. The EDDM will be close."); MainForm->Close(); //關閉EDDM主頁 } } //-------------------------------------------------------------------- void __fastcall TEDDMLogin::BitBtnCancle2Click(TObject *Sender) { EDDMLogin->Close(); //關閉EDDM及EDDMLogin的頁面 MainForm->Close(); } //-------------------------------------------------------------------- void __fastcall TEDDMLogin::FormShow(TObject *Sender) { TMainForm *MainForm; MainForm= new TMainForm(Application); } //-------------------------------------------------------------------- 如上述程式碼中,當完成Login辨識後,則進入EDDM主頁中但是卻無法關閉這個EDDMLogin頁面。但如果辦事錯誤超過3次或取消登入時,整個EDDM畫面都可以正常關閉,唯獨無法單獨關閉EDDMLogin這個畫面。請問該如何處理這個問題??
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-29 09:52:21 IP:61.224.xxx.xxx 未訂閱
引言: dllee: 以下是我的MDI主頁的程式碼:
//---------------------------------------------------------------------------
#include 
#pragma hdrstop    #include "EDDMMain.h"
#include "About.h"
#include "login.h"
//--------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm; // 如同我說的這個 MainForm 已是 Global 變數    //--------------------------------------------------------------------    __fastcall TMainForm::TMainForm(TComponent *Owner)
        : TForm(Owner)
{
}
//--------------------------------------------------------------------    void __fastcall TMainForm::CreateMDIChild(String Name)
{
        TMDIChild *Child;
        //--- create a new MDI child window ----
        //每一個 Child 都是動態載入的,在 TMDIChild 中您就看不到
        // TMDIChild *MDIChild; 的整體變數,因為用那個鐵死,所以
        // BCB 就沒幫您放。
        Child = new TMDIChild(Application);
        Child->Caption = Name;
        if (FileExists (Name))
                Child->Memo1->Lines->LoadFromFile(Name); 
}
//-------------------------------------------------------------------    void __fastcall TMainForm::FormShow(TObject *Sender)
{
  ToolButton13->Enabled= false;  //功能鍵false
  ToolButton14->Enabled= false;
  ToolButton15->Enabled= false;
  ToolButton16->Enabled= false;
  ToolButton19->Enabled= false;
  ToolButton20->Enabled= false;      TEDDMLogin *EDDMLogin;  //呼叫EDDMLogin頁面
  // 在此您又自行定義了 EDDMLogin 這個變數,它與 EDDMLogin.cpp 的那個整體變數同名
  // C   在這樣的狀況下,會將目前這個 EDDMLogin 視為區域變數,只在
  // TMainForm::FormShow() 內有效
  // 也就是說,這個 EDDMLogin 與 EDDMLogin.cpp 的那個不同,
  // 也表示說,您在 EDDMLogin.cpp 中直接使用 EDDMLogin 是危險的,
  // 因為它根本就沒有被 new 過!
  // 當然,這還要看您的 Project 是如何設定在,在 Project Option 中
  // 可以設定那些表單是自動 new ,那些是自己 new,如果您已設成自己 new
  // 那只要在  EDDMLogin.cpp 中直接使用 EDDMLogin 就是 Exception!!
  EDDMLogin = new TEDDMLogin(Application);
  // 另外,您只有 new 並沒有 show 它?!    }    而下面是EDDMLogin的程式碼:    //--------------------------------------------------------------------    #include 
#pragma hdrstop    #include "login.h"
#include "EDDMMain.h"
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TEDDMLogin *EDDMLogin; // 如同我說的這個 EDDMLogin 已是 Global 變數    int time_check=0;                    //參數宣告
String input_uname,input_pword;
String set_uname,set_pword;
//--------------------------------------------------------------------
__fastcall TEDDMLogin::TEDDMLogin(TComponent* Owner)
        : TForm(Owner)
{
}
//--------------------------------------------------------------------    void __fastcall TEDDMLogin::BitBtnOK1Click(TObject *Sender)
{
  input_uname= Edit1->Text;
  input_pword= Edit2->Text;
  set_uname= "guest";           //內定之使用者及密碼
  set_pword= "5555";      if(time_check <= 3)
  {
    if ((input_uname == set_uname) && (input_pword == set_pword))
    {
      // 在此使用 MainForm 如果沒有問題,表示您的 MainForm 應該是 Application 已 new 出
      MainForm->ToolButton13->Enabled= true;
      MainForm->ToolButton14->Enabled= true;
      MainForm->ToolButton15->Enabled= true;
      MainForm->ToolButton16->Enabled= true;
      MainForm->ToolButton19->Enabled= true;
      MainForm->ToolButton20->Enabled= true;
      time_check= 0;
      EDDMLogin->Close();  //關閉EDDMLogin頁面       
                           //出現無法關閉此頁面的情形    
      // 應使用 Close() 或 this->Close() 
    }
     else
     {
       Edit1->Text="";
       Edit2->Text="";
       ShowMessage("The Username or Password is not correct. Please Check it.");
       time_check= time_check  ;
     }
  }
   else
    {
      ShowMessage("The EDDM login is over 3 times. The EDDM will be close.");
      // 因為您的 MainForm 是正常由 Application new 出來的,所以可以正常關閉
      MainForm->Close();  //關閉EDDM主頁
    }    }
//--------------------------------------------------------------------
void __fastcall TEDDMLogin::BitBtnCancle2Click(TObject *Sender)
{
  EDDMLogin->Close();        //關閉EDDM及EDDMLogin的頁面
  // 改 Close() 或 this->Close() 
  MainForm->Close();
}
//--------------------------------------------------------------------    void __fastcall TEDDMLogin::FormShow(TObject *Sender)
{
 // 這段應該全部都是多餘的程式碼,全部都可以刪除!
  // 與 TMainForm::FormShow() 相同的問題!!
  TMainForm *MainForm;
  MainForm= new TMainForm(Application);    }
//--------------------------------------------------------------------
如上述程式碼中,當完成Login辨識後,則進入EDDM主頁中但是卻無法關閉這個EDDMLogin頁面。但如果辦事錯誤超過3次或取消登入時,整個EDDM畫面都可以正常關閉,唯獨無法單獨關閉EDDMLogin這個畫面。請問該如何處理這個問題??
您可以看一下您的專案主 cpp 檔,就是那個沒有表單,只有 .cpp 的那個檔,您可以看到類似:
//---------------------------------------------------------------------
#include 
#pragma hdrstop
//---------------------------------------------------------------------
USEFORM("Main.cpp", MainForm);
USEFORM("ChildWin.cpp", MDIChild);
USERES("mdiapp.res");
USEFORM("EDDMLogin.cpp", EDDMLogin);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        Application->Initialize();
        Application->CreateForm(__classid(TMainForm), &MainForm);
        Application->CreateForm(__classid(TEDDMLogin), &EDDMLogin);
         Application->Run();            return 0;
}
//---------------------------------------------------------------------
如果看到像是上面的 code 表示 MainForm 及 EDDMLogin 都是 Application 已 new 出,只要有 include 它們的 header 檔,就可以直接使用 MainForm 及 EDDMLogin。如果您的 code 真的如上,則所有您自己 new 的都刪除, MainForm 會在 Application->Run(); 時自動秀出,在它秀出時,如同您攔下 OnShow ,再加入
if(EDDMLogin->ShowModal()!=mrOk) // 如果 Login 不成功,則
  Close(); // 主表單關閉,也就等於 Application 關閉
而您在 EDDMLogin.cpp 中原本要使用 Close() 的地方,則改用 ModalResult = mrOk; // 表示正常 Login ,會自動關閉 EDDMLogin 視窗 或 ModalResult = mrCancel; // 表示 Login 失敗,也會自動關閉 EDDMLogin 視窗 我猜想,您應該是已經會一些 C/C 但剛接觸 BCB 吧,建議您先看看一些入門的書,會比較快進入狀況,因為您的問題似乎... 與眾不同 >沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
發表人 - dllee 於 2003/06/29 09:55:56
------
http://www.ViewMove.com
系統時間:2024-05-06 20:09:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!