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

Composants VCL Delphi Discussion :

[TCombobox] Item multiligne


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 29
    Points
    29
    Par défaut [TCombobox] Item multiligne
    Bonjour,
    Derniere tentative de recherche de composant (j'ai deja posé ce pb la semaine derniere et effectué une premiere recherche sur le net).
    Je recherche un composant style TCombobox, dont le texte de chaque item pourrait être ecrit sur plusieurs ligne dans la liste déroulante (je sais que c'est un peu a contresens de la "phylosophie" d'une liste deroulante...)
    Savez vous si cela existe, ou bien si une manipulation un peu poussée des propriétés me le permettrait? ( et si oui, une petit coup de pouce pour commencer serait le bienvenu)

    Merci d'avance

    bg

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Salut!

    Je comprends pas bien ce que t'entends par

    dont le texte de chaque item pourrait être ecrit sur plusieurs ligne dans la liste déroulante
    Tu peux etre un peu plus explicite

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    A priori, dans une combobox, chaque item est représenté par un string, ecrit sur une seule ligne (pour une combo a une seule colonne).

    Dans la cas d'une chaine trop longue on peut , "facilement", jouer sur la largeur du composant lui même, ou bien sur la largeur de la liste déroulante.
    Pour mon besoin, c'est insuffisant, il faudrait que je puisse faire apparaitre chaque item (String) sur plusieurs ligne dans la combobox, éventuellement indentées, mais que cela continu d'etre considéré comme un seul item. un peu comme si chaque item pouvvait également etre de type Tstrings.

  4. #4
    Membre habitué Avatar de gord's
    Inscrit en
    Avril 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 115
    Points : 127
    Points
    127
    Par défaut
    regarde
    TCustomComboBox.Style=csOwnerDrawVariable, TCustomComboBox.OnMeasureItem et TCustomComboBox.OnDrawItem
    La prochaine révolution informatique : les machines qui font ce qu'on veut, au lieu de faire ce qu'on leur demande...
    Grand Vizir du Grand Gourou - Trois-quart aile gauche du TRFC et intendant de 3ème mi-temps - Papy fait de la résistance

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Comme le dit gord's :

    ComboBox.Style = csOwnerDrawVariable

    Dans l'événement OnMeasureItem, tu calcule quelle taille, en hauteur, te prendra le dessin de chaque item. Je suppose que tu fais un truc du genre WordWrap, donc tu peux faire ComboBox.Font.TextHeight('A')*NbreLignesRequises.

    Dans l'événemtn OnDrawItem, tu dessines chaque item.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par sjrd

    Dans l'événemtn OnDrawItem, tu dessines chaque item.
    D'accord, mais c'est la que c'est un peu neuf pour moi :
    J'ai deja utilisé l'evenement sur une celule de grille mais pas sur un Combo. Je n'arrive donc pas a faire l'analogie sur des trucs comme :

    Comment imposer les dimensions (width) du TRect de l'Item ?
    comment utiliser les fonction TextOUt? TextRect ? ... de quel Canvas?
    Et faut-il découper soit même la ligne ( et quel est alors le caratere de passage à la ligne?)

    Je n'y arrive pas quoi!!
    Ps: si je, suis boulet laissez tomber, je me débrouillerai autrement

    BG

  7. #7
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer;  var Height: Integer);
    Citation Envoyé par aide delphi
    MeasureItemEvent est le type des gestionnaires d'événements sur les contrôles dessinés par l'utilisateur qui permettent àdivers éléments d'une liste d'avoir différentes hauteurs.

    Control est une référence au contrôle contenant l'élément.

    Index est l'indice de l'élément dans la propriétéItems.

    Height correspond àla hauteur par défaut de l'élément,exprimée en pixels.Le gestionnaire d'événement peut redéfinir Height àla valeur appropriée.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);

    Citation Envoyé par aide delphi
    TDrawItemEvent comprend les paramètres suivants :

    Control Une référence au contrôle contenant l'élément.
    Index L'indice de l'élément dans la propriétéItems.
    Rect Les coordonnées de l'élément sur le canevas du contrôle.
    State L'état de l'élément,qui indique si l'élément est sélectionné,coché,a la focalisation,etc.
    Il faut penser à


    Donc dans ton OnMeasureItem, il te suffit de choisir la hauteur (Height).
    Par exemple pour deux lignes :
    Après dans ton OnDrawItem, tu dispose d'un Rect mis aux nouvelles dimensions, Index indique quel est l'item à dessiner.

    il ne reste plus qu'a utiliser dans ce gestionnaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComboBox1.Canvas.TextOut(...)
    aussi présent dans l'aide.

    Voila,
    J'espère que cela pourra t'aider.
    a+
    CV :
    - LinkedIn
    - Viadeo

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    D'accord, d'accord, j'ai lu tout ça, mais je n'ai pas vu, (sans doute trop rapidement parcouru ) deux éléments pour aboutir a mon résultats :

    Est-il propre de modifier la largeur du Trect de mon Item ( Rect.rigth) qui est par defaut la largeur de la chaine que je voudrais précisemment decouper en plusieurs lignes ?

    Comment faire pour "découper" ma chaine en plusieurs lignes ( pour le moment, si je reduis mon TRect, ca reste sur une seule ligne mais je ne vois plus la fin.

    Je rate un truc aussi evident que le nez au milieu de la figure ?

  9. #9
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    En fait il faut utiliser les évènements proposés au dessus et une fonction API de dessin du texte permettant aussi d'en déterminer la taille tout en gérant les sauts de lignes.

    Cette fonction c'est DrawText ( voir MSDN pour les détails ), avec le paramètre DT_CALCRECT elle ne dessine rien mais donne la hauteur nécessaire pour le texte en fonction de la largeur donnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer;var Height: Integer);
    Var Rect:TRect;
    begin
      If Index<0 Then Exit;
      Rect.Left := 0;
      Rect.Right := TComboBox(Control).Width;
      Rect.Top := 0;
      Rect.Bottom := 5;
      Height := DrawText(TComboBox(Control).Canvas.Handle,PChar(TComboBox(Control).Items[Index])
                                     ,-1,Rect,DT_CALCRECT Or DT_LEFT Or DT_WORDBREAK	);
    end;
    Pour le dessin il suffit de l'appeler de nouveau, sans le paramètre DT_CALCRECT afin que le dessin soit effectif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    begin
      with TComboBox(Control) Do With Canvas do
      begin
        // Dessin du fond avec la couleur par défaut
        // Delphi gère lui-même dans ce cas la sélection
        FillRect(Rect);
        if odSelected In State
          Then Font.Color := clHighLightText
          Else Font.Color := clBtnText;
        DrawText(Canvas.Handle,PChar(Items[Index]),-1,Rect,DT_LEFT	Or DT_WORDBREAK	);
      end;
    end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    Je n'ai pas assez le reflexe des fonctrion API, je ne connaissais pas drawtext...
    Merci bien

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

Discussions similaires

  1. [Lazarus] Treeview : Items multilignes (et multiOS)
    Par Invité dans le forum Lazarus
    Réponses: 2
    Dernier message: 07/05/2013, 08h55
  2. TTollbar et TCombobox : Items supprimés
    Par murtis dans le forum C++Builder
    Réponses: 3
    Dernier message: 03/01/2011, 09h31
  3. [Lazarus] [Ubuntu 64 bits] Problème avec Tcombobox.Items.AddObject
    Par pomalo dans le forum Lazarus
    Réponses: 1
    Dernier message: 20/08/2009, 22h35
  4. Avoir une valeur associé à chaque item d'un TComboBox
    Par dimdidi dans le forum Composants VCL
    Réponses: 10
    Dernier message: 10/03/2006, 09h15
  5. Réponses: 6
    Dernier message: 16/11/2005, 09h34

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