LISTBOX AVEC SMILEYS

Utilisateur anonyme - 5 mai 2004 à 11:29
cs_Nebula Messages postés 787 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

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
14 juin 2005 à 15:55
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
23 févr. 2005 à 04:20
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 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
20 août 2004 à 23:53
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 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
20 août 2004 à 00:27
Je crois que ce sera fonctionnel, géré ainsi. Je m'y atelle, merci infiniment ! :)
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
19 août 2004 à 23:05
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 .
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
17 août 2004 à 01:33
Tu as été très clair et c'est un peu de cette manière que je comptais les gérer, mais est-ce que si la taille de la listbox change, cette méthode est appelée de nouveau pour chaque item ? Car pour le moment, elle n'est pas appelée et je bloque toujours dessus (bon je viens de retomber sur ce code et je voudrais essayer de le finir !)
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
14 mai 2004 à 03:21
Bravo!!, pour mon Package ShiningComponents il ya justement un composant dérivé d'un TlistBox avec quelques fonctions en plus.. tel que tu texte façon Mirc ;) donc choix des couleurs incrustation de smiley... et donc voici comment redimenssionnée la TListBox..
tout d'abord il faut surchargé la fonction "MeasureItem" dans la déclaration "Protected" exemple

Procedure MeasureItem(Index: Integer; var ItemHeight:Integer);override;

à l'interrieur de la procédure il faut bien entendu transmettre la fonction au TListBox

Procedure MeasureItem(Index: Integer; var ItemHeight:Integer);override;
begin
Inherited MeasureItem(Index, ItemHeight);
{ Attention cette fonction est appeler avant le dessin des Items
ce qui implique une fonction de pre-calcule des Items, une fois la hauteur calculée il suffit de renvoyé la valeur à ItemHeight.
voilà j'espère avoir été clair :).
}
end;
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
5 mai 2004 à 13:28
Ouaip je suis toujours vivant :) Pas de projet particulier, simplement pour le plaisir :p
Don0Choa Messages postés 104 Date d'inscription dimanche 29 octobre 2000 Statut Membre Dernière intervention 12 décembre 2005
5 mai 2004 à 12:27
Oh t'es encore vivant toi? :D ca fait un moment quand même !

C'est pas mal la listbox avec smiley! Il était temps que quelqu'un y pense.

Par curiosité, tu fais cette listbox dans quel but? je veux dire, t'as un projet ? Simple curiosité :)

++
Utilisateur anonyme
5 mai 2004 à 11:29
c genial :D
Rejoignez-nous