NOTES :
Ce source présente un exemple d'utilisation d'un objet TList associé à un Record.
Cet objet permet de gérer facilement des listes d'objets, son utilisation est beaucoup plus simple qu'il n'y parait.
L'exemple donné dans le source présente les fonctions de base de gestion d'un TList avec la gestion de reservation/libération de la mémoire en fonction de la création/destruction des éléments de la liste.
Type
PElementListe=^TElementListe;
TElementListe=Record
elNom :String[20];
elPoids :Integer;
elTaille:Integer; End;
Var Liste:TList;
Implementation
Uses Unit2;
{$R *.dfm}
Procedure TForm1.MAJListBox; Var i:Integer; Begin
ListBox1.Items.Clear; With Liste DoFor i:=0 To Count-1 Do If Items[i]=Nil Then ListBox1.Items.Add('<Nil>') ElseWith TElementListe(Items[i]^) Do ListBox1.Items.Add(Format('%-20s%5d%5d',[elNom,elTaille,elPoids]));
lNombre .Caption := IntToStr(Liste.Count);
lCapacite .Caption := IntToStr(Liste.Capacity); End;
Procedure TForm1.btnAjouterClick(Sender: TObject); Var Ele:PElementListe; Begin // Valeurs par défaut
Form2.eNom .Text := 'Nouveau';
Form2.eTaille .Value := 170;
Form2.ePoids .Value := 60; // Demande de saisie du nouvel élément If Form2.ShowModal<>mrOK Then Exit; // Création du nouvel élément
New(Ele); With Ele^ Do Begin
elNom :=Form2.eNom.Text;
elTaille :=Form2.eTaille.Value;
elPoids :=Form2.ePoids.Value; End; // Ajout de l'élément dans la liste
Liste.Add(Ele); // Mise a jour du ListBox
MAJListBox; End;
Procedure TForm1.btnModifierClick(Sender: TObject); Begin If ListBox1.ItemIndex<0 Then Exit; // Teste si l'élément n'est pas NIL If Liste.Items[ListBox1.ItemIndex]=NilThen Exit; // Affichage de ses valeurs With TElementListe(Liste.Items[ListBox1.ItemIndex]^)Do Begin
Form2.eNom .Text := elNom;
Form2.eTaille .Value := elTaille;
Form2.ePoids .Value := elPoids; End; // Demande de modification de l'élément If Form2.ShowModal<>mrOK Then Exit; // Mise à jour des valeurs With TElementListe(Liste.Items[ListBox1.ItemIndex]^)Do Begin
elNom := Form2.eNom .Text;
elTaille := Form2.eTaille .Value;
elPoids := Form2.ePoids .Value; End; // Mise a jour du ListBox
MAJListBox; End;
Procedure TForm1.btnSupprimerClick(Sender: TObject); Begin If ListBox1.ItemIndex<0 Then Exit; // La liste box est dans le même ordre que la liste. C'est un cas // particulier qui simplifie le code, sinon il faut chercher l'élément // dans la liste. // Test si l'élément n'est pas NIL If Liste.Items[ListBox1.ItemIndex]=NilThen Exit; // Libération de la mémoire
Dispose(Liste.Items[ListBox1.ItemIndex]); // Suppression de l'élément
Liste.Delete(ListBox1.ItemIndex); // Mise a jour du ListBox
MAJListBox; End;
Procedure TForm1.btnToutSupprimerClick(Sender: TObject); Var i:Integer; Begin // Doit toujours être fait en sens inverse !!! With Liste DoFor i:=Count-1 Downto 0 Do Begin // Libération If Items[i]<>NilThen Dispose(Items[i]); // Suppression de l'élément
Liste.Delete(i); End; // Mise a jour du ListBox
MAJListBox; End;
// Fonction de tri personnalisée Function MaFonctionDeTri(Item1,Item2:Pointer):Integer; Begin If Item1=NilThenIf Item2=NilThen Result:= 0 Else Result:=-1 ElseIf Item2=NilThen Result:= 1 Else If PElementListe(Item1).elTaille<PElementListe(Item2).elTaille Then Result:=-1 ElseIf PElementListe(Item1).elTaille>PElementListe(Item2).elTaille Then Result:= 1 Else Result:=0; End;
Procedure TForm1.btnTrierClick(Sender: TObject); Begin // Tri suivant la taille
Liste.Sort(MaFonctionDeTri); // Mise a jour du ListBox
MAJListBox; End;
Procedure TForm1.btnViderClick(Sender: TObject); Begin If ListBox1.ItemIndex<0 Then Exit; // La liste box est dans le même ordre que la liste. C'est un cas // particulier qui simplifie le code, sinon il faut chercher l'élément // dans la liste. // Test si l'élément n'est pas NIL If Liste.Items[ListBox1.ItemIndex]=NilThen Exit; // Libération de la mémoire
Dispose(Liste.Items[ListBox1.ItemIndex]); // Suppression de la référence
Liste.Items[ListBox1.ItemIndex]:=Nil; // Mise a jour du ListBox
MAJListBox; End;
Procedure TForm1.btnToutViderClick(Sender: TObject); Var i:Integer; Begin // Celle-ci peut être faite dans le sens normal With Liste DoFor i:=0 To Count-1 Do Begin // Libération If Items[i]<>NilThen Dispose(Items[i]); // Suppression de la référence
Liste.Items[i]:=Nil; End; // Mise a jour du ListBox
MAJListBox; End;
Procedure TForm1.FormDestroy(Sender: TObject); Begin
Form1.btnToutSupprimerClick(Nil); End;
Procedure TForm1.Button1Click(Sender: TObject); Begin // Supression de tout les NIL
Liste.Pack; // Mise a jour du ListBox
MAJListBox; End;
Initialization // Création et destruction de la liste
Liste:=TList.Create; Finalization
Liste.Free;
End.