Effacer un composant crée dynamiquement

Résolu
cs_fidji Messages postés 32 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 10 mai 2008 - 27 avril 2007 à 11:39
cs_germainm Messages postés 7 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 4 septembre 2007 - 18 juin 2007 à 04:37
Bonjour, J'ai un problème lié à la construction et destructions de composants dynamiquement.

Lorsque je veux détruire le composant crée dynamiquement self.destroy, il veut terminer la procédure appelée (passer sur le end; de la procédure qui appel la fermeture du composant).
Mais vu qu'il a été détruit il me crée une erreur d'accès à la mémoire...

Alors je sais que c'est possible car si je crée une form dynamiquement et que je la quitte avec la croix Windows [x] ça marche à tout les coups et sans erreurs.
Mais si je clique sur un bouton contenant formDynamique.close; il me ferme la form et me génère une erreur lorsqu'il revient sur le END; du bouton (qui a été supprimé en même temps que la form).

Nb: que je n'ai qu'un message d'erreur (impossible à récupérer avec un try vu sa position?) et que cela n'altère pas le fonctionnement du programme.

Toute proposition est bienvenue.

procedure TfrmMenu.bbtnCreationClick(Sender: TObject);
begin
frmCreation := TfrmCreation.Create(self); <-- 1
frmCreation.show;
self.Hide;
end;

procedure TfrmCreation.fraMenubbtnMenuClick(Sender: TObject);
begin
frmMenu.show;
self.destroy; // self.close;<-- 2 (si self.close) il passe par form.close et plante aussi en n°3
end;<-- 3 (Plantage)

OU

procedure TfrmCreation.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
frmMenu.show;
self.Destroy; <--2
end;<-- OK<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
MERCI d'avance

6 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
27 avril 2007 à 14:25
Pour détruire une fenetre n'importe où dnas le code et sas plantage, appeler TForm.Release() er puis c'est tout.

En tout cas, éviter absolument le .Destroy car ça empèche la fiche de terminer son evenement et la suite qui va avec.
3
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
27 avril 2007 à 12:06
salut,

tu ne peux pas détruire un compo depuis lui-même (intérieur).

Pour detruire une form lors de sa fermeture, utilise OnClose. Set Action a caFree

et puis, pour la fermer (detruire) utilise "close"
(la lib vas détruire  de manière différée la form)

donc,

remplace
self.Destroy; <--2
par
action := caFree;

bon code !

Loda

PS: si tu utilise souvent la form, prefere la cacher plustot que la detruire.
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
jelume Messages postés 120 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 15 novembre 2007 1
27 avril 2007 à 12:37
bjr

Faire un close est suffisant s'il s'agit d'une TForm.

Pour un composant ajouté à une TForm, si tu le crèe associé à un container, il sera détruit automatiquement.
Exemple:

Etiquette := TLabel.create(Self) ; // si Self est la TForm

inutile de détruire Etiquette.
0
cs_fidji Messages postés 32 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 10 mai 2008
27 avril 2007 à 15:13
Merci beaucoup,

il me reste a faire pareil avec un groupbox contenant des composants... il faut que j'efface les composants a l'intérieur avec les memes contraintes, et donc les mêmes problèmes,   mais pour ce qui est de ma form ça marche nikel ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
27 avril 2007 à 16:06
re,

désolé, mais les méthode utiliser pour détruire les forms ne peuvent pas (toute) s'appliquer au composant normaux.

essaye plutôt de revoir ta structure. y a sûrement moyen de faire un truc plus simple et moins problématique.

bon code,

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
cs_germainm Messages postés 7 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 4 septembre 2007
18 juin 2007 à 04:37
avant de détruire un composante, tu dois mettre la valeur de sa propriété parent à nul, par après tu peux utiliser la méthode free.

Germain Malenfant, Developper, http://www.searchevolution.com
0
Rejoignez-nous