COMPOSANT BOUTON MULTI-USAGES AU LOOK ENTIEREMENT PERSONNALISABLE (NOUVELLE VERS

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
- - Dernière réponse : ThWilliam
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
- 8 août 2006 à 11:53
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/36921-composant-bouton-multi-usages-au-look-entierement-personnalisable-nouvelle-version

ThWilliam
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2 -
Merci à toi, zek.

"Prefix" : ne sert que si tu utilises un fichier ressources (.res) pour stocker les bitmaps, au lieu d'un ImageList. Les fichiers ressources peuvent avoir des avantages, notamment dans le cas de 2 ou plusieurs programmes qui utiliseraient les mêmes bitmaps. Il suffit, dans ce cas, de recopier le fichier .res dans le dossier de ton nouveau programme et d'inclure la directive de compilation {$R monfichier.res}.
Regarde les commentaires au début de l'unité MyButtons : tu y trouveras un exemple de Prefix.

A +
Thierry
zek67
Messages postés
1
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
8 août 2006
-
Bonjour, tout d'abord bravo pour ce composant !

Une petite question : à quoi sert le "Prefix" dans les "Glyphs" ?

Merci d'avance pour la réponse.

A+ z.e.k
cs_mcapp
Messages postés
74
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
15 décembre 2011
-
Je vois que d'autres personnes s'inspirent de ton composant pour élaborer de nouveaux projets et expriment aussi leur enthousiasme.
Je crois, effectivement, que tu mérites totalement ces marques de gratitude car ton composant est réellement très intéressant et incite à s'en inspirer pour d'autres créations !
Encore bravo, Thierry !
ThWilliam
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2 -
Merci N_M_B.
Cela fait sacrément plaisir de voir que son code est utile à d'autres dans l'écriture de leur propre source.
A +
Thierry
N_M_B
Messages postés
103
Date d'inscription
mardi 9 mai 2006
Statut
Membre
Dernière intervention
1 mars 2008
-
rebonjour ThWilliam ! je tenais a te remercier pour ton magnifique TSimpleBtn c'est sur lui que je me suis basé pour faire mon 1er compo qui sera biento dans mes sources(juste un petit nettoyage de code ''oui oui je suis très brouillon ^^ '')
bravo !!! 10/10 $
@+

N*M*B
cs_mcapp
Messages postés
74
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
15 décembre 2011
-
Merci beaucoup Thierry, ton explication me satisfait pleinement. Cela fonctionne très bien !
J'ai tout à fait, ainsi, ce que je souhaitais.
Je réfléchis maintenant à une modification de ce code dans l'Unit ou dans ton composant SimpleBtn pour que le texte "deuxième ligne" se comporte comme le texte Caption : j'ai inséré le SimpleBtn dans un Panel étirable et rétractable avec un TSplitter. Le texte Caption se rétracte bien avec le Panel mais pas le texte "deuxième ligne".

A+
Mcapp
ThWilliam
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2 -
Bonjour Mcapp,
désolé de ne pas avoir pu te répondre plus vite...

Il y a moyen de faire cela sans modifier MyButtons.pas : dans Caption, tu ne mets que le titre, puis :

procedure TForm1.SimpleBtn1BeforePaint(Sender: TObject);
var
s: string;
x, y: integer;
begin
with Simplebtn1 do //ou with Sender as TSimpleBtn
begin
s:= 'deuxième ligne'; // ou case Tag of 1: s:= ' '; 2: s:=' '...
Canvas.Font.Style:=[];
Canvas.Brush.Style:= bsClear; // pour écrire en transparence
x:= (Width - Canvas.TextWidth(s)) div 2; // calcul de x
// pour centrer le texte
y:= Height - 15;
Canvas.TextOut(x, y, s);
// remettre le style en gras pour le dessin de Caption
Canvas.Font.Style:= [fsBold];
end;
end;

Remarques : si tu fais "bouger" le texte au click, tu devras en tenir compte pour le calcul de x et y (décaler x et y de 1 pixel).
Le petit ennui est que tu ne verras pas ta seconde ligne en mode conception, donc plus difficile à régler sa position.

A +
Thierry
cs_mcapp
Messages postés
74
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
15 décembre 2011
-
Bonjour Thierry !
Comme tu vois, j'exploite toujours la grande qualité de tes composants.
Ma question est la suivante :
Dans l'utilisation de la propriété Caption, pourrait-on envisager une partie du texte (titre) en gras et l'autre partie en caractères simples ?
Cela passe-t-il par une moification du code de MyButtons.pas avec insertion de 2 rectangles textes, l'un pour le titre en gras et l'autre pour le texte simple ?
A +
Mcapp
cs_mcapp
Messages postés
74
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
15 décembre 2011
-
Grand Merci Thierry !
Ca fonctionne ! Je récupère donc mes projets qui étaient déjà complexes.
Cela "eut été" rageant de tout perdre.
Encore toutes mes félicitations pour tes composants !
A+
Mcapp
cs_mcapp
Messages postés
74
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
15 décembre 2011
-
Excuse-moi : je viens de me rendre compte que je devais écrire : Glyphs.GlyhList !
Je corrige mon erreur et te tiens au courant !
Mcapp
cs_mcapp
Messages postés
74
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
15 décembre 2011
-
Merci Thierry !
Je suis grandement intéressé par ton composant ! Je me suis donc hâté d'exploiter tes conseils !
J'ai donc fait exactement, dans mon Unit1.dfm,ce que tu m?as indiqué.
Mais maintenant à l'ouverture dans Delphi, j'ai le message d'erreur : « Erreur lors de la lecture de SimpleBtn1.Glyph.GlyphList : La propriété Glyph n'existe pas. »
Mcapp
ThWilliam
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2 -
Bonjour Mcapp,

Je suis d'accord de reproposer l'ancienne version, mais la nouvelle me semble plus aboutie, donc ce serait dommage de s'en passer (lol).
Ce qui provoque les erreurs d'ouverture ce sont les propriétés GlyphList et Glyphs. Pour y remédier, voici une solution relativement simple :
Tu ouvres par le bloc-notes les fichiers .dfm associés aux unités dans lesquelles tu as déclaré des TSimpleBtn (ex: unit1.dfm). Tu fais une recherche sur "Glyph".
- tu supprimes les lignes Glyphs = '...'
- pour les lignes contenant les propriétés GlyphList, GlyphLayout, GlyphAdjustV, GlyphAdjustH : tu ajoutes au début : <Glyphs.> (donc GlyphList ImageList1 --> Glyphs.GlyphList ImageList1).
Delphi va pouvoir ouvrir ton projet, et tu n'as plus qu'à assigner les valeurs pour les propriétés Glyphs.G0_up...
Si tu as employé la function State (ex: if State 0) tu dois remplacer par : if Ord(State) 0 (ou if State = stUp).
Je te conseille de faire un back up de ton projet avant de toucher aux dfm.
Si tu as des problèmes, n'hésite pas à m'en faire part. Cela fait vachement plaisir de savoir que son code est utile à d'autres (tu verras quand tu déposeras tes propres sources).
A +
Thierry
cs_mcapp
Messages postés
74
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
15 décembre 2011
-
bonjour,
j'ai déjà réalisé des projets avec ton ancienne version. Mais, maintenant j'ai messages d'erreurs à l'ouverture dans Delphi car les propriétés de boutons déjà sur les forms ne sont plus reconnues par Delphi.
Ne pourrais-tu pas proposer encore l'ancienne version de ton composant SimpleBtn mais qui aurait un nouveau nom dans la palette d'outils afin de pouvoir réouvrir mes anciens projets en modifiant le code des Units.
Merci à toi !
MCapp
ThWilliam
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2 -
Salut Mauricio,
Merci pour ton commentaire.

Concernant la propriété State : tu as raison, l'emploi de 0,1,2... n'est pas très pratique. Ta proposition de TBasicState est excellente. Ou alors employer des constantes publiques :
const
TBS_Up = 0;
TBS_MsOnUp = 1;
...
ce qui permettrait dans du code externe, d'employer au choix "if State 0" ou "if State TBS_Up".

Pourquoi j'utilise TImageList: c'est vrai que c'est plus lourd à gérer que des glyphs incorporés (comme TSpeedButton) surtout si on n'a besoin que d'1 ou 2 boutons. Mais imagine un gros projet : j'ai, par exemple, un logiciel de comptabilité qui reprend le même bouton avec le même glyph sur 30 forms différentes. En plaçant un ImageList p.ex. dans un DataModule, cela permet une grosse économie de ressources et de plus, en remplaçant le glyph, tu changes en une fois l'aspect des 30 boutons.

Concernant la propriété Glyphs : j'avais d'abord créé une propriété pour chaque indice, puis créé une classe reprenant les 8 propriétés pour que cela apparaisse dans l'inspecteur d'objets comme un noeud à développer (les propriétés de type Record n'étant malheureusement pas publiables). Puis j'ai pensé à une variable de type string avec stockage en tableau, pcq je trouvais cela finalement le plus facile à employer, mais c'est un avis purement personnel.
Tes remarques sur la difficulté d'utilisation me sont très utiles. Elles me donnent l'idée que la classe de base (TBasicBtn) devrait encore être plus basique (en gros, ne gérer que les états) et, à partir de là, dériver des boutons avec des propriétés propres pour l'affichage. Allez, j'ai encore du boulot...
J'attends aussi ton futur bouton avec impatience.
A+
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
G mis 10/10 car je sais que tu vas tenir compte de mes remarques (Au moins celle concernant le State) ...
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Salut ThWilliam,
j' ai enfin trouvé 5 minutes pour tester ton compo.
Tout d' abord, tu as raison, mes compos sont spécifiques ...

Mais revenons à ton compo:
si c' est ton 1er compo, je ne peux que te féliciter et j' attends avec impatience les futurs compos que tu feras.

par contre, il y a quand même quelques chose qui me gêne:

case State of
1: xxx;
2: yyy;
end;

Ta propriété State de ton compo est un integer, pourquoi n' a tu pas crée un type pour l' état du compo genre: TBasicSate=(TbsNormal, tbsDown, etc ..);

La gestion indépendante de la position du caption et du glyph est un très bon choix à mon avis. L' utilisation du TImageList aussi mais la propriété Glyphs me semble lourde à gérer. Pour une plus grande facilité d' utilisation du compo, il aurait peut être fallu créer une propriété pour chaque indice image.

Pour résumer, je dirais que le compo est complet (il ne manque rien, c' est dingue) mais un peu difficile à utiliser.

En tout cas, il m' a donné envie de créer un bouton dans le genre de celui-ci.
A+

PS: j' ai pas trop regardé le code du compo, j' ai simplement vu que c' est très bien présenté.
ThWilliam
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2 -
Salut Mauricio,
J'ai été voir le code de tes 2 composants.
Ce sont des composants plus spécifiques, donc rien à voir avec mon compo que j'ai voulu le plus ouvert possible.
ThWilliam
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2 -
Salut f0xi,
TSpeedButton n'est pas focalisable. Tu ne lui trouves aucun intérêt ?
C'est vrai que j'aurais peut-être dû indiquer : "bouton outil".
f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26 -
Un boutton qui ne gere pas le focus ? quel interet ?

un petit truc pour toi :

voir la prop ControlStyle/ControlState de la classe de base TControl !


un bon point pour toi d'avoir utilisé l'ancetre TGraphicControl et non comme certains le font souvent TPanel et TImage... no comment.