Chainlists, liste chainée

Soyez le premier à donner votre avis sur cette source.

Vue 4 404 fois - Téléchargée 375 fois


Description

ChainLists est une unité lambda qui permet la manipulation et la création de listes chainées.

types :
pCLItemData : pointeur vers donnée de base d'un item
TCLItemData : donnée de base d'un item
TCLIDataArray : tableau de données des items
pCLItem : pointeur vers item de la liste chainée
TCLItem : item de la liste chainée

constantes :
SizeOfTCLItemData : taille de la donnée de base d'un item
SizeOfTCLItem : taille totale d'un item

classes :
TListHelper (delphi 2009 ou superieur) : helper pour TList
EChainListsItemsNotFree : exception sur liberation des item de liste chainée

fonctions :
CLItemCreate : crée un item
CLItemDestroy : libère un item
CLItemDestroyAll : libére tout les item
CLItemCopy : copy un seul item de la liste
CLItemExtract : extrait un item de la liste
CLItemExchange : echange un item de la liste avec un autre
CLItemExchangePos : echange la position de deux item
CLItemExchangeData : echange les données de deux item
CLItemInsertAfter : insere un item aprés l'item reference
CLItemInsertBefore : insere un item avant l'item reference
CLItemInsertAsFirst : insere l'item au debut de liste
CLItemInsertAsLast : insere l'item en fin de liste
CLItemCountAll : compte tout les items
CLItemCountBefore : compte tout les items avant l'item refenrence (inclus)
CLItemCountAfter : comptre tout les items aprés l'item reference (inclus)
CLItemGetFirst : renvois le premier item de la liste
CLItemGetLast : renvois le dernier item de la liste
CLItemToArray : transfère les données vers un tableau
CLItemAssignToList : transfère les données vers TList
CLItemCompare : pour List.Sort(), compare deux items

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
j'y reflechis...
Bacterius
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
Ah ouais c'est comme des add-ons qu'on branche sur la classe originale ... pratique !
Pour l'insertion des éléments, ok, je n'y avais pas pensé. Je comprends que tu ne l'aies pas intégré totalement dans l'exemple, ça aurait fait trop de boutons.
En tout cas c'est une bonne source, et je vais la garder dans mes favoris.
Qu'en-est-il de la liste chaînée cyclique ?

Cordialement, Bacterius !
f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
@bacterius :

cela est faisable avec CLItemInsertBefore ou CLItemInsertAfter, en leurs donnant comme item de reference un item de la liste qui est ni a la fin, ni au debut (donc pas le root).

Effectivement, AssignToList n'est pas nettoyée correctement.

TListHelper est une classe Helper, disponible uniquement depuis D2007.
les classes helpers permettent d'ajouter des methodes dans une classes sans la dériver.
fini les TList = class(Classes.TList).

on fait directement :
TListHelper = class helper for TList ...

par exemple, si je developpe une API qui prend en charge de nouveaux formats d'image ou de texte, je peux créer des classes Helpers pour :
TStrings (sera herité par TStringList, TMemo, TRichEdit etc),
pour TPicture ou TGraphic ou encore TCanvas (pour lui ajouter des fonctionnalité GDI+ ou OpenGL par exemple).

imagine ça comme ça :

TCanvasHelper = class Helper for TCanvas
procedure OpenGL;
procedure CloseGL;
procedure OpenGDIP;
procedure CloseGDIP;
procedure GLBezier(const Pts: array of TGLPoint);
procedure GPBezier(const Pts: array of TGPPointF);
end;

et hop, tout TCanvas appelé possede ces nouvelles methodes.
celui de la fiche, ceux des composants, ceux des TBitmaps etc, bref, mieux qu'une simple derivation parfois difficile et limitée.
Bacterius
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
Vraiment très bien, l'utilisation dans la démo est vraiment très souple (surtout la modification des éléments, c'est fluide, pas besoin de re-cliquer pour mettre à jour).
Je propose une amélioration : pouvoir insérer un élément au milieu d'une chaîne (et pas que au début où à la fin). Et peut-être inclure une gestion des listes chaînées cycliques (?), dans lesquelles le dernier élément pointe au premier, et vice versa.
Le compilateur (D7 Perso) a juste noté deux variables inutilisées (N et C) dans AssignToList.

Cordialement, Bacterius !

PS : à quoi sert "TListHelper" ? Je crois deviner qu'il s'agit d'une classe pour les versions de Delphi next-gen, mais ... ?
f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
tu t'es levé du pieds gauche cirec :) lol

j'ai modifier le code en consequence depuis ces messages ;)

j'avais omis de poser des directives dans l'unité pour ne pas compiler la class helper sous les anciennes version de Delphi.
voila voila.

sinon j'aimerais assé avoir du commentaire sur l'unité en elle même, avoir un retour sur l'utilisation, les possible ameliorations a faire ...
haaaa Florenth, comme tu me manque!

huhuhu.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.