 |
|
 |
|
 |
4 - UTILISATION DE TLIST
|
|
|
|
PRÉSENTATION :
Exemple d'utilisation de l'objet TList
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.
CODE :
Unit Unit1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Type
TForm1 = Class(TForm)
btnAjouter: TButton;
btnModifier: TButton;
btnSupprimer: TButton;
btnTrier: TButton;
ListBox1: TListBox;
btnToutSupprimer: TButton;
btnVider: TButton;
btnToutVider: TButton;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
lNombre: TLabel;
lCapacite: TLabel;
Procedure btnAjouterClick(Sender: TObject);
Procedure btnModifierClick(Sender: TObject);
Procedure btnSupprimerClick(Sender: TObject);
Procedure btnTrierClick(Sender: TObject);
Procedure btnToutSupprimerClick(Sender: TObject);
Procedure btnViderClick(Sender: TObject);
Procedure btnToutViderClick(Sender: TObject);
Procedure FormDestroy(Sender: TObject);
Procedure Button1Click(Sender: TObject);
Private
{ Déclarations privées }
Procedure MAJListBox;
Public
{ Déclarations publiques }
End;
Var
Form1: TForm1;
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 Do For i:=0 To Count-1 Do
If Items[i]=Nil
Then ListBox1.Items.Add('<Nil>')
Else With 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]=Nil Then 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]=Nil Then 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 Do For i:=Count-1 Downto 0 Do
Begin
// Libération
If Items[i]<>Nil Then 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=Nil Then If Item2=Nil Then Result:= 0
Else Result:=-1
Else If Item2=Nil Then Result:= 1
Else
If PElementListe(Item1).elTaille<PElementListe(Item2).elTaille Then Result:=-1
Else If 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]=Nil Then 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 Do For i:=0 To Count-1 Do
Begin
// Libération
If Items[i]<>Nil Then 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.
|
| |
 |
|
 |
Les sources présentées sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©
2003 Bruno Guérangé. Aucune reproduction,
même partielle, ne peut être faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.
|