Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2878 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [delphi] Détruire une TFrame

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[delphi] Détruire une TFrame

n°813702
tropicano
Posté le 03-08-2004 à 14:57:35  profilanswer
 

Salut,
J'ai une application avec une fiche principale et je rentre dynamiquement des TFrame qu'en bon me chante et où je veux.
Viens le moment de détruire la TFrame et là j'ai tourné en rond un bon moment puis ô miracle ca marche.
Mais la raison est plus que magique.
 
J'ai donc fait une autre petite application pour illustrer le problème:
D'abord je plante le décor avec la fiche principale

Code :
  1. unit form_principale_unit;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, cadre_01;
  6. type
  7.   Tform_pricipale = class(TForm)
  8.     Button1: TButton;
  9.     Memo1: TMemo;
  10.     procedure Button1Click(Sender: TObject);
  11.     procedure update_memo();
  12.     procedure FormCreate(Sender: TObject);
  13.   private
  14.     { Déclarations privées }
  15.   public
  16.     a_detruire: string;
  17.   end;
  18. var
  19.   form_pricipale: Tform_pricipale;
  20. implementation
  21. {$R *.dfm}
  22. procedure Tform_pricipale.Button1Click(Sender: TObject);
  23. var
  24.   temp: TFrame1;
  25. begin
  26.   temp := TFrame1.Create(self);
  27.   temp.Parent := self;
  28.   temp.Name :='TFrame1_'+inttostr(self.ComponentCount-1);
  29.   update_memo;
  30. end;
  31. procedure Tform_pricipale.update_memo;
  32. var
  33.   i:integer;
  34. begin
  35.   Memo1.Lines.Add('---------');
  36.   Memo1.Lines.Add(inttostr(self.ComponentCount));
  37.   for i:=0 to  self.ComponentCount-1 do
  38.     begin
  39.     Memo1.Lines.Add('++ '+self.Components[i].Name);
  40.     end;
  41. end;
  42. procedure Tform_pricipale.FormCreate(Sender: TObject);
  43. begin
  44.   update_memo;
  45. end;
  46. end.


 
 
Puis ma TFrame:

Code :
  1. unit cadre_01;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls;
  6. type
  7.   TFrame1 = class(TFrame)
  8.     Button1: TButton;
  9.     Memo1: TMemo;
  10.     procedure Button1Click(Sender: TObject);
  11.   private
  12.     { Déclarations privées }
  13.   public
  14.     { Déclarations publiques }
  15.   end;
  16. implementation
  17. uses form_principale_unit;
  18. {$R *.dfm}
  19. procedure TFrame1.Button1Click(Sender: TObject);
  20. begin
  21.   form_pricipale.a_detruire := inttostr(self.ComponentIndex); // <-!!!!!
  22.     try
  23.       free
  24.     except
  25.        on EAccessViolation do begin end;
  26.     end;
  27.   form_pricipale.update_memo;
  28.   exit;
  29. end;
  30. end.


 
C'est ici que s'opère la magie:

Citation :


procedure TFrame1.Button1Click(Sender: TObject);
begin
  form_pricipale.a_detruire := inttostr(self.ComponentIndex);
    try
      free
    except
       on EAccessViolation do begin end;
    end;
  form_pricipale.update_memo;
  exit;
end;


Il suffit que je passe cette ligne "form_pricipale.a_detruire := inttostr(self.ComponentIndex);" en commentaire et hop une jolie erreur pointe le bout de son nez.
 
Si quelqu'un peut m'expliquer le pourquoi du comment ou peut me proposer une autre méthode pour détruire mes TFrame...
 
Merci


Message édité par tropicano le 03-08-2004 à 15:00:08
mood
Publicité
Posté le 03-08-2004 à 14:57:35  profilanswer
 

n°813747
antp
Super Administrateur
Champion des excuses bidons
Posté le 03-08-2004 à 15:17:24  profilanswer
 

déjà la récupération de l'AccessViolation en douce c'est un signe de code crado :D
 
t'en fais quoi de ce a_detruire ? :heink:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°813755
antp
Super Administrateur
Champion des excuses bidons
Posté le 03-08-2004 à 15:20:10  profilanswer
 

Puis c'est normal que ça plante, tu ne peux pas détruire un objet dans le code d'un de ses objets (ici le clic d'un bouton de la frame).
C'est la form qui doit détruire la frame, la frame ne peut pas se détruire elle-même (seules les forms peuvent faire ça, grâce à leur méthode Release).
Que ça plante ou pas selon que tu mettes cette ligne en commentaire ou non ça ressemble plus à un coup de bol et au hasard des optimisations du compilateur.


Message édité par antp le 03-08-2004 à 15:20:48

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°814327
tropicano
Posté le 03-08-2004 à 23:17:02  profilanswer
 

Le coup du a_detruie c'est un pur hasard. J'avais tenté un truc du genre quand on appuie sur le bouton annuler on met dans a_detruire le nunero de composant de la frame.
Puis dans un un certain evenements de la fiche principale on regarde si la string est vide, si non on enleve les composants qui vont bien.
 
Et oui à ce moment là j'étais vraiment désespéré... :)
Je suis tout à fait conscient que là c'est pas du code joli, joli.
 
Je vais me repencher sur le probleme et tacher de trouver une autre solution


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [delphi] Détruire une TFrame

 

Sujets relatifs
Delphi 5 et TShellListView et TShellTreeView[Delphi] Supprimer un fichier
[Delphi] créer un module pour apache ou PHP4J'ai testé Delphi 8 rapidement ...
BDD et delphi 7[Delphi] tableaux dynamiques & paramètres
[delphi 7] conversion de word en string[delphi 7] convertisseur de code
Brute Force MD5 en Delphi, c'est possible ;)[Delphi] Récupérer les infos affichées par une autre appli
Plus de sujets relatifs à : [delphi] Détruire une TFrame


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR