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 :

Utilisation de ComboBox


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 59
    Par défaut Utilisation de ComboBox
    Salut, je voudrais savoir comment faire avec un combobox pour afficher une valeur et stocker une autre valeur, a titre exemple je veux sauvegarder la valeur 'A' et afficher sur combobox la valeur "chaise" ?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut
    J'utilise une méthode qui n'est peut-être pas la plus élégante mais qui a le mérite d'être simplissime

    Au moment du chargement des Item je charge l'information que l'utilisateur verra et j'y concatène un filler assez long (une chaine d'espaces) et la valeur correspondante.
    J'affecte à la combobox la propriété Style DrowDownList

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      LC_Filler := '';
      While Length(LC_Filler) < 150 Do LC_Filler := LC_Filler + ' ';
      // Mise en grille
      PO_Combo.Clear;
      While LO_Champs.Count > 0 do Begin
            PO_Combo.AddItem('valeur visible' +
                             LC_Filler +
                             'Code correspondant', Nil);
    Au moment du clic on récupère les derniers caractère de droite de la valeur sélectionnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Trim(Copy(PO_Combo.Items[LN_Ligne], 125, 255))

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 59
    Par défaut
    merci, mais c'est pas ce que je veux parce que je travaille avec des lettres en arabes et je dois stocker en fr.

  4. #4
    Membre du Club
    Homme Profil pro
    Stagiaire en développement delphi / oracle
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Stagiaire en développement delphi / oracle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Par défaut
    Tu peux utiliser la fonction AddObject !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
     test: String;
    begin
      test:='showmessage';
      ComboBox1.Items.AddObject('salut',Tobject(test))
    end;
    Puis récuperer ton objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    showmessage(String(Combobox1.Items.Objects[0]));

  5. #5
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

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

    Voici une autre possibilité.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(ComboBox1.Text);
    end;
     
    procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    var
      surimpression: string;
    begin
      surimpression := '';
     
      if ComboBox1.Items[Index] = 'un' then
        surimpression := 'ein' else
      if ComboBox1.Items[Index] = 'deux' then
        surimpression := 'zwei' else
      if ComboBox1.Items[Index] = 'trois' then
        surimpression := 'drei';
     
      if surimpression <> '' then
      begin
        ComboBox1.Canvas.Font.Color:= clBlack;
        ComboBox1.Canvas.Brush.Color:= clWhite;
        ComboBox1.Canvas.FillRect(Rect);
        ComboBox1.Canvas.TextOut(Rect.Left+5, Rect.Top+1, surimpression);
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ComboBox1.AddItem('un', nil);
      ComboBox1.AddItem('deux', nil);
      ComboBox1.AddItem('trois', nil);
     
      ComboBox1.Style := csOwnerDrawFixed;
     
      ComboBox1.ItemIndex := 0;
    end;
    @Delphi-ne

    La fonction StringOfChar peut rendre service.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_Filler := StringOfChar(' ', 150);

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Tu peux aussi maintenir une TStringList avec les mêmes index donnant le code français à ton texte arabe
    Attention, avec Sorted, cela ne fonctionne pas !

    La proposition de Zephos est pertinente
    Par contre, attention, le transtypage de chaine n'est pas fiable

    L'utilisation réelle d'un descendant de TObject est la solution la plus longue, la plus complexe (instanctiation, transypage, libération)
    Pour un étudiant, cela à l'intérêt pédagogique de voir comment utiliser la POO dans une IHM Delphi
    Pour un utilisateur, il n'a à l'écran que ce qui le concerne, il a un affichage métier simple sans être encombré d'élément technique

    Si tu as tout en DB, aussi bien le champ a mémoriser que la liste de valeurs, tu peux tenter le TDBLookupComboBox
    le contrôle TDBLookupComboBox nécessite une bonne connaissance des TDataSet et de bien comprendre la différence entre le DataSource et le ListSource

    Si tu veux détacher ton IHM de la DB et passer par un code manuel, tu peux donc le faire avec le Objects[]
    Si le TStringList fourni un OwnsObjects mais pas TStrings, il faut donc libérer, j'ai fourni un code réutilisable pour cela

    je fais cela très souvent, si ce n'est pas systématiquement

    j'utilise un objet interne TRayonDataObject (mis dans la section implementation)
    Mon but est d'avoir un TComboBox qui affiche des Rayons, il affiche évidemment les libellés mais je veux conserver l'ID
    par Exemple
    RayonID, RayonLibelle
    1, Fruit
    2, Yaourt
    3, Textile
    ...
    Dans la combo, je ne veux QUE le libellé et dans cet ordre (via propriété Sorted du TComboBox)
    Fruit
    Textile
    Yaourt




    Pour ajouter, par exemple depuis une Query Q dans le ComboBox des rayons cbxRayonFilter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cbxRayonFilter.Items.AddObject(Q.FielbByName('RayonLibelle').AsString, TRayonDataObject.Create(Q.FielbByName('RayonID').AsInteger, Q.FielbByName('RayonLibelle').AsString));
    pour savoir ce qui est sélectionné, dans le OnChange par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage(IntToStr(TRayonDataObject.GetSelected(TComboBox(Sender)).RayonID));
    Mon code réel dans l'écran que je développe aujourd'hui même permet de filter des grilles en fonction d'un rayon


    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 TModulexxxForm.cbxRayonFilterChange(Sender: TObject);
    var
      Rayon: TRayonDataObject;
    begin
      // OnChange d'un ComboBox ne se produit que lors de la modification utilisateur
      FControleur.RayonFilter.Active := False;
     
      if Sender is TComboBox then
      begin
        Rayon := TRayonDataObject.GetSelected(TComboBox(Sender));
        if Assigned(Rayon) then
        begin
          FControleur.RayonFilter.ID := Rayon.RayonID;
          FControleur.RayonFilter.Active := True;
        end;
      end;
    end;
    Personnellement, j'ai un objet controller qui charge ce genre de dico au moment opportun
    Tant que l'objet controller est utilisé, le dictionnaire est conservé (évite de lire la DB tout le temps et de conserver des curseurs inutilement)
    En général, un fenêtre (vue) va créer son controller et le libérer à sa fermeture
    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
     
    //------------------------------------------------------------------------------
    procedure TModulexxxForm.ShowRayons();
    var
      it: TModulexxxControleur.TRayonDictionary.TRayonMapIterator;
    begin
      ClearRayons();
     
      cbxRayonFilter.ItemIndex := cbxRayonFilter.Items.Add(' Tout');
     
      with FControleur.RayonDictionary do
        for it in Dictionary do
          cbxRayonFilter.Items.AddObject(it.Value, TRayonDataObject.Create(it.Key, it.Value));
    end;
     
    //------------------------------------------------------------------------------
    procedure TModulexxxForm.ClearRayons();
    begin
      TStringsSLTToolHelp.ClearStringsAndObjects(cbxRayonFilter.Items);
    end;
    Voici la classe interne TRayonDataObject
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    type
      { internal class declarations }
      TRayonDataObject = class(TObject)
      strict private
        FRayonID: Integer;
        FRayonLibelle: string;
      public
        constructor Create(ARayonID: Integer; const ARayonLibelle: string);
        property RayonID: Integer read FRayonID;
        property RayonLibelle: string read FRayonLibelle;
      public
        class function GetSelected(ACombo: TComboBox): TRayonDataObject; static;
      end;
    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
     
    { TRayonDataObject }
     
    //------------------------------------------------------------------------------
    constructor TRayonDataObject.Create(ARayonID: Integer; const ARayonLibelle: string);
    begin
      FRayonID := ARayonID;
      FRayonLibelle := ARayonLibelle;
    end;
     
    //------------------------------------------------------------------------------
    class function TRayonDataObject.GetSelected(ACombo: TComboBox): TRayonDataObject;
    begin
      if ACombo.ItemIndex >= 0 then
        Result := TRayonDataObject(ACombo.Items.Objects[ACombo.ItemIndex])
      else
        Result := nil;
    end;
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    //------------------------------------------------------------------------------
    (*                SoLuTions is an Versatile Library for Delphi                 -
     *                                                                             -
     *  Copyright ou © ou Copr. "SLT Solutions", (2006)                            -
     *  contributeur : ShaiLeTroll (2012) - Renommage Fichier et Correction XE2    -
     *  contributeur : ShaiLeTroll (2012) - Documentation Insight                  -
     *                                                                             -
     * ShaiLeTroll@gmail.com                                                       -
     *                                                                             -
     * Ce logiciel est un programme informatique servant à aider les développeurs  -
     * Delphi avec une bibliothèque polyvalente, adaptable et fragmentable.        -
     *                                                                             -
     * Ce logiciel est régi par la licence CeCILL-C soumise au droit français et   -
     * respectant les principes de diffusion des logiciels libres. Vous pouvez     -
     * utiliser, modifier et/ou redistribuer ce programme sous les conditions      -
     * de la licence CeCILL-C telle que diffusée par le CEA, le CNRS et l'INRIA    -
     * sur le site "http://www.cecill.info".                                       -
     *                                                                             -
     * En contrepartie de l'accessibilité au code source et des droits de copie,   -
     * de modification et de redistribution accordés par cette licence, il n'est   -
     * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,   -
     * seule une responsabilité restreinte pèse sur l'auteur du programme,  le     -
     * titulaire des droits patrimoniaux et les concédants successifs.             -
     *                                                                             -
     * A cet égard  l'attention de l'utilisateur est attirée sur les risques       -
     * associés au chargement,  à l'utilisation,  à la modification et/ou au       -
     * développement et à la reproduction du logiciel par l'utilisateur étant      -
     * donné sa spécificité de logiciel libre, qui peut le rendre complexe à       -
     * manipuler et qui le réserve donc à des développeurs et des professionnels   -
     * avertis possédant  des  connaissances  informatiques approfondies.  Les     -
     * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du      -
     * logiciel à leurs besoins dans des conditions permettant d'assurer la        -
     * sécurité de leurs systèmes et ou de leurs données et, plus généralement,    -
     * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.          -
     *                                                                             -
     * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez      -
     * pris connaissance de la licence CeCILL-C, et que vous en avez accepté les   -
     * termes.                                                                     -
     *                                                                             -
     *----------------------------------------------------------------------------*)
    unit SLT.Common.ClassesEx;
     
    interface
     
    uses
      System.Classes;
     
    type
      /// <summary>Boite à outil pour la classe TStrings</summary>
      /// <remarks>Le TStringsSLTToolHelp n'est pas un class helper car lors de sa création en 2002 sous Delphi 5, le code était procédural,
      /// lors de la refonte en classe en 2007, la version utilisée était Delphi 7, en s'inspirant du concept des Assistances de classes (Class Helper) du Delphi.NET
      /// <para>En XE2, la TStringList offre une propriété OwnsObjects (n'existe pas dans la TStrings) qui se comportent comme celle d'une TObjectList, cela remplace ClearStringsAndObjects</para></remarks>
      TStringsSLTToolHelp = class(TObject)
      public
        class procedure FreeAndNilObjects(AList: TStrings); static;
        class procedure ClearStringsAndObjects(AList: TStrings); static;
      end;
     
    implementation
     
    { TStringsSLTToolHelp }
     
    //------------------------------------------------------------------------------
    class procedure TStringsSLTToolHelp.ClearStringsAndObjects(AList: TStrings);
    begin
      FreeAndNilObjects(AList);
      AList.Clear();
    end;
     
    //------------------------------------------------------------------------------
    class procedure TStringsSLTToolHelp.FreeAndNilObjects(AList: TStrings);
    var
      I: Integer;
      Obj: TObject;
    begin
      for I := 0 to AList.Count - 1 do
      begin
        Obj := AList.Objects[I];
        if Assigned(Obj) then
        begin
          AList.Objects[I] := nil;
          Obj.Free();
        end;
      end;
    end;
     
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. [C#] Utilisation de ComboBox
    Par Troopers dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/11/2009, 13h07
  2. Construire un critère de filtre en utilisant des ComboBox
    Par mary17 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 20/04/2007, 09h19
  3. utilisation de combobox
    Par fredppp dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 04/04/2007, 07h55
  4. Questions concernant l'utilisation des ComboBox
    Par philguio dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/01/2007, 11h26
  5. Utilisation de combobox et d'une animation flash
    Par naima2005 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 04/06/2006, 20h09

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