Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS DELPHI F.A.Q DELPHI TUTORIELS DELPHI LIVRES COMPOSANTS SOURCES DEFI TELECHARGEZ DELPHI TV
Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES ARTICLES NONOVISU ACCUEIL NOUVELLES
Retour à l'accueil
4 - UTILISATION DE TLIST

PRÉSENTATION : Exemple d'utilisation de l'objet TList
ZIP : Téléchargez le zip : miroir 1 , miroir 2 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 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.

Responsables bénévoles de la rubrique Delphi : Nono40 et Pedro - Contacter par EMail :
Vos questions techniques : forum d'entraide Delphi - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.