Effacer un composant crée dynamiquement [Résolu]

Messages postés
36
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
10 mai 2008
- - Dernière réponse : cs_germainm
Messages postés
8
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
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
1078
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de florenth
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
0
Merci
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.
Commenter la réponse de cs_Loda
Messages postés
122
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
15 novembre 2007
1
0
Merci
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.
Commenter la réponse de jelume
Messages postés
36
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
10 mai 2008
0
Merci
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 ;)
Commenter la réponse de cs_fidji
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
0
Merci
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.
Commenter la réponse de cs_Loda
Messages postés
8
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
4 septembre 2007
0
Merci
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
Commenter la réponse de cs_germainm