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 : Sélectionner tout - Visualiser dans une fenêtre à part
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