TButton avec Skin

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 16 janv. 2017 à 20:28
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 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

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
Modifié par Cirec le 29/01/2017 à 23:05
Super,

modification faite et nouveau Zip en ligne ... ça devrait rouler maintenant ;)

Sinon as tu déjà testé le code avec Berlin 10.1 depuis l'avant dernière modif ?
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
29 janv. 2017 à 15:09
Testé, la nouvelle version marche parfaitement sous XP.
Juste un détail :
Il faut rajouter un refresh dans Button_SetSkinImageList, sinon ça rafraîchit quand on enlève le skin, mais pas quand on le met.

begin
    aBtnImgList.himl := Imagelisthwnd;
    Result := BOOL(SendMessage(aBtn.Handle, BCM_SETIMAGELIST, 0,
      LPARAM(@aBtnImgList)));
    aBtn.Refresh;  // <- ici !
  end

Sinon OK, merci pour ce code intéressant et utile (j'en veux plein des comme ça!)
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
29 janv. 2017 à 00:05
ok,

voici une nouvelle version avec tentative d'incorporation de ton code de correction ...
je dis tentative parce que je ne peux pas tester ;)

Donc tu peux ré-essayer avec D7 et même avec Berlin 10.1 ... j'ai également fait une petite modification afin d'éviter l'erreur que tu as ... croisons les doigts (XX) ^^

ps: l'erreur dont je parle plus haut, sous Berlin 10.1, n'empêche pas la compilation ... l'erreur, si elle se produit, est visuelle ;)
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
28 janv. 2017 à 14:56
Salut Cirec.

Oui, je confirme, sous XP pro 32 bits c'est pas réversible sauf modification du code.

Quelques tests vite faits :

Compilation avec Delphi 7 sous XP pro / Win 8.1 :
- fonctionnement sous Win 8.1 : OK, nickel
- fonctionnement sous XP pro : problème cité ci-dessus, résolu avec une ImageList vide et le refresh

Tentative de compilation avec Berlin 10.1 (beurk) sous Win 8.1 : ça veut pas !
Message du compilateur :
"il y a des erreurs",
ligne en cours-total, conseils, avertissements : 0
erreurs : 1

Pas d'autres indications. Frustrant... :-(
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 janv. 2017 à 18:29
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
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
23 janv. 2017 à 15:17
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...
mauriciopt Messages postés 16 Date d'inscription mercredi 12 juin 2013 Statut Modérateur Dernière intervention 23 mai 2017
23 janv. 2017 à 11:41
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+
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
19 janv. 2017 à 14:19
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 ;)
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
18 janv. 2017 à 16:59
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 !
Rejoignez-nous