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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
| unit Unit1;
{ Test exemple d'utilisation d'un TList avec une Structure Record par JLMat}
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Types;
Type
{Champ des données du Catalogue des étoiles}
PListeObjets = ^TObjetsCelestes;
TObjetsCelestes =
Record
elNom :String ;
elCooGalX : Integer;
elCooGalY : Integer;
elCooGalZ : Integer;
End;
{Définition de TForm1 }
{ TForm1 }
TForm1 = class(TForm)
BtnAjouter : TButton;
BtnModifier : TButton;
BtnSupprimer: TButton;
BtnToutSupprimer: TButton;
LbNombre : TLabel;
ListBox1 : TListBox;
Panel1 : TPanel;
StaticText1 : TStaticText;
procedure BtnAjouterClick (Sender: TObject);
procedure BtnModifierClick(Sender: TObject);
procedure BtnSupprimerClick(Sender: TObject);
procedure BtnToutSupprimerClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
function SaisieFicheToRecord(var Obj: PListeObjets):boolean;
Procedure MAJAfficheListe;
public
end;
var
Form1 : TForm1;
Liste : TList;
{===============================================================================}
implementation
Uses Unit2;
{$R *.lfm}
{===============================================================================}
type
TObjList = class(TList)
public
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
end;
procedure TObjList.Notify(Ptr: Pointer; Action: TListNotification);
begin
if (Action = lnDeleted) and (Ptr <> nil) then
Dispose(PListeObjets(Ptr));
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Liste := TObjList.Create; // Création de la liste
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1.btnToutSupprimerClick(nil);
Liste.Free;
end;
{--- Ajoute un Objet au Catalogue ---------------------------------------------}
function ObjDisplayText(Obj: PListeObjets):string;
begin
if Obj <> nil then
with Obj^ do
Result := Format('%-20s%5d%5d%5d',[elNom,elCooGalX,elCooGalY,elCooGalZ])
else
Result := '< liste vide >';
end;
{- Transfert les Saisies de la Fiche Form2 vers le Buffer des Objets de la Liste -}
function TForm1.SaisieFicheToRecord(var Obj : PListeObjets):boolean;
begin
With TForm2.Create(nil) do // creer une nouvelle form2
try
if Obj <> nil then
with Obj^ do
begin
edNom.Text := elNom;
edX.Text := Inttostr(elCooGalX);
edY.Text := Inttostr(elCooGalY) ;
edZ.Text := Inttostr(elCooGalZ);
end;
Result := ShowModal = mrOK;
if not Result then
Exit;
if Obj = nil then
New(Obj);
with Obj^ do
begin
elNom := edNom.Text;
elCooGalX := StrToInt(edX.Text);
elCooGalY := StrToInt(edY.Text);
elCooGalZ := StrToInt(edZ.Text);
end;
finally
Free;
end;
end;
{--- Affichage des Objets Célestes du Catalogue dans une ListBox --------------}
Procedure TForm1.MAJAfficheListe;
Var i : Integer;
Begin
ListBox1.Items.BeginUpdate;
ListBox1.Items.Clear;
For i := 0 To Liste.Count-1 Do
ListBox1.Items.Add(ObjDisplayText(Liste[i]));
ListBox1.Items.EndUpdate;
lbNombre.Caption := IntToStr(Liste.Count);
End;
{--- Ajoute un Objet au Catalogue ---------------------------------------------}
procedure TForm1.BtnAjouterClick(Sender: TObject);
Var Objet : PListeObjets;
DisplayTxt: string;
begin
Objet := nil;
if SaisieFicheToRecord(Objet) then
begin
Liste.Add(Objet);
DisplayTxt := ObjDisplayText(Objet);
ListBox1.Items.Add(DisplayTxt);
end;
end;
{--- Modifie un Objet du Catalogue --------------------------------------------}
procedure TForm1.BtnModifierClick(Sender: TObject);
var Objet : PListeObjets;
iLB : Integer;
begin
iLB := ListBox1.ItemIndex;
if iLB < 0 then Exit;
{Affichage de ses données et valeurs}
Objet := Liste[iLB];
if SaisieFicheToRecord(Objet) then
ListBox1.Items[iLB] := ObjDisplayText(Objet);
end;
{--- Supprimer un élément de la Liste -----------------------------------------}
procedure TForm1.BtnSupprimerClick(Sender: TObject);
begin
If ListBox1.ItemIndex < 0 then Exit;
// on supprime de Liste d'abord pour garder le ItemIndex stable
Liste.Delete(ListBox1.ItemIndex);
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
{--- Suppression de tous les Objets de la Liste et libération mémoire --------}
procedure TForm1.BtnToutSupprimerClick(Sender: TObject);
begin
Liste.Clear;
ListBox1.Clear;
end;
end. |
Partager