Detruire un composant créé dynamiquement [Résolu]

Signaler
Messages postés
189
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
-
Messages postés
189
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
-
Bonjour,

Sur une form j'ai un bouton pour créer des Tframe dynamiquement. Dans le Tframe, j'ai un bouton pour se détruire. J'ai un plantage lors de la destruction du dernier Frame créé.

Voivi un code simplifier qui produit le plantage.

unit Uprincipale;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    BtnCreerCadre: TButton;
    procedure BtnCreerCadreClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;
  counter : integer;
implementation

{$R *.dfm}
uses Ucadre;

procedure TForm1.FormCreate(Sender: TObject);
begin
  counter := -1;
end;

procedure TForm1.BtnCreerCadreClick(Sender: TObject);
var NewCadre : Tcadre;
begin
  NewCadre := Tcadre.Create(self);
  inc(counter);
  with NewCadre do
    begin
      Parent := self;
      Name := 'Cadre' + inttostr(counter);
      Left := 100 + 10*counter;
      Top  := 100 + 5*counter
    end;
end;
end.

unit Ucadre;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls;

type
  TCadre = class(TFrame)
    BtnFermer: TButton;
    procedure BtnFermerClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

implementation

{$R *.dfm}

procedure TCadre.BtnFermerClick(Sender: TObject);
begin
  parent := nil;
  free;
end;

end.  


Voila, ce code permet de créer plusieurs cadres, et chaque cadre possède un bouton "fermer" qui fonctionne sauf pour le dernier.

Comment un composant peut "s'autofermer" propement ??

Merci pour votre aide.

1 réponse

Messages postés
189
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
1
J'ai fini par trouvé une solution qui fonctionne, voici donc le code de l'unité Ucadre corrigée. Cela servira peut-être à d'autres.

unit Ucadre;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TCadre = class(TFrame)
    BtnFermer: TButton;
    procedure BtnFermerClick(Sender: TObject);
    procedure CMRelease(var Message: TMessage); message CM_RELEASE;
    procedure Release;
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

implementation

{$R *.dfm}

procedure TCadre.Release;
begin
  PostMessage(Handle, CM_RELEASE, 0, 0);
end;

procedure TCadre.CMRelease;
begin
  Free;
end;

procedure TCadre.BtnFermerClick(Sender: TObject);
begin
  Release;
end;

end.