Dans une partie de l'application sur laquelle je travaille, il y a un contrôle de formulaire qui effectue la validation à la réception du message CMExit, ce qui correspond exactement à la documentation Delphi (cet exemple de code provient des fichiers d'aide Delphi):Message CMExit Delphi non envoyé lorsque le dialogue modal est fermé?
procedure TDBCalendar.CMExit(var Message: TWMNoParams);
begin
try
FDataLink.UpdateRecord; { tell data link to update database }
except
on Exception do SetFocus; { if it failed, don't let focus leave }
end;
inherited;
end;
Le but de ceci est d'effectuer la validation dès que le contrôle perd le focus. Ainsi, par exemple, si je devais cliquer sur le bouton OK, le contrôle de formulaire perdrait le focus, cette méthode s'exécuterait et une exception rétablirait le contrôle de formulaire. (Ainsi, l'événement "clic" sur le bouton OK ne passerait jamais et la boîte de dialogue ne se fermerait jamais).
Le problème que j'ai est que ce contrôle de formulaire est dans une fenêtre de dialogue modale. Cliquer sur OK envoie en effet le message CMExit et provoque la mise à jour de l'enregistrement (et la validation à se produire). Cependant, si vous appuyez sur Entrée alors que vous êtes dans le contrôle de formulaire, la boîte de dialogue modale se ferme sans envoyer le message CMExit. C'est comme si le contrôle de forme ne "perd jamais le focus". Cela signifie que non seulement la boîte de dialogue se ferme sans que le formulaire ne valide réellement les données, mais l'ensemble de données n'est pas non plus mis à jour.
Compte tenu de ce problème, où est le meilleur endroit pour moi de placer mon code de mise à jour/validation de jeu de données? Je pourrais le déplacer vers le formulaire de dialogue lui-même et l'implémenter dans le gestionnaire OnCloseQuery, mais cela signifierait que la logique est dupliquée dans le contrôle de formulaire et sur le formulaire lui-même. (Le contrôle de formulaire est utilisé dans d'autres endroits, et je veux éviter de changer son comportement).
(je spécule que CMExit ne se déclenche pas parce que le contrôle ne fait ne perdre le focus. La forme est fermée, mais le contrôle de la forme encore « a le focus » sur la forme fermée.)
Cm_Exit est un événement qui change la mise au point. N'appelez pas SetFocus à partir de celui-ci. Ne changez pas la mise au point tant que la mise au point est déjà en cours. Au lieu de cela, publiez un message et modifiez le focus en réponse à celui-ci. Le système d'exploitation n'aime pas être interrompu pendant le changement de mise au point. Il devient confus sur ce qui a vraiment l'accent. –