ComboBox mit "Anzeige" UND "Wert"



  • Tag auch... Ich suche eine einfache Möglichkeit, wie ich folgendes Szenario meistern kann, wobei ich dazu sagen muss, das ich mit Programmieren grad erst anfange.

    Ich kann mit ComboBox1->Items->Add(); eine neue Textzeile zu meiner ComboBox1hinzufügen, ich kann die Liste sortieren lassen und ich kann die einzelnen Textzeilen über den ItemIndex auslesen lassen.

    Aber ich brauche mehr. Ich habe eine Liste aus einer Datenbank mit der Kombination "Name + ID". Diesen Namen ODER die ID der ComboBox1 zuweisen ist nicht das Problem aber ich möchte beides in der Box drinn haben aber nur den Namen anzeigen lassen. Wenn etwas ausgewählt wird, soll aber nicht der Name übergeben werden sondern die ID.... In etwa wie bei HTML. Dort habe ich ja auch ein "<option value="1">Angezeigter Name</option>" ... sprich "Angezeigter Name" wird angezeigt aber wenn ich diesen Eintrag auswähle wird "1" übgergeben...

    In meiner Combox soll nun "Angezeigter Name" der Username für alle sichtbar stehen und unsichtbar soll statt der "1" die jeweilige ID stehen, welche aber nichts mit dem ItemIndex zu tun hat...

    Ich hoffe ihr seht durch meine etwas wirre Beschreibung durch und könnt mir weiterhelfen ...



  • Schau Dir mal die Methode AddItem an. Damit kannst Du den Anzeigenamen und ein Object übergeben. Schmutzigste Lösung einfach die ID als das Object übergeben. Kann sein, dass Du beim Schreiben den int dafür nach TObject casten mußt und beim Lesen zurück nach int. Probier es einfach aus.



  • Ich kann leider diese Methode AddItem nicht finden.... Aber ich habe eine Methode AddObject gefunden... :

    class APartner
    {
     private: AnsiString Name;
              int    UID;
    
     public:  APartner(AnsiString FullName ,int UserID)
              {
               Name = FullName;
               UID = UserID;
              }
    };
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     // wie lese ich hier aber Namen und ID wieder aus ?
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormActivate(TObject *Sender)
    {
     APartner *Sebastian = new APartner("Sebastian Pfohl",35);
     ComboBox1->Items->AddObject("Sebastian", (TObject *)Sebastian);
    }
    

    So sieht der Coder derzeit bei mir aus aber wie kann ich nun Namen und ID wieder auslesen ?

    [edit="junix"]Jemand hat viel Zeit darauf verwendet, ein Syntaxhighlightning in dieses Forum zu integrieren, du solltest es nutzen (o;[/edit]



  • // wie lese ich hier aber Namen und ID wieder aus ?

    so... du speicherst ja lediglich den zeiger auf dein objekt Sebastian.

    void __fastcall TForm1::Button1Click(TObject *Sender) 
    { 
      APartner *Partner = 0;
    
      if (ComboBox1->ItemIndex != -1)
        Partner = (APartner*) ComboBox1->Items->Objects[ComboBox1->ItemIndex]; 
    
      if (Partner)
      {
        // ... was machen ...
      } 
    }
    

  • Mod

    Hallo

    speicher beides in der ComboBox (zB "id-001 | Text der dazugehoert" )
    und gib den Text selbst aus (nach dem Trennzeichen)

    oder anderstherum (besser)

    MfG
    Klaus



  • speicher beides in der ComboBox (zB "id-001 | Text der dazugehoert" )
    und gib den Text selbst aus (nach dem Trennzeichen)

    is ja voll umständlich!



  • Ich muss ehrlich gestehen, das ich den Code von Sunday nicht verstehe. Die Idee beide Werte durch einen Delimeter zu trennen und reinzunehmen hatte ich auch schon aber das ist nicht unbedingt das was ich haben möchte, es wäre aber eine Möglichkeit, ich müsste dann am Ende nur den String am Delimeter wieder zerlegen um beide Werte zu trennen und dahür wirds sicher ne Möglichkeit geben, wenn ich auch noch nicht weis welche...

    Dennoch wäre mir eine andere Methode lieber...

    Beim auslesen brauche ich beide Werte... Den Namen und die ID wieder zurück ...



  • Wenn ich zum Beispiel wieder an die Daten will und folgendes versuche

    if (Partner)
    {
    ShowMessage(Partner.Name);
    }

    kommt nur raus: Auf linker Seite der Struktur ist . oder .* erforderlich ...



  • Hallo,

    class APartner
    {
    public:
            AnsiString Name;
            int        UID;
            APartner(AnsiString FullName, int UserID)
            {
              Name = FullName;
              UID  = UserID;
            }
    };
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormActivate(TObject *Sender)
    {
    APartner *Sebastian = new APartner("Sebastian Pfohl",35);
    ComboBox1->Items->AddObject("Sebastian", (TObject *)Sebastian);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
    APartner *Partner = NULL;
    if (ComboBox1->ItemIndex != -1)
      Partner = (APartner*) ComboBox1->Items->Objects[ComboBox1->ItemIndex];
    if (Partner)
      ShowMessage(Partner->Name);
    }
    //---------------------------------------------------------------------------
    

    Geht doch... 🙂

    Nash



  • Ahhhh im public Teil funktioniert das natürlich ... hät ich auch selber drauf kommen können... Vielen Dank nun funktioniert das ganze auch so wie ich es haben will ...


Log in to reply