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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top