[delphi] Détruire une TFrame

Détruire une TFrame [delphi] - Delphi/Pascal - Programmation

Marsh Posté le 03-08-2004 à 14:57:35    

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
Reply

Marsh Posté le 03-08-2004 à 14:57:35   

Reply

Marsh Posté le 03-08-2004 à 15:17:24    

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
Reply

Marsh Posté le 03-08-2004 à 15:20:10    

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
Reply

Marsh Posté le 03-08-2004 à 23:17:02    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed