IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Affecter une image d'un TImageList à un bouton [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Affecter une image d'un TImageList à un bouton
    Bonjour à toutes et à tous,

    Me voilà bien en peine, je n'ai pas trouvé le moyen d'affecter une des images contenues dans un TImageList à un TSpeedButton. Voilà ce que j'ai essayé sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i: Integer;
    begin
      for i:= 0 to NbBoutons-1 do
      begin
        Bouton[i]:= TSpeedButton.Create(Self);
        with Bouton[i] do
        begin
          Parent:= Self;
          Height:= 83;
          Width:= 87;
          ListImgBtn.Draw(Glyph.Canvas, 0, 0, i, True);
    //      Glyph:= TBitmap(ListImgBtn.Components[i]);
          Left:= i*(Width+8);
        end;
      end;
    end;
    Que ce soit la ligne 13 ou 14 du code ci-dessus, le résultat est le même : les boutons s'affichent, mais sans images !

    J'ai essayé aussi avec un TSpeedButton venant de la barre de composants : même résultat.

    Une idée de ce qu'il faut faire ?

    Cordialement.

    Pierre

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 916
    Billets dans le blog
    6
    Par défaut
    Bonsoir,
    Ne faut-il pas affecter la liste à Images et renseigner ImageIndex ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonsoir,
    Ne faut-il pas affecter la liste à Images et renseigner ImageIndex ?
    Je suis avec Lazarus 1.6.4 et j'ai vu ces propriétés dans un TMenu, mais aucun bouton (dont TSpeedButton) n'a ni propriété "Images" ni propriété "ImageIndex" .

    Cordialement.

    Pierre

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    Bonsoir !

    Je n'ai pas essayé, mais sur cette page on donne le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageList1.GetBitmap(iIndex, SpeedButton1.Glyph);
    Bonne chance !

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonsoir !

    Je n'ai pas essayé, mais sur cette page on donne le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageList1.GetBitmap(iIndex,SpeedButton1.Glyph);
    Bonne chance !
    Ben j'avais essayé, mais pas de chance, GetBitmap(...) n'existe pas en 1.6.4 !

    Cordialement.

    Pierre

  6. #6
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Ben j'avais essayé, mais pas de chance, GetBitmap(...) n'existe pas en 1.6.4 !

    Cordialement.

    Pierre
    Salut c'est peut-être bête mais est-ce que la propriété Glyph (TBitmap) est initialisée (different de nil) ?

    Si non peut-être juste en rajoutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SpeedButton.Glyph := TBitmap.Create; // ici c'est peut-être pas la peine
    SpeedButton.Glyph.Width := 16; // Mais définir les dimensions avant de copier, oui,  car si 0x0 rien ne s'affichera
    SpeedButton.Glyph.Height := 16;
    ListImgBtn.Draw(SpeedButton.Glyph.Canvas, 0, 0, i, True);
    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut c'est peut-être bête mais est-ce que la propriété Glyph (TBitmap) est initialisée (different de nil) ?

    Si non peut-être juste en rajoutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SpeedButton.Glyph := TBitmap.Create; // ici c'est peut-être pas la peine
    SpeedButton.Glyph.Width := 16; // Mais définir les dimensions avant de copier, oui,  car si 0x0 rien ne s'affichera
    SpeedButton.Glyph.Height := 16;
    ListImgBtn.Draw(SpeedButton.Glyph.Canvas, 0, 0, i, True);
    A+
    Mon Glyph n'était pas initialisé. J'ai rajouté les lignes que tu m'as dites et au lieu de n'avoir aucune image, j'ai une image toute noire.

    Je suis alors passé par un Bmp intermédiaire et maintenant, ça fonctionne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    procedure TLanceur.FormCreate(Sender: TObject);
    var
      i: Integer;
      Bmp: TBitmap;
    begin
      Bmp:= TBitmap.Create;
      Bmp.Width:= 82;
      Bmp.Height:= 78;
      for i:= 0 to NbBoutons-1 do
      begin
        Bouton[i]:= TSpeedButton.Create(Self);
        with Bouton[i] do
        begin
          Parent:= Self;
          Height:= 83;
          Width:= 87;
          ListImgBtn.Draw(Bmp.Canvas, 0, 0, i, True);
          Glyph.Assign(Bmp);
          Left:= i*(Width+8);
        end;
      end;
      Bmp.Free;
    end;
    Bizarre.

    Cordialement.

    Pierre

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 089
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 089
    Par défaut
    Salut,

    Citation Envoyé par ChPr Voir le message
    Je suis alors passé par un Bmp intermédiaire et maintenant, ça fonctionne !
    Moi je n'en utilise pas.

    Je crée des TBitBtn dynamiquement, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      mrvArrayView[i] := TMirrorBitButtonV.Create(pnlArrayView[i]); // TBitBtn
      with mrvArrayView[i] do begin
        inherited;
        Parent := pnlArrayView[i]; // un bête TPanel créé dynamiquement lui aussi
        AutoSize := False;
        SetBounds (PNLLARGEUR-BUTTONCONST-1, PNLHAUTEUR-BUTTONCONST-1, BUTTONCONST, BUTTONCONST);
        Caption := '';
        Color := clMedGray;
        imglist4Glyph12.GetBitmap(3, Glyph); // TImageList 12x12
        Hint := 'Miroir vertical';
        ShowHint := True;
        OnClick := @MiroirV;
      end;
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    type
      TRotateBitButton = class(TBitBtn)
      public
        { public declarations }
        property Caption;
        property Glyph;
        property OnClick;
        property ShowHint;
      end;
     
      TMirrorBitButtonV = class(TRotateBitButton)
      end;
     
    var
      pnlArrayView: array [0..MAXIMAGES-1] of TPanel;
      mrvArrayView: array [0..MAXIMAGES-1] of TMirrorBitButtonV;
    sans oublier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const
      MAXIMAGES  = 100;
      PNLHAUTEUR = 200;
      PNLLARGEUR = 180;
      BUTTONCONST = 24;

  9. #9
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ... Moi je n'en utilise pas.

    Je crée des TBitBtn dynamiquement, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
        imglist4Glyph12.GetBitmap(3, Glyph); // TImageList 12x12
    ...
    J'ai dit un peu plus haut qu'avec ma version 1.6.4, la fonction GetBitmap(...) n'existait pas.

    Cordialement.

    Pierre

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 089
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 089
    Par défaut
    Citation Envoyé par ChPr Voir le message
    J'ai dit un peu plus haut qu'avec ma version 1.6.4, la fonction GetBitmap(...) n'existait pas.
    Ah, peut-être alors as-tu une version exotique ?
    Car ça, ça m'épate (de mouche !)

    "Ils" auraient supprimé juste dans la 1.6.4 la procédure GetBitmap ?
    Parce que le code que j'ai posté a été écrit avec une vieille 1.4, certes, mais voilà ci-dessous les copies d'écran de haut en bas d'une 1.6.2, puis 1.8.2, et enfin 2.0.4.

    Nom : 162-182-204.jpg
Affichages : 606
Taille : 92,2 Ko

    Et force est de constater que la complétion propose la procédure (je ne suis pas allé plus loin).

  11. #11
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Ah, peut-être alors as-tu une version exotique ?
    Car ça, ça m'épate (de mouche !) ...
    Mea culpa, mea maxima culpa , la sénilité me guette. Pour moi, cette fonction devait appartenir à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonBouton.Glyph.GetBitmap(MaListeImages, Index);
    qui me semblait une évidence dans la syntaxe car c'était "MonBouton.Glyph" qui requérait une image de la Liste d'images.

    Dans ma tête, MaListeImages.GetBitmap(Index, UneImage) voulait dire : "MaListeImages" requiert une image pour l'ajouter à sa liste ... d'où ma confusion et je n'ai pas pensé un seul instant que ce fut l'inverse.

    La "procédure" MaListeImages.GetBitmap(Index, MonBouton.Glyph) existe bien dans la version 1.6.4.

    Cordialement.

    Pierre

  12. #12
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 089
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 089
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Mea culpa, mea maxima culpa , la sénilité me guette.
    Mais non, mais non, on se fait tous avoir avec ce genre de noms à double sens, moi c'est aBitmap.Canvas.Draw(l, t, src) qui m'embrouille, parce qu'au final c'est la source qui va être dessinée dans le canvas du bitmap.

    Quand je me fais des procs/fonctions perso, si le nom est ambigu (ce que j'essaye d'éviter), je rajoute "to" ou "from", et je ne suis pas le seul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Procedure DrawToOpenGL(DisplayRect: TRect);
        Procedure DrawTo(Canvas: TCanvas);
    source.

  13. #13
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 916
    Billets dans le blog
    6
    Par défaut
    C'est piégeux, en effet
    On pourrait faire des TBimap helpers qui exposeraient une méthode FromList(aList, aIndex).
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  14. #14
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 089
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 089
    Par défaut
    Yop !
    Citation Envoyé par tourlourou Voir le message
    On pourrait faire des TBitmap helpers qui exposeraient une méthode FromList(aList, aIndex).
    Plutôt le boulot des gens de FreePascal, non ?

  15. #15
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 916
    Billets dans le blog
    6
    Par défaut
    Oui, tu as raison. On peut tout de même se faire une unité MyTricks ou MyUtils pour se simplifier la vie et gagner du temps au final, en évitant de se prendre la tête plusieurs fois sur des bêtises.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  16. #16
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 089
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 089
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    […] se faire une unité MyTricks ou MyUtils […]
    qui serait prise en compte par la complétion ? Ça dépasse mes compétences,

  17. #17
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut
    Citation Envoyé par Jipété Voir le message
    qui serait prise en compte par la complétion ? Ça dépasse mes compétences,
    Oui, quand tu te sert des assistants "Helper", c'est pris par la complétion de code A savoir tu ne peut avoir qu'un seul assistant par type au quel cas ce sera le dernier déclaré (ordre dans les uses) qui sera pris en compte.

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. affecter une image au paramètre d'une requête
    Par RodEpsi dans le forum Bases de données
    Réponses: 1
    Dernier message: 03/12/2006, 11h44
  2. Comment affecter une image a un PictureBox par code?
    Par ayouss dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 25/07/2006, 08h26
  3. Comment je peux affecter une image a mon profil
    Par jlassira dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 5
    Dernier message: 09/03/2006, 21h44
  4. Mettre une image a la place du bouton parcourir
    Par Death83 dans le forum Langage
    Réponses: 3
    Dernier message: 04/09/2005, 20h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo