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

Delphi Discussion :

Probleme image dans combobox.


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut Probleme image dans combobox.
    Bonjour, j'ai utiliser la méthode suivant afin de mettre des images dans une combobox :

    Un TimageList contenant les images à placer dans la combobox.
    Une combobox de style : csOwnerDrawFixed


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFmain.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    begin
    marge := (Rect.Bottom - Rect.Top - imageList1.Height);
    imagelist1.Draw(ComboBox1.canvas, Rect.Left, Rect.Top + marge, Index);
    end;
    Marge est un integer.

    Le tout fonctionne trés bien, mais lorsque que je passe la souris sur un élément, l'éspece de cadre pointilliste de séléction (celui lorsque l'on survolle un élément à cliquer) reste afficher en permanance ! Je ne comprends pas comment corriger ceci, car sa supprime vraiment tout le coté ésthétique ...

    Une astuce ? merci d'avance !

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 2 474
    Points : 2 120
    Points
    2 120
    Par défaut
    Je pense que ca viens du parametre State :

    Citation Envoyé par Aide Delphi
    odSelected L'élément est sélectionné.
    odGrayed L'élément doit apparaître grisé.
    odDisabled L'élément est désactivé.
    odChecked L'élément doit apparaître coché. (Ceci ne s'applique pas à tous les objets)
    odFocused La saisie clavier est dirigée sur l'élément.
    odDefault L'élément est celui par défaut (ceci ne s'applique pas à tous les objets)
    odHotLight L'élément est en surbrillance car il est sous la souris (seulement si le système d'exploitation supporte la surbrillance)

    odInactive L'élément et son menu associé sont inactifs (seulement sous Windows 98 ou version supérieure)
    odNoAccel Tout soulignement d'un caractère raccourci doit être évité lors du dessin du contrôle (seulement sous Windows 2000 ou version supérieure)
    odNoFocusRect N'affiche pas d'indicateur visuel montrant la focalisation (seulement sous Windows 2000 ou version supérieure)
    odReserved1 Pas utilisée actuellement.
    odReserved2 Pas utilisée actuellement.
    odComboBoxEdit Le dessin prend place dans la boîte de saisie d'un contrôle boîte à options.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    Me voilà un peu perdu, parlez vous de "State: TOwnerDrawState" ?

    Sinon pouriez vous m'expliquer comment utiliser les paramettres que vous m'avez soumis s'il vous plaît ?

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 2 474
    Points : 2 120
    Points
    2 120
    Par défaut
    j'ai peur d'avoir parlé trop vite.
    Je viens de retourner voir sur l'aide et visiblement la property state n'est pas transmise par adresse (ie var) donc ne peux remonter des informations.

    En regle general, les evenements transmettent des variable de ce type par adresse pour que suite a l'execution du code utilisateur, le composant finisse le traitement en tenant compte de ce qui a deja ete fait.

    Je pensais que faire remonter dans la variable state une valeur ne differente de "selecionné" resoudrais le probleme.

    Il semblerais que cela ne soit pas aussi evident
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    , ce n'est pas grave, merci quand meme.
    Ceci dit, peut être connaissez vous un composant ou une autre métode de mettre des images dans une combobox.
    Je serai preneur .

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Si cela peut te dépanner dans mon cas d'une ListBox multicolore j'ai pu éliminer le pointillé de la façon suivante en envoyant le Focus ballader ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TFmain.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    begin
    marge := (Rect.Bottom - Rect.Top - imageList1.Height);
    imagelist1.Draw(ComboBox1.canvas, Rect.Left, Rect.Top + marge, Index);
    Button1.SetFocus;
    end;
    ... et rien n'empêche d'utiliser un TButton rendu invisible ou d'envoyer le focus sur n'importe quel objet présent qui peut le recevoir.
    ... y'a pas de raison pour que cela ne marche pas chez toi.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : avril 2002
    Messages : 523
    Points : 1 909
    Points
    1 909
    Par défaut
    Il faut juste effacer le contenu du rectangle avant de tracer sinon le rectangle de sélection reste visible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    var
      marge: Integer;
    begin
      marge := (Rect.Bottom - Rect.Top - imageList1.Height);
      ComboBox1.Canvas.FillRect(Rect);
      imagelist1.Draw(ComboBox1.canvas, Rect.Left, Rect.Top + marge, Index);
    end;

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    J'ai retenu la réponse de Pierre Castelain, mais qui cette fois fait place à un autre bug:
    Si j'ouvre ma combobox et que rapidement je survolle un élément, l'élément va apparaitre dans la case des éléments séléctionnés mais sans être cepandant listé comme un élément cliqué indéxé ...
    Mais pour quelqu'un de normal sa e devrai pas poser de problemes, merci beaucoup !

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Essayes la parade que j'avais signalée pour renvoyer le Focus ailleurs après avoir récupéré la valeur de l'index sélectionné comme suit, mais en l'adaptant au cas du ComboBox, car ici j'utilise cette parade dans le cas de la variante suivante :
    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
    24
    //Variante pour passer en couleur l'Item d'un ListBox sélectionné :
    var       iSelection : integer;
    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    begin     ListBox1.Style:=(lbOwnerDrawFixed);
              with ListBox1.Canvas do
              begin Font.Color:=clBlack; // Couleur de fonte
                    if Index=iSelection
                    then Brush.Color:=clAqua   // Couleur d'arrière plan
                    else Brush.Color:=clWhite; // alternée bleu/blanc
                    FillRect(Rect);  // Remplit Rect(Index) du canvas avec Brush.color
                    TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]); // Texte de l'Item
              end;
              Button1.SetFocus; //pour éliminer le pointillé
    end;
    
    procedure TForm1.ListBox1Click(Sender: TObject);
    var       i:integer;
    begin     ListBox1.MultiSelect:=false;
              iSelection:=ListBox1.ItemIndex; //: sauve la valeur de l'Index sélectionné          
              for i:=0 to ListBox1.Items.Count-1
              do ListBox1DrawItem(ListBox1,i,ListBox1.ItemRect(i),[odChecked]);
              ListBox1.reFresh;
    end;
    ... ça pourra peut-être te dépanner.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    Aprés éssai (et remplacement des listbox par combobox ) je remarque que les couleurs que tu affectes aux canvas surpassent mes images et donc j'ai des boites blanches maintenant :s.


    De plus, le code ne fonctionne visiblement pas du tout pour une Combobox :s.
    Mais merci quand meme (j'ai peut être fait une fausse manipulation).

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour
    Aprés éssai (et remplacement des listbox par combobox ) je remarque que les couleurs que tu affectes aux canvas surpassent mes images et donc j'ai des boites blanches maintenant :s.
    ... mais rien ne t'oblige à utiliser les lignes de la partie suivante de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
              with ListBox1.Canvas do
              begin Font.Color:=clBlack; // Couleur de fonte
                    if Index=iSelection
                    then Brush.Color:=clAqua   // Couleur d'arrière plan
                    else Brush.Color:=clWhite; // alternée bleu/blanc
                    FillRect(Rect);  // Remplit Rect(Index) du canvas avec Brush.color
                    TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]); // Texte de l'Item
              end;
    ... celles-ci répondaient à mon besoin où je voulais du bleu et du blanc régénéré à chaque appel de la routine.
    ... l'essentiel à récupérer dans mon code c'est le Button1.SetFocus; destiné à éliminer le pointillé qui te posait un problème. L'exemple de ma listBox était donné juste pour montrer l'emplacement du Button1.SetFocus et la façon de récupérer le iSelection:=ListBox1.ItemIndex qui mémorise la valeur de l'Index sélectionné, mais tout le reste ne concerne que ma ListBox où je voulais moi-aussi éliminer les pointillés et ça marche.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    Ok...
    J'ai parfois des éxcés de stupidité, la plupart des gens font comme si ....

    Merci !

Discussions similaires

  1. probleme image dans userform
    Par panda78 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/07/2012, 10h08
  2. Image dans ComboBox
    Par paesportcomputing dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 09/11/2011, 11h06
  3. Probleme image dans une div
    Par badr dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 30/09/2007, 00h06
  4. Images dans combobox
    Par Arthis dans le forum ASP.NET
    Réponses: 1
    Dernier message: 13/08/2007, 14h15
  5. [débutante]Probleme de liens image dans JSP/Servlet
    Par celine31 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/11/2004, 15h51

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