LISTBOX AVEC SMILEYS

Messages postés
1277
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
- - Dernière réponse : cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
- 14 juin 2005 à 15:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/22524-listbox-avec-smileys

Afficher la suite 
cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1 -
J'utilise ceci pour redimensionner les items (la routine CheckItemSize calculant la taille occupée par un item) :

Size := CheckItemSize(Index);
if Size <> ListBoxChat.Perform(LB_GETITEMHEIGHT, Index, 0)
then begin
ListBoxChat.Perform(LB_SETITEMHEIGHT, Index, Size);
ListBoxChat.Invalidate;
Exit;
end;

Ce code va dans la routine OnDrawItem. Et lorsque la Form est redimensionnée, il faut aussi appeler ListBoxChat.Invalidate sinon le redimensionnement n'a pas cours immédiatement !

Je pense poster bientôt une listbox gérant tous les styles IRC et les retours à la ligne, le temps de me relire/commenter mon code/optimiser le bousin ;-)
atomefougere
Messages postés
32
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
5 décembre 2005
-
L'exemple est très sympatique :)

J'aimerais avoir par contre plus de détails à propos du redimensionnement des items...

J'arrive à calculer la hauteur des items en fonction des retours à la ligne, mais ce calcul n'est fait qu'une fois. Donc tout fonctionne lors de l'ajout des items, mais si on change la largeur de la ListBox, les Items ne changent pas de taille.

Je m'explique :

Dans l'evenement OnMesureItem, je calcule la hauteur de l'item en fonction du texte qui y sera affiché.

Dans l'evenement OnDraw, j'affiche le texte sur une ou plusieurs lignes, en fonction de la longueur du texte.

Quand je redimensione la Listbox, le texte se recalle bien comme il faut, les retours à la ligne se font bien si necessaire, mais la hauteur de l'item, elle, ne change pas...

Je n'ai pas très bien compris les explications de shining, serait il possible que vous m'aidiez un peu plus sur ce point ?

Merci, et excusez moi de déterrer un ancien sujet.
cs_shining
Messages postés
329
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012
-
il n'y a pas de quoi.
pour info, une partie de mon client irc sera mis sur ce site, dont un parser de Smiley TEmoticonsManager qui offre une solution flexible pour inserez des images, ainsi qu'un parser de Texte irc, dans le style Mirc
pour le moment de nombreux composants sont en developpement donc patience...
@+
cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1 -
Je crois que ce sera fonctionnel, géré ainsi. Je m'y atelle, merci infiniment ! :)
cs_shining
Messages postés
329
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012
-
donc on recapitule, tout d'abord je rappel que cette fonction est appeler juste avant le dessin de l'item, donc une fonction préparse est néccessaire pour que chaque items puisse avoir une hauteur adéquate pour celà il faut respecter ces 3 règles

1- Mettre la propriété Style à lbOwnerDrawVariable;
2- Surcharger la procedure MeasureItem(en proctected)
3- préparse du Texte avant le dessin de l'item
mais Attention utilisez ListBox1.Items.Add(MyText) plutôt que AddObject car malheureusement les Objets retourne toujours une valeur nuls(pour des raisons non expliquer de la part de Delphi!!)
et donc c'est simple il suffit de recupérer la valeur de l'item via son Index exemple :
ItemHeight := Préparse(Items[Index]);
Attention dans la fonction préparse il ne faut pas Dessiné l'item sinon ya risque d'appel recursive à Paint & MeasureItem...
Conseil: dans la fonction préparse faire un hashage des caractères et s'arrêter quand il y'a un espace " ", ensuite calculé la largeur du texte via Canvas.Textwidth
ensuite verifiez que w(largeur du text) + X<= ClientWidth , si oui afficher le texte, si non incrémenter Y par Canvas.TextHeight
donc on as besoin d'une variable X,Y,W
X & Y seront initialisé par rapport à itemRect
Bonne Prog .