Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :

Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
4 - UTILISATION DE TLIST

PRÉSENTATION : Exemple d'utilisation de l'objet TList
ZIP : Téléchargez le zip APERÇUS :

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 œuvre intellectuelle protégée par les droits d'auteur. 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -