BOUTON AVEC DOUBLE CAPTION (TITRE ET TEXTE) ET IMAGE

cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011 - 14 juin 2006 à 23:20
ali08833 Messages postés 8 Date d'inscription vendredi 8 juin 2012 Statut Membre Dernière intervention 11 octobre 2012 - 4 oct. 2012 à 18:00
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/38119-bouton-avec-double-caption-titre-et-texte-et-image

ali08833 Messages postés 8 Date d'inscription vendredi 8 juin 2012 Statut Membre Dernière intervention 11 octobre 2012
4 oct. 2012 à 18:00
merci
Pierregeorgesalexandre Messages postés 22 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 5 novembre 2006
1 nov. 2006 à 08:34
j'aime, c'est simple et beau et complet à la fois...
Mieux j'adore...
Pierre
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
7 juil. 2006 à 08:51
Bonjour N_M_B,

Je n'ai pas du tout de clignotement (j'ai un 1800 Mhz). Sur ce point, si d'autres utilisateurs ont le même souci, j'aimerais qu'ils le signalent ici. Ce qui me m'incitera éventuellement à revoir la conception ou, tout au contraire, à m'en satisfaire.

Dériver de la class TCustomControl, pourquoi pas. Je ne suis pas encore suffisamment initié pour argumenter de suite sur cette proposition. Je vais étudier (formateur pour moi qui ai encore beaucoup à assimiler !)

Une remarque sur ton commentaire : Essaie à l'avenir de te relire avant de valider, sinon perte de lisibilité !

Merci pour ta note !

Un bonjour à tous nos amis Algériens !

A+
MCapp
N_M_B Messages postés 94 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 1 mars 2008
7 juil. 2006 à 01:52
salut ! bon composant surtout pour une première bravo j'ai pas encore bien lu le code mais il ya un petit souci !
vu la taille de ton composant TGraphicControl ne semble pas la plus approprié(enfin ca ne concerne que moi j'ai lu que cette class étais faite pour des composant simples) je sais pas si chez toi il ya du clignotement mais avec mon 633Mghz ca peine 1petit peut(mème en méttant la forme frincipale en mode boublebufered).
je pence que dériver de la class TCustomControl qui ofte un double biuffer independant a ton compo et tu vera en plus tu un plus le focus qui est très important dans le genre d'applivation que tu a cité !
enfin g encore de gros progrèes d'organisation a faire dans mon code en voyant la simplicité de ce que tu a implémenté
10/10 bravo et @+ !!!

N*M*B Vive L'ALGERIE
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
20 juin 2006 à 23:30
Correction : "je vous lirai" (et non lirez) bien sûr !
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
20 juin 2006 à 22:26
Je pense que, maintenant, ma Démo est convaincante et mon Composant "au point".

Si vous avez des questions, des suggestions, des critiques, des idées de composants dérivés de celui-ci que vous souhaiteriez utiliser, n'hésitez pas à écrire votre commentaire ici.

Je vous lirez avec grand plaisir et essaierai de vous satisfaire !

A + sur ce site !

MCapp
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
20 juin 2006 à 07:45
Ai la solution à mon pb de TPanel.

Nouvelle version de ma Démo, ce soir !
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
19 juin 2006 à 22:07
J'ai réalisé ce composant avec Delphi 2005.

Thierry me signale (en message privé) qu'avec Delphi 7 on a le message d'erreur à l'ouverture de la Démo : "propriété Panel5.BevelEdges n'existe pas". Ignorer !
(Donc TPanel a été modifié dans Delphi 2005).

Il me dit aussi qu'il arrive à assigner une width de 306 au bouton. "Curieux : en mode conception, le bouton sort du Panel, et à l'exécution, c'est impeccable !?".

Pour moi, dans Delphi 2005, c'est la même chose : en mode conception, le bouton sort du Panel avec Width 306, et à l'exécution, c'est très bien, le bouton correspond à ce que je veux, il est bien intégré au Panel avec 1px de marge à gauche (left 1) et aussi 1px à droite.

Pas de pb si le bouton conservait ensuite cette valeur 306 (ou 305), mais hélas elle ne reste pas : à court terme, elle descend à 302.
Pourquoi ? Je cherche...
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
19 juin 2006 à 01:38
Bonjour Thierry !

J'ai fait l'ensemble des corrections que tu me proposais. Impeccable !

J'ai imposé une taille par défaut à mon bouton. Tu le trouveras peut-être un peu grand. Mais il me permet ainsi de rappeler 2 idées essentielles à l'utilisateur.

Il me reste un pb comme tu peux le constater : j'aimerais (déjà dit) dans le TPanel obtenir un bouton dont les 2 bords affleurent à 1 pixel des bords du TPanel (esthétique) mais apparemment pas possible (instabilité déjà citée). A étudier !

A +
MCapp
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
18 juin 2006 à 11:21
Merci Thierry !

Je ne considère jamais tes commentaires comme des critiques mais, bien au contraire, comme tu dis : dans un but constructif !

Je suis persuadé, d'ailleurs, que c'est l'état d'esprit qui prédomine sur l'ensemble de ce site !

Je vais, bien évidemment, tenir compte de tes nouvelles remarques...

A +
MCapp
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
18 juin 2006 à 11:07
Bonjour Mcapp,

Bonne restructuration des classes. Une erreur : la procedure DrawCaption2 doit être mise en private ou en protected.

DT_END_ELLIPSIS : fonctionne pour n'importe quelle hauteur, à condition que celle-ci soit un multiple de la hauteur d'1 ligne. Par exemple : en Ms Sanserif size 8, la hauteur est de 13 pixels. Donc pour 2 lignes : Caption_MaxHeight doit être fixée à 26. Si 27, pas de ...
Le code que je t'ai donné (if R.Bottom > FCaptionMaxHeight then R.Bottom:= FCaptionMaxHeight;) n'est donc pas valable. Autant pour moi...
Voici une solution :
// assignation de Font...
// calcul de la hauteur d'une ligne avec TextHeight
// il suffit de tester avec un seul caractère
LineHeight:= Canvas.TextHeight('M');
// calcul du nombre max de lignes en fonction de Caption_MaxHeight
// arrondi vers le bas
MaxLines:= Trunc(FCaption_MaxHeight / LineHeight);
// calcul du rectangle
R:= Rect(0, 0, Width - FCaptionAdjustRight , Height);
DrawText(Canvas.Handle, PChar(FCaption), -1, R, DT_CALCRECT or DT_WORDBREAK);
// voir si on ne dépasse pas le nombre de lignes max
if R.Bottom > FCaption_MaxHeight then
R.Bottom:= (MaxLines * LineHeight) -1 ;

Ce système permet d'assigner une hauteur maximale sans devoir la calculer pour "tomber juste" : si on met 43 pixels, on n'aura que 3 lignes (c.à.d. 39 pixels).
J'ai testé, ça marche, mais n'hésite pas à tester dans tous les sens.

Pour que ton bouton ait d'emblée une bonne taille, il suffit, dans le constructeur de TMC_DblCaptionBtn, d'initialiser Width et Height aux dimensions voulues.
Idem pour avoir le titre en gras par défaut: ta propriété FontStyle est inutile, il suffit d'initialiser Font :
Font.Style:= [fsBold];
Ceci étant dit dans un but constructif, et non pas critique...

A +
Thierry
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
17 juin 2006 à 02:11
Voilà Thierry, j'ai fait plusieurs modifications.
Je réponds, comme promis, à tes différentes remarques précédentes :

Pour l'insertion de l'icône à la taille voulue, d'accord. C'est fait, je ne savais pas qu'il fallait imposer la taille à la TImageList avant.

Pour mon Panel en Ctrl3D (avec bevel), j'ai enlevé l'option bevel à droite et à gauche, mais mon problème reste le même (voir l'image insérée dans ma Fiche en bas du menu).

DT_END_ELLIPSIS : ça fonctionne ! Une seule remarque : au-delà d'une Caption_MaxHeight de 25, je n'ai plus l'apport des points de suspension.

Pour Font2 : J'ai appliqué tes conseils. C'est effectivement plus simple.

Mais j'ai, tout de même, ensuite, dans mon code imposé le FontStyle à fsBold en ajoutant la propriété FontStyle dans les déclarations publiques.

Tu me dis aussi : «Dans TMC_BasicBtn.Create : pourquoi avoir assigné des valeurs <> 0 aux FAdjust... c'est assez déroutant quand on crée un bouton».
Je te réponds à cela que mon idée est justement de proposer un composant «préformaté» qui a déjà un aspect «presque fini», le Caption titre étant déjà en gras par défaut (voir ci-dessus) et les 2 Captions étant déjà positionnés correctement l'un par rapport à l'autre, avec également une «marge» prête à recevoir une icône à insérer.

Chacun peut ensuite modifier les valeurs proposées par défaut, mais on a de suite un bouton conforme à ce que je présente dans ma capture.

Un conseil important que je dois donc donner à une personne voulant insérer mon composant sur sa Fiche est de l'étirer de suite (dimensions assez grandes) et de ne pas l'insérer seulement comme un simple bouton (petit carré). Ce n'est plus réellement un bouton mais un hybride entre un bouton et un Tlabel ou TEdit.
D'ailleurs, j'aurais voulu que, dès l'insertion, mon « bouton » ait d'emblée une taille importante, mais ce n'est apparemment pas possible.
(Tailles rectangulaires un peu plus grandes vues sur certains boutons de Jvcl, mais je ne les ai pas encore « étudiés »).

J'ai modifié les valeurs par défaut des propriétés FAdjust !

Enfin, j'ai mis de l'ordre dans les propriétés de classe. Je crois que c'est « propre » maintenant.

A+
Mcapp
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
16 juin 2006 à 17:14
Merci Elguevel, on est en demande d'encouragements comme le tien ! La motivation à en produire d'autres s'en trouve décuplée !

MCapp
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
16 juin 2006 à 13:19
très bon composant :-)
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
15 juin 2006 à 17:26
Merci Thierry pour tes nouveaux commentaires !
Je vais, bien entendu, étudier et exploiter au mieux toutes tes remarques !
L'élève ne demande qu'à progresser !
Je répondrai donc, ultérieurement, à chacun de tes arguments.

Merci pour la note !
MCapp
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
15 juin 2006 à 16:37
Bonjour Mcapp,

Bonne surprise en découvrant la démo : beaucoup de classe, jolis dégradés, bref bon sens artistique (à mon avis du moins, mais les goûts et les couleurs...).

En ce qui concerne tes problèmes :

* une icône dans un TImageList ne pose aucun problème... à condition de régler au préalable la taille du TImageList : width et height. Donc comme tu emploies déjà un TImageList de 16/16, il suffisait d'en créer un autre de 31/31 (remarque : un bmp transparent, je ne vois pas le problème).
* problème de largeur : tu emploies un Panel en Ctrl3D (avec bevel), ce qui réduit la zone client de 4 pixels en largeur (et en hauteur).
* DT_END_ELLIPSIS : tu mets ce paramètre dans le DrawText qui sert au calcul du Rect, tu ne le mets pas dans le DrawText qui dessine le texte. C'est exactement le contraire qu'il faut faire. De plus, pour que cela marche, il faut évidemment mettre une limite au Rect.Bottom. Tu pourrais faire cela avec une propriété CaptionMaxHeight : après le calcul normal du rect :
if R.Bottom > FCaptionMaxHeight then R.Bottom:= FCaptionMaxHeight;

Remarques sur le code :
* Je vais évidemment te parler d'un FontCaption2 (:TFont) : beaucoup plus simple à programmer et plus lisible dans l'inspecteur d'objets que toutes tes propriétés FontCaption2_*.
* Pourquoi avoir rajouté la propriété FontCaption_Style ? Cela fait double emploi avec Font(Font étant réservé pour Caption1).
* Dans TMC_BasicBtn.Create : pourquoi avoir assigné des valeurs <> 0 aux FAdjust... c'est assez déroutant quand on crée un bouton : on assigne Caption, et on ne voit rien venir à cause des décalages par défaut. De plus les déclarations de propriétés ont default 0 !!! Le champ, dans un constructeur, doit être initialisé à la valeur par défaut de la propriété.
* Ta classe de base TMC_BasicBtn publie les propriétés de Caption2, mais laisse en protected les propriétés de Caption1 : donc un composant dérivé va obligatoirement avoir un Caption2, sans nécessairement avoir de Caption1 : un peu incohérent. Une classe de base doit avoir le max de propriétés en protected pour laisser libre les classes dérivées. Personnellement, je n'aurais introduit les propriétés et procédures pour Caption2 que dans la classe dérivée TMC_DblCaptionBtn.

Malgré ces erreurs (mais normal pour un premier compo), tu as compris le principe de classe. Pour cette raison et pour l'originalité du composant, bonne note...

Thierry
PS: merci de m'avoir cité.
cs_mcapp Messages postés 71 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 15 décembre 2011
14 juin 2006 à 23:20
Si quelqu'un avait une réponse pour corriger l'instabilité mentionnée dans ma Démo : perte de quelques pixels dans la largeur des boutons insérés dans un TPanel avec TSplitter...
J'impose 306 pixels de largeur au bouton, pour 309 px au TPanel.
Puis, en "travaillant" dans Delphi 2005, je constate, tout à coup, une perte de qq pixels (302 au lieu de 306). Ce qui m'oblige à réécrire la valeur 306 px.
Une solution ??? Merci !
Rejoignez-nous