TButton avec Skin

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
- - Dernière réponse : Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
- 29 janv. 2017 à 23:05
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/101814-tbutton-avec-skin

Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13 -
Ah oui, ça me plaît bien ! Et ça fonctionne à merveille.

Mais où vas-tu chercher tout ça ?
Tu lis la MSDN à tes moments perdus ? ^ ^

Bravo, merci et surtout continue de nous révéler tes trouvailles !
Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32 > Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
Merci,

je suis très content que tu apprécies ces quelques lignes de code ;)
Mais où vas-tu chercher tout ça ?
Tu lis la MSDN à tes moments perdus ? ^ ^


haha ...
en fait ce que j'aime bien c'est détourner des objets (le plus souvent leurs propriétés) de leurs utilisation initiale ^^
Alors bien souvent c'est impossible sans retoucher le code et des fois, comme ici, ça fonctionne.
j'y ai vue une ouverture et ... ^^

Initialement Windows a prévu une propriété pour assigner des icônes aux TButton(présent dans l'IDE depuis Delphi2009 *) ... je l'utilise ici pour afficher un "Skin" à la place ... ce qui fonctionne très bien et permet surtout de conserver toutes les autres propriétés de base du TButton ;)


Et oui ... la MSDN est un de mes sites favoris ... ça demande pas mal d'heures de recherches et de lecture mais on y trouve parfois des informations non utilisées dans nos IDE ... et du coup de nouvelles fonctions ou astuces.

Le plus drôle c'est que j'avais pas prévu de poster ce petit code ... c'est suite au dépôt de Dubois77 que je me suis souvenu que j'avais "pondu" ceci ^^
  • Sous Delphi2009 seulement 5 index sont disponibles ...

Sous Berlin10.1 les 6 index sont présents on devrait donc (pas testé) pouvoir faire la même chose sans code supplémentaire ;)
mauriciopt
Messages postés
18
Date d'inscription
mercredi 12 juin 2013
Statut
Modérateur
Dernière intervention
23 mai 2017
-
Salut,

pas si inutile que ça, ça m' a plu en tout cas.
malheureusement, sur les boutons d' en haut, le skin ne cache pas totalement le bouton (il est par dessus et centré), bizarre ...

Détourner les compos de base, c' est devenu aussi un de mes petit plaisirs, il n' y a qu' à voir le compos Cindy (je te laisse regarder le TcyBitBtn), peut être un sport national si d' autres s' y mettent ^^

a+
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15 -
Salut,

Trèèèès interessant !

"le code étant très simple il n'y a pas commentaire"
Ouais… enfin…
Le code peut-être, mais ta démarche est quand même plus difficile à appréhender au premier abord (au second aussi, d'ailleurs...)
Pour ma part, je n’ai pas immédiatement tout compris.
Faut dire, la MSDN, je m’en sers de sommnifère : j'en lis 10 lignes, c’est plié… ^^

Il n'y a qu'un truc qui me gêne (*) : c'est la possibilité que tu sembles nous offrir de choisir "skin / pas skin" à l'exécution.
Or, une fois le skin choisi, ça n'est pas réversible.
L'instruction "aBtnImgList.himl := 0" semble n'avoir aucun effet chez moi (Delphi7, xp pro).
Du coup, la CheckBox et la variable booléenne "SkinOn" ne sont plus vraiment utiles, à mon avis.
Cependant, en ajoutant une ImageList vide et en modifiant la ligne de code citée plus haut, de même qu'en appliquant un refresh afin de visualiser immédiatement l'effet produit, ça résoudrait le problème :

procedure TfrmMain.SetSkinButton(SkinOn: Boolean);
var
  aBtnImgList: TButtonImageList;
begin
  if SkinOn then
    aBtnImgList.himl := ImageList1.Handle
  else
    //aBtnImgList.himl := 0;
    aBtnImgList.himl := ImageList3.Handle; // <- ImageList vide !
  aBtnImgList.margin := Rect(1, 1, 1, 1);
  aBtnImgList.uAlign := BUTTON_IMAGELIST_ALIGN_CENTER;

  Button_SetImageList(Button1.Handle, aBtnImgList); Button1.Refresh;
  Button_SetImageList(Button2.Handle, aBtnImgList); Button2.Refresh;
  Button_SetImageList(Button3.Handle, aBtnImgList); Button3.Refresh;


  if SkinOn then
    aBtnImgList.himl := ImageList2.Handle
  else
    //aBtnImgList.himl := 0;
    aBtnImgList.himl := ImageList3.Handle;
  aBtnImgList.margin := Rect(1, 1, 1, 1);
  aBtnImgList.uAlign := BUTTON_IMAGELIST_ALIGN_CENTER;
  
  Button_SetImageList(Button4.Handle, aBtnImgList); Button4.Refresh;
  Button_SetImageList(Button5.Handle, aBtnImgList); Button5.Refresh;
  Button_SetImageList(Button6.Handle, aBtnImgList); Button6.Refresh;
  Button_SetImageList(Button7.Handle, aBtnImgList); Button7.Refresh;
end;


Qu'en penses-tu ?


(*) mais en fait y’a plein de trucs comme ça qui me gênent, par exemple, et en vrac, les étiquettes qui grattent à l’intérieur des t-shirts, l’usage immodéré du mot "juste" dans la moindre phrase (laissons donc cet usage à la langue anglaise), l'obsolescence programmée, la disparition de toutes les espèces de singe d’ici 2050, et pleins d'autres choses encore, c'est même pas croyable...
Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32 -
Merci pour votre retour ;)

malheureusement, sur les boutons d' en haut, le skin ne cache pas totalement le bouton (il est par dessus et centré), bizarre ...
je n'ai jamais observé ce genre de problème ... théoriquement ça voudrait dire que le bouton est plus grand que l'image ...
à la base c'est prévu pour ajouter une icône au bouton et pas pour le skiner ^^


Il n'y a qu'un truc qui me gêne (*) : c'est la possibilité que tu sembles nous offrir de choisir "skin / pas skin" à l'exécution.
Or, une fois le skin choisi, ça n'est pas réversible.

oui normalement ça l'est ... et comme je n'ai plus de poste avec XP :( je ne peux pas tester la chose
Mais si tu me dis que ça fonctionne avec ta méthode je peux voir pour l'inclure dans le code de manière invisible ;)

sinon pour info.
j'ai compilé et testé le code avec
Delphi7
Delphi2009
Berlin 10.1
sous Win Seven pro

il n'y a que sous Berlin 10.1 qu'un petit souci est apparu (assez bizarre d'ailleurs) je ne vous en dit pas plus pour l'instant ... si vous pouviez tester de votre coté avec Berlin 10.1(pour ceux qui l'ont *) et me dire quel est le résultat à l'exécution et sous quel OS ... je suis curieux de connaitre vos résultat ;)

(*) pour ceux qui ne l'ont pas encore l'offre est toujours valable
Télécharger gratuitement Delphi 10.1 Berlin Starter Edition