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 :

Problème Combobox - renvoyer une valeur


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut Problème Combobox - renvoyer une valeur
    Bonjour à tous, je débute en programmation et je cherche comment, dans une Combobox, sélectionner une valeur mais en envoyer une autre qui ne figure pas dans Items. (exemple janvier,février,mars... dans les items et renvoyer 1 pour janvier, 8 pour février ...).

    Merci d'avance pour votre aide ! =)

  2. #2
    Membre éclairé Avatar de liazidf
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2002
    Messages : 281
    Par défaut
    Citation Envoyé par diliodi Voir le message
    Bonjour à tous, je débute en programmation et je cherche comment, dans une Combobox, sélectionner une valeur mais en envoyer une autre qui ne figure pas dans Items. (exemple janvier,février,mars... dans les items et renvoyer 1 pour janvier, 8 pour février ...).

    Merci d'avance pour votre aide ! =)
    Salut,
    soluce:

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut RE
    Salut, tout d'abord merci d'avoir répondu à ma question mais "combobox1.ItemIndex" renvois la valeur qui est dans la combobox et non l'autre valeur (ex : janvier dans la combobox doit avoir comme autre valeur 1). Je sais pas si vous comprenez ce que je veux dire :s

  4. #4
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 529
    Par défaut
    Il y a un moyen tout simple c'est d'avoir un tableau des éléments en rapport avec le contenu de la combobox. Chaque élément du tableau indicé de 0 à n-1 éléments représente la valeur à renvoyer. Il suffit alors de renvoyer Elements[combobox1.ItemIndex]

    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
     
    unit Unit5;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm5 = class(TForm)
        ComboBox1: TComboBox;
        procedure FormCreate(Sender: TObject);
        procedure ComboBox1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form5: TForm5;
     
    implementation
     
    {$R *.dfm}
     
    var
      Elements: array[0..2] of integer = (1, 2, 3);
     
    procedure TForm5.ComboBox1Click(Sender: TObject);
    begin
      ShowMessage(IntToStr(Elements[ComboBox1.ItemIndex]));
    end;
     
    procedure TForm5.FormCreate(Sender: TObject);
    begin
      inherited;
      ComboBox1.OnClick := nil;
      ComboBox1.Style := csDropDownList;
      ComboBox1.Items.Add('Lundi');
      ComboBox1.Items.Add('Mardi');
      ComboBox1.Items.Add('Mercredi');
      ComboBox1.ItemIndex := 0;
      ComboBox1.OnClick := ComboBox1Click;
    end;
     
    end.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    Par défaut
    diliodi, tu devrais lire l'aide du TComboBox, la réponse de liazidf était déjà un bonne piste

    Commeçons par afficher le libellé !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if combobox1.ItemIndex >= 0 then
      ShowMessage(combobox1.Items[combobox1.ItemIndex]);
    else
      ShowMessage('Pas de Selection');
    Ensuite, il faut rappeler que Items c'est une TStrings
    et donc Items[] veut dire en réalité Items.Strings[] et qu'il y aussi Items.Objects[].

    Le code de Papy214 n'est pas mal mais il est redondant avec une fonctionnalité standard du TStrings, la propriété Objects

    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
    procedure TForm5.ComboBox1Click(Sender: TObject);
    begin
      // Integer en 32Bits, NativeUInt en 64bits
      ShowMessage(IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex])));
    end;
     
    procedure TForm5.FormCreate(Sender: TObject);
    begin
      inherited;
      ComboBox1.OnClick := nil;
      ComboBox1.Style := csDropDownList;
      ComboBox1.Items.AddObject('janvier', TObject(1));
      ComboBox1.Items.AddObject('février', TObject(8));
      ComboBox1.Items.AddObject('mars', TObject(15));
      ComboBox1.ItemIndex := 0;
      ComboBox1.OnClick := ComboBox1Click;
    end;
    Evidemment, c'est une solution un peu brutale, mais au lieu de mettre un simple entier, on peut mettre un pointeur vers une donnée plus complexe au besoin !
    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

  6. #6
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 529
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Le code de Papy214 n'est pas mal mais il est redondant avec une fonctionnalité standard du TStrings, la propriété Objects

    La question venait de quelqu'un qui se dit débutant, je suis allé au plus simple :-)

    Et la solution tu TObject(1) , ça donne quoi après au niveau libération de mémoire ???

  7. #7
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Et la solution tu TObject(1) , ça donne quoi après au niveau libération de mémoire ???
    Pas de problemes. Comme nous n'allouons pas manuellement de mémoire, nous n'avons rien a désallouer. TObject(1) "duppe" la propriété en lui faisant croire que le pointeur pointe sur un TObject en adresse mémoire 1, mais la TString n'ira pas désallouer d'elle même ce (faux) TObject.

    La désallocation mémoire aurait été nécessaire si, comme Shai le suggere, la propriété pointait sur des données plus complexes.

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    La question venait de quelqu'un qui se dit débutant, je suis allé au plus simple :-)
    Quand, je ne stocke que des Entiers, je préfère aussi ta méthode, j'évite l'utilisation du Object comme stockage 32Bits (surtout si demain c'est 64)
    Mais la démo peut donner des idées et fait découvrir le méconnu et sous-employé Objects[]

    La Gestion des Items du TComboBox sans passer l'analyse des libellés restent une chose complexe à gérer proprement !
    L'utilisation de Objects, je l'encaspule toujours par un gestionnaire de thésaurus, remplissage, lecture et nettoyage passe uniquement par le gestionnaire, ainsi si la ComboBox passe d'une alimentation par valeurs en dur à une alimentation par DB, Ini, XML (pour la gestion multi-langue), je n'ai qu'à changer le gestionnaire mais pas le code appelant !

    L'utilisation de Objects évite de maintenir deux listes !

    D'ailleurs, au lieu de faire maintenir deux listes, le mieux est de n'en maintenir qu'une seule "Elements" et de faire en sorte que la ComboBox ne fasse que suivre !
    On peut aussi faire cela (tapé ici sans test)

    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
    type
      TMoisEnum = (meJanvier, meFevrier, meMars);
     
    const
      Elements: array[TMoisEnum] of record
        Mois: string;
        Numero: Integer;
      end;
      = (
          (Mois: 'janvier'; Numero: 1),
          (Mois: 'février'; Numero: 8),
          (Mois: 'mars'; Numero: 15)
        );
     
    procedure TForm5.ComboBox1Click(Sender: TObject);
    begin
      if combobox1.ItemIndex >= 0 then
        ShowMessage(IntToStr(PInteger(ComboBox1.Items.Objects[ComboBox1.ItemIndex])^))
      else
        ShowMessage('Pas de Selection');  
    end;
     
    procedure TForm5.FormCreate(Sender: TObject);
    var
      i: TMoisEnum;
    begin
      inherited;
      ComboBox1.OnClick := nil;
      ComboBox1.Style := csDropDownList;
     
      for i := Low(i) to High(i) do
        ComboBox1.Items.AddObject(Elements[i].Mois, TObject(@Elements[i].Numero));
     
      ComboBox1.ItemIndex := 0;
      ComboBox1.OnClick := ComboBox1Click;
    end;
    Cette fois, utilise bien un Pointeur sur Integer, que l'on déguise en TObject
    La mémoire, c'est une constante, pas de libération, non plus !

    J'espère qu'il n'y pas de faute, n'ayant que C++Builder, je n'ai pas vérifié le code !


    Tu noteras le cast passe de Integer() qui transformait la valeur du faux pointeur en entier en PInteger()^ qui transforme le pointeur en pointeur sur entier puis en récupère la valeur !
    C'est déjà plus propre, cela supporte en plus le 64Bits !
    Je trouve que dans la TStrings, il aurait pu faire une propriété Data[]: Pointer comme dans le TTreeNode, plus ouvert que le TObject !

    EDIT : En même temps, Embarcadero fourni un exemple C++ et un exemple Delphi qui est assez brutal avec des reinterpret_cast<> aussi
    Il utilise le pointeur comme stockage 32bits pour une TViewStyle, une énumération ! ils sont aussi dégueux que mon exemple précédent
    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

  9. #9
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 529
    Par défaut
    C'est vrai qu'il y a mille façons de remplir une combo.

    Et bien d'accord avec toi sur cette propriété manquante qui supprimerait bien des questions :-)

    Quand à la propriété Objects, je pense qu'elle est effectivement sous-employée parce que les utilisateurs pensent que les listes ne sont là que pour afficher des textes.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut
    Merci de m'avoir répondu aussi rapidement et d'avoir pris du temps pour me répondre Je viens de tester et tout marche impec ! merci beaucoup !

  11. #11
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 529
    Par défaut
    Citation Envoyé par diliodi Voir le message
    Merci de m'avoir répondu aussi rapidement et d'avoir pris du temps pour me répondre Je viens de tester et tout marche impec ! merci beaucoup !
    tag (résolu] ???

Discussions similaires

  1. Renvoyer une valeur dans un textarea
    Par psycho34 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 28/11/2006, 20h27
  2. Renvoyer une valeur d'une page à une autre
    Par mullger dans le forum Langage
    Réponses: 2
    Dernier message: 26/10/2006, 11h04
  3. [C#] Renvoyer une valeur à la fermeture d'une forms
    Par diaboloche dans le forum Windows Forms
    Réponses: 6
    Dernier message: 14/03/2006, 11h54
  4. Réponses: 1
    Dernier message: 22/09/2005, 15h46
  5. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 17h49

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