Comment puis-je afficher une forme finale à la sortie en Delphi?
Question
Cela devrait être simple pour quelqu'un. Je ne peux pas comprendre comment le faire.
A la sortie de mon programme, je veux cacher la principale forme et faire une forme finale « Thank You » apparaît lui-même, comme ceci:
procedure TMainForm.ExitExecute(Sender: TObject);
begin
MainForm.Visible := false;
ThankYouForm.Show;
MainForm.Close;
end;
Mais quand je fais ça, je reçois l'exception:
EInvalid Opération: Impossible de changer visible dans OnShow ou OnHide
Alors, comment puis-je afficher une forme finale, en se cachant la principale forme lors de la sortie d'un programme en Delphi?
Conclusion: Mghie a confirmé que ce que je voulais était correcte et aurait dû fonctionner. Cela indique que j'ai eu un bug quelque part dans mes procédures de sortie et la fermeture de mes formes qui apportait cette exception.
Maintenant que je sais que, il ne me prendra pas longtemps pour trouver et résoudre le problème.
trouvé le problème. Je fermais ma principale forme à partir du ThankYouForm, et en quelque sorte mis en boucle à travers dans ExitExecute et, eh bien, il a obtenu tous bondonnés up
Mais tout est bien à nouveau. Le MainForm.Hide avant la ThankYouForm.ShowModal fonctionne parfaitement.
Merci encore, les gars.
La solution
Vous pouvez le faire dans le gestionnaire de OnClose
de la forme principale. Assurez-vous de ShowModal
l'autre forme, car sinon il sera fermé immédiatement après la fermeture de la principale forme met fin à la demande:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Hide;
with TThankYouForm.Create(nil) do try
ShowModal;
finally
Free;
end;
Action := caFree;
end;
ou même
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Hide;
with TThankYouForm.Create(Application) do
ShowModal;
Action := caFree;
end;
Et assurez-vous de rendre le comportement en option -. Lorsque l'utilisateur ferme l'application, ils sont finis avec elle, et pas tout le monde est heureux avec les programmes qui sont si réticents à aller
Modifier
OK, montrant une forme à la fin de la période d'essai n'a en effet de sens. Et alors que je ne peux pas vraiment dire pourquoi votre code soulève l'exception - vous devriez être en mesure de savoir en compilant avec débogage DCU, la fixation d'un point d'arrêt sur la ligne qui soulève l'exception, et examiner la trace de la pile. Je suppose une combinaison des propriétés du formulaire et votre code mène à un autre changement de la propriété Visible
plus haut de la pile, et vous avez besoin de savoir ce qu'il est et corriger. Le code devrait vraiment travailler dessus.
Autres conseils
Au lieu d'essayer de caser quelque chose dans la forme principale, allez à l'endroit où vous connaissez tout le reste est achevée: le point où des retours de Application.Run
. Créer une nouvelle procédure qui crée, montre, et détruit votre forme d'adieu, puis appelez dans votre fichier DPR comme ceci:
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
TThankYouForm.Execute;
end.
La fonction d'affichage peut être le long des lignes de ce que la réponse de Mghie démontré :
class procedure TThankYouForm.Execute;
begin
with Create(nil) do try
ShowModal;
finally
Free;
end;
end;
Je mettrais (essayer) tout le code fourni ci-dessus dans le cas OnCloseQuery de la principale forme. Assurez-vous que peut fermer:. = False jusqu'à ce que vous êtes prêt à fermer la principale forme
Cela peut être causé par la différence entre l'ordre de la méthode appelle à l'ordre de traitement de gestionnaire de messages. Une fois votre méthode a terminé il y a encore des messages dans la file d'attente du système d'exploitation et ils sont envoyés et gérés par la VCL.