J'ai une application MDI écrit en Delphi 2007.Comment puis-je sortir avec grâce un formulaire MDI qui a l'exécution de code dans Delphi
Si l'utilisateur quitte une forme en son sein tout le code est exécuté, il provoque une exception, parce que la code essaye de mettre à jour un composant ou utilise un objet qui a été libéré avec le formulaire.
Y at-il de toute façon que je sache si le code s'exécute dans l'événement exit ou existe-t-il un moyen standard de gérer cette situation?
Mise à jour avec plus d'infomation
L'exception se produit habituellement dans les circonstances suivantes.
Un bouton sur la forme enfant mdi est pressé, ceci active une fonction dans le formulaire, la fonction ira à la base de données et récupérera des données, elle formatera ensuite et affichera dans un composant visuel sur le formulaire (utilisable un TListView). Si le code prend beaucoup de temps à s'exécuter (par exemple s'il y a beaucoup de données à traiter), l'utilisateur perd son intérêt et clique sur le bouton de fermeture (la vitesse du code a été travaillée pour essayer d'éviter ce).
Le code dans la fonction est toujours en cours d'exécution même si la forme à laquelle il appartient a été libérée (le code est dans la section privée du formulaire), maintenant lorsqu'il essaie de mettre à jour les composants visuels. ils ont été libérés avec la forme) et il jette une exception.
Le code sous la forme de l'enfant est usably dans une boucle lorsque cela arrive, les dossiers de cyclisme et mettre à jour le listview en conséquence, les boucles contiennent du code qui ressemble si
inc(i);
if (i mod 25) = 0 then
begin
StatusPnl.Caption := 'Loading ' + intToStr(i) + ', Please wait';
application.ProcessMessages;
end;
D'autres exemples de code
l'événement fromClose ressemble si
//Snip
if (Not (Owner = nil)) then
with (Owner as IMainForm)do
begin
//Snip
DoFormFree(Self,Self.Name);
end
else
//Snip
DoFormFree est une fonction sous la forme principale mère un IMD d ressemble donc
//Snip
(G_FormList.Objects[x] as TBaseForm).Release;
G_FormList.Objects[i] := nil;
G_FormList.Delete(i);
//Snip
Tous les formulaires sont stockés dans une liste, comme pour des raisons diverses, et toutes les formes de l'enfant étendre la classe TBaseForm. Idéalement, je voudrais savoir comment le code d'un formulaire est en cours d'exécution et empêcher l'utilisateur de le fermer, ou le masquer jusqu'à ce que le code soit terminé, car dans certains cas il peut générer un rapport et mettre à jour en tant que panneau d'état lorsque l'exception se produit, dans ce cas le rapport sera incomplet.
comme tous les formulaires sont sous-classes de TbaseFrom une façon globale de le faire serait idéal, donc je peux ajouter le code à la forme de base et le faire fonctionner sur toutes les formes descendantes.
Merci, quoi d'autre dois-je fournir? – Re0sless