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

Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
- - Dernière réponse : jderf
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
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.
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
3
Merci
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.

Dire « Merci » 3

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

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de jderf

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.