2012-07-17 4 views
0

Formulaire 1: (frmStart)C++ Builder Forms s'écraser

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

Formulaire 2: (course)

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

Le problème est que mes premières charges de forme et se cache correctement. Lorsque le second formulaire ne charge aucun composant, seule une interface utilisateur graphique s'affiche. Lorsque le programme finit réellement, l'interface graphique revient à un état normal.

Où est-ce que je me suis trompé?

Répondre

1

L'utilisation de FormCreate n'est pas le bon endroit pour configurer votre formulaire. Utilisez plutôt le constructeur de style C++. J'appellerais probablement aussi la méthode Show d'ailleurs, comme le gestionnaire de boutons d'un autre formulaire, ou le constructeur du formulaire. J'utiliserais alors l'événement OnShow pour faire le «lot de choses»

2

Dans l'événement OnCreate, la variable frmRunning n'a pas encore été affectée, ce qui explique pourquoi le code plante. Puisque vous êtes déjà à l'intérieur de la classe de toute façon, il suffit d'utiliser à la place pointeur this de la méthode:

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

Ou simplement:

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

faire la même chose dans la méthode btnRunClick() - utiliser le pointeur this au lieu de frmStart variable:

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

Ou:

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

Et enfin, vous devriez utiliser l'opérateur new au lieu de la méthode TApplication::CreateForm(), et ne pas appeler Show() méthode jusqu'à ce que la forme est terminée en cours d'initialisation:

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... 
}