0

フォーム1:(frmStart)

void __fastcall TfrmStart::btnRunClick(TObject *Sender)
{
    frmStart->Hide();
    Application->CreateForm(__classid(TfrmRunning), &frmRunning);
}

フォーム2:(実行中)

void __fastcall TfrmRunning::FormCreate(TObject *Sender)
{
      frmRunning->Show(); 
 //Here i do a lot of stuff to run my main program
}

問題は、私の最初のフォームが適切にロードおよび非表示になることです。2番目のフォームがロードされると、コンポーネントは表示されず、クラッシュしたように見えるGUIのみが表示されます。プログラムが実際に終了すると、GUIは通常の状態に戻ります。

どこで私は間違えましたか?

4

2 に答える 2

2

OnCreateイベントでは、変数frmRunningがまだ割り当てられていないため、コードがクラッシュします。とにかくすでにクラス内にいるので、this代わりにメソッドのポインタを使用してください。

void __fastcall TfrmRunning::FormCreate(TObject *Sender) 
{ 
      //frmRunning->Show();  
      this->Show();  
} 

または単に:

void __fastcall TfrmRunning::FormCreate(TObject *Sender) 
{ 
      //frmRunning->Show();  
      Show();  
} 

btnRunClick()メソッドでも同じことを行います。変数thisの代わりにポインターを使用します。frmStart

void __fastcall TfrmStart::btnRunClick(TObject *Sender) 
{ 
    //frmStart->Hide(); 
    this->Hide(); 
    ...
} 

または:

void __fastcall TfrmStart::btnRunClick(TObject *Sender) 
{ 
    //frmStart->Hide(); 
    Hide(); 
    ...
} 

new最後に、メソッドの代わりに演算子を使用する必要があり、フォームの初期化が完了するまでメソッドTApplication::CreateForm()を呼び出さないでください。Show()

void __fastcall TfrmStart::btnRunClick(TObject *Sender)   
{   
    frmRunning = new TfrmRunning(Application);
    frmRunning->Show();   
    Hide();   
}   

__fastcall TfrmRunning::TfrmRunning(TComponent *Owner)   
    : TForm(Owner)
{   
   // initialize this Form as needed...
}   
于 2012-07-17T19:54:44.953 に答える
1

FormCreate を使用することは、フォームを設定するのに適切な場所ではありません。代わりに C++ スタイルのコンストラクターを使用してください。また、別のフォームのボタン ハンドラーやフォームのコンストラクターなど、別の場所から Show メソッドを呼び出すこともあるでしょう。次に、OnShow イベントを使用して「多くのこと」を行います。

于 2012-07-17T15:19:22.843 に答える