2017-09-26 4 views
0

Je voudrais utiliser un énumérateur pour remplir une Combobox avec des paires clé/valeur. Il est important que je cache la clé de l'utilisateur et affiche uniquement la valeur. Lors de la sélection, je voudrais capturer la clé associée à la valeur sélectionnée.Paires clé/valeur dans ComboBox utilisant Delphi Firemonkey

Le code ressemble à ceci.

var 
    currentObj: ISuperObject; 
    enum: TSuperEnumerator<IJSONAncestor>; 

    while enum.MoveNext do 
    begin 

     currentObj := enum.Current.AsObject; 
     cboUserList.Items.Add(currentObj.S['key'],currentObj.S['value']); 

    end; 

Les clés currentObj.S [ 'key'] devrait être prise sur l'utilisateur de sélection de la valeur currentObj.S [ 'value'] qui est visible à l'utilisateur sur le cboUserList la liste déroulante.

Des idées?

+4

Ne pas faire un contrôle GUI gérer les structures de données de votre programme. –

Répondre

2

Une simple solution multi-plateforme serait d'utiliser une TStringList distincte pour tenir les key s, puis affichez les value dans la zone de liste déroulante et utilisez les index de ses éléments pour accéder aux éléments TStringList.

var 
    currentObj: ISuperObject; 
    enum: TSuperEnumerator<IJSONAncestor>; 

while enum.MoveNext do 
begin 
    currentObj := enum.Current.AsObject; 
    userSL.Add(currentObj.S['key']); 
    cboUserList.Items.Add(currentObj.S['value']); 
end; 

var 
    index: Integer; 
    key: string; 
begin 
    index := cboUserList.ItemIndex; 
    key := userSL[index]; 
... 
end; 
1

Vous pouvez envelopper votre clé dans la classe, par ex.

type 
    TKey = class 
    S: string; 
    constructor Create(const AStr: string); 
    end; 

constructor TKey.Create(const AStr: string); 
begin 
    S := AStr; 
end; 

procedure TForm2.Button2Click(Sender: TObject); 
begin 
    ComboBox1.Items.AddObject('value', TKey.Create('key')); 
end; 

Et puis d'y accéder comme

procedure TForm2.ComboBox1Change(Sender: TObject); 
begin 
    Caption := (ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TKey).S; 
end; 

il suffit de détruire ces objets plus tard

+2

J'éviterais d'utiliser des composants visuels dans le cadre de la logique métier. –