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 :
Si vous avez une idée de ce qu'il faut faire pour que l'instance libérée revienne à nil.
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.
Cordialement.
Pierre
Partager