Destruction de composant ne le ramenant pas à nil
Bonjour à toutes et à tous,
Dans une application, je crée des "Panneau" qui sont des descendants de TPanel. Pour cela je crée un tableau de dimension 3.
Pour créer un tableau, il suffit de cliquer sur la forme.
Pour supprimer un tableau, il faut cliquer sur le tableau lui-même : on le voit disparaître. Pour autant, que j'utilise Destroy ou FreeAndNil, cette instance ne revient pas à nil. Je le vois car en cliquant à nouveau sur la forme, c'est un tableau à un nouvel indice qui se crée au lieu d'être à l'indice libéré.
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
TPanneau = class(TPanel)
public
Index: Integer;
Nom: String;
procedure MouseUp(Button: TMouseButton; Shift:TShiftState; X,Y:Integer); override;
end;
{ TForm1 }
TForm1 = class(TForm)
procedure FormClick(Sender: TObject);
private
public
Panneau: array[1..3] of TPanneau;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormClick(Sender: TObject);
var
i, j: Integer;
begin
j:= 0;
for i:= 1 to 3 do
// if Panneau[i] = nil then
if not Assigned(Panneau[i]) then
begin
j:= i;
Break;
end;
if (j < 1) or (j > 3) then
ShowMessage('Indice hors limite j = '+ IntToStr(j))
else
begin
Panneau[j]:= TPanneau.Create(Self);
with Panneau[j] do
begin
Parent:= TWinControl(Self);
Caption:= IntToStr(j);
SetBounds(100, 60*i, 200, 30);
end;
end;
end;
procedure TPanneau.MouseUp(Button: TMouseButton; Shift:TShiftState; X,Y:Integer);
var
i: Integer;
begin
i:= StrToInt(Caption);
Destroy; Self:= nil;
// FreeAndNil(Self);
end;
end. |
Si vous avez une idée de ce qu'il faut faire pour que l'instance libérée revienne à nil.
Cordialement.
Pierre