首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

请教一个关于两个窗体切换的有关问题,多谢

2012-08-02 
请问一个关于两个窗体切换的问题,谢谢!我写了个程序,一共有三个窗体,Form1、Form2、Form3,其中Form2为登录框

请问一个关于两个窗体切换的问题,谢谢!
我写了个程序,一共有三个窗体,Form1、Form2、Form3,其中Form2为登录框,Form1和Form3是两个独立的窗体,分别有自己独立的程序。我想实现,从登录框Form2登录后,根据条件,会打开Form1和Form3中的一个窗体,另一个窗体不会打开,也不被创建。在Form1和Form3的界面上各有一个按钮button,他的用处是把当前的窗体关闭掉,是真正的关闭,不是隐藏起来,然后创建打开另一个窗体。相关代码段如下:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {
  Application->Initialize();
  Form2=new TForm2(Application);
  if(Form2->ShowModal()!=mrOk)
  {
  delete Form2;
  Application->Terminate();
  return 0;
  }
  else
  {
  delete Form2;
  Form2=NULL;
  }
  if(Form1->ShowModal()==mrOk)
  {
  delete Form1;
  Form1=NULL;
  Application->CreateForm(__classid(TForm3), &Form3);
  }

  if(Form3->ShowModal()==mrOk)
  {
  delete Form3;
  Form3=NULL;
  Application->CreateForm(__classid(TForm1), &Form1);
  }

  //Application->CreateForm(__classid(TForm1), &Form1);
  //Application->CreateForm(__classid(TForm3), &Form3);
  Application->Run();
  }
-----------------------
Unit1.cpp
void __fastcall TForm1::Button129Click(TObject *Sender)
{
 ModalResult=mrOk;
}
-----------------------
Unit3.cpp
void __fastcall TForm3::Button26Click(TObject *Sender)
{
 ModalResult=mrOk;
}

我也试用Form1->close();但他会将Form3也一起关掉。我也试过把Application->CreateForm(__classid(TForm1), &Form1);加入到Unit3.cpp中,还试过很多办法,但是包括上面贴出的代码段都是编译能通过,执行就会出Debugger Exception Notification的错误框。希望各位高手能够指点一下小弟,不胜感激,谢谢!

[解决办法]
说个笨办法吧:
创建一个主窗体,在主窗体中创建一个新线程,新线程中分别调用Form1和Form3,根据ShowModal的结果来判定是否调用另一个窗体,如:

C/C++ code
TFormMain::TFromMain() {    ThreadControl *thread = new ThreadControl();    thread->WaitFor();    delete thread;    Application->Terminate();}class ThreadControl : public TThread {private:    int m_idAction;    ......};ThreadControl::Execute() {    m_idAction = ACTION_SHOW_FORM1;    while ( m_idAction != ACTION_EXIT ) {        switch ( m_idAction ) {        case ACTION_SHOW_FORM1 :             Synchronize(ShowForm1);             break;        case ACTION_SHOW_FORM3 :             Synchronize(ShowForm3);             break;        }    }}void __fastcall ThreadControl::ShowForm1() {    TForm1 *form = new TForm1(...);    form->ShowModal();    m_idAction = form->NextAction();    delete form;}TForm1::bnOkClick(TObject *Sender) {    switch ( status ) {    case .....        m_idNextAction = ACTION_SHOW_FORM3;        break;    case ....        m_idNextAction = ACTION_EXIT;    }    ModalResult = mrOk;}TForm1::NextAction() {    return m_idNextAction;}
[解决办法]
主窗体是谁?主窗体关闭了,程序也就关闭了,可以新增加一个主窗体,在登陆后创建主窗体,再根据条件创建form1或者form3

热点排行