Detruire un composant créé dynamiquement

Résolu
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 - 9 sept. 2010 à 10:22
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 - 10 sept. 2010 à 13:58
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

jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
10 sept. 2010 à 13:58
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.
3
Rejoignez-nous