Utilisateur anonyme
-
5 mai 2004 à 11:29
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDerniè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.
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 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és32Date d'inscriptionmercredi 1 septembre 2004StatutMembreDerniè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és304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 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és787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 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és304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 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és787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 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és304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 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és787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 5 mai 2004 à 13:28
Ouaip je suis toujours vivant :) Pas de projet particulier, simplement pour le plaisir :p
Don0Choa
Messages postés104Date d'inscriptiondimanche 29 octobre 2000StatutMembreDernière intervention12 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é :)
14 juin 2005 à 15:55
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 ;-)
23 févr. 2005 à 04:20
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.
20 août 2004 à 23:53
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...
@+
20 août 2004 à 00:27
19 août 2004 à 23:05
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 .
17 août 2004 à 01:33
14 mai 2004 à 03:21
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;
5 mai 2004 à 13:28
5 mai 2004 à 12:27
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é :)
++
5 mai 2004 à 11:29