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

Langage Delphi Discussion :

Récupérer une string dans un TObject


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    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
    Points : 619
    Points
    619
    Par défaut Récupérer une string dans un TObject
    Bonjour

    Je cherche à récupérer la valeur d'une String dans un TObject.

    Je charge mes combobox comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cb_duree.items.AddObject('22', tobject(2));
    cb_duree.items.AddObject('33', tobject(3));
    Et je récupére la valeur avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    integer(cb_duree.Items.Objects[0])
    Ca ça fonctionne. Ce que je voudrais pouvoir faire c'est charger avec des strings
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cb_duree.items.AddObject('22', tobject('val2'));
    cb_duree.items.AddObject('33', tobject('val3'));
    Mais je ne sais pas transtyper. String(cb_duree.Items.Objects[0]) provoque une erreur.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Si la chaîne ne dépasse pas 4 caractères (= 4 octets, la taille d'un pointeur) ou 2 en unicode, tu peux faire quelque chose comme ceci:

    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
    type
      TData = array[0..3] of char;
     
    procedure TForm1.FillCombo;
    var
      Data :TData;
    begin
      Data := 'val2';
      ComboBox1.Items.AddObject('22', TObject(Data));
      Data := 'val3';
      ComboBox1.Items.AddObject('33', TObject(Data));
      Data := '??'#0;
      ComboBox1.Items.AddObject('?', TObject(Data));
    end;
     
    procedure TForm1.ComboBox1Change(Sender: TObject);
    begin
      with TComboBox(Sender) do
        ShowMessage(TData(Items.Objects[ItemIndex]));
    end;
    Mais si la chaîne est plus longue, c'est impossible . Passe dans ce cas par un array of string et stock l'index. (Comme ton entier précédemment)

  3. #3
    Membre confirmé

    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
    Points : 619
    Points
    619
    Par défaut
    Merci

    Si je crée un array of string à quoi correspondra l'array : à l'ensemble des combobox ou à chacune des combobox (1 array par combobox) ?

    La solution qui consiste à gérer un array of string (ou une TStringList) en parrallèle de ma combobox ne me plaît vraiment

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Il faut bien à un moment ou à un autre allouer de la mémoire pour stocker ces chaînes .

    Quant à un ou plusieurs tableaux, libre à toi . Que le premier élément du combo pointe sur l'élément 125, n'est pas un problème. Mais personnellement, je créerais un tableau par combo.

    Est-ce que le contenu est constant ou dynamique ?

  5. #5
    Membre confirmé

    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
    Points : 619
    Points
    619
    Par défaut
    Par principe on va dire dynamique
    C'est une façon de développer que je voudrais changer
    Pour l'instant je charge dans l'Item le libellé, une chaine d'espaces assez longue et la valeur cachée. Le style de combo suffit à ce que cela reste caché.
    Ca marche parfaitement mais je ne trouve pas cela très élégant et comme je dois commencer un nouveau projet je réfléchis à une forme d'évolution

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Alors sur ce principe, gère manuellement la repeinture. Mets le Style de ton Combo à csOwnerDrawFixed et code tes chaînes Text=Valeur .

    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
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      //Remplissage du ComboBox "Text=Valeur" (Peut bien sûr être statique)
      ComboBox1.Items.Add('22=val2');
      ComboBox1.Items.Add('33=val3');
    end;
     
    procedure TForm2.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    begin
      with TComboBox(Control), Canvas do
      begin
        //Rempli le rectangle
        FillRect(Rect);
        //Ajoute des marges
        InflateRect(Rect, -2, -2);
        //Ecrit la partie avant "="
        TextOut(Rect.Left, Rect.Top, Items.Names[Index]);
      end;
    end;
     
    procedure TForm2.ComboBox1Change(Sender: TObject);
    begin
      //Ne renvoi que la partie après "="
      with TComboBox(Sender) do
        ShowMessage(Items.ValueFromIndex[ItemIndex]);
    end;

  7. #7
    Membre confirmé

    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
    Points : 619
    Points
    619
    Par défaut
    Effectivement je n'avais pensé à jouer sue le paint
    Cela me sembl plus simple que l'objet

    Merci

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

Discussions similaires

  1. [Débutant] récupérer une variable dans un string
    Par Franckmonj dans le forum VB.NET
    Réponses: 11
    Dernier message: 18/03/2014, 14h54
  2. Récupérer une string dans un fichier
    Par lynchmaniac dans le forum ANT
    Réponses: 3
    Dernier message: 27/12/2006, 16h22
  3. 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
  4. Réponses: 12
    Dernier message: 27/06/2005, 19h06
  5. Réponses: 6
    Dernier message: 24/07/2003, 12h39

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