Zusatzinformation für Elemente in einer ComboBox



  • Hey,

    seit einiger Zeit frage ich mich ob es für folgende Situation nicht eine bessere Lösung gibt:

    Ich befülle eine ComboBox händisch mit Werten aus einer DB-Tabelle, hierbei handelt es sich natürlich um das Bezeichnungsfeld des Datensatzes und nicht um die ID welche diesen eindeutig identifiziert. Nun brauch man ja aber diese ID um nach dem wählen eines Eintrages auf eben diesen Datensatz zugreifen zu können. Im Moment behelfe ich mir immer damit das ich den Poptext mit "ID|Bezeichnung" befülle um nachher wieder an die ID zu kommen.

    Meine Frage zielt nun darauf ab ob es für einen Eintrag einer ComboBox eine Art Tag Attribut gibt dem man dann die (numerische) ID zuweisen könnte?

    Greets,
    TheAnyKey



  • Hallo,

    Die Items in der ComboBox sind ja vom Typ TStrings. Dort gibt es noch parallel zu Text (wo die Einträge drin stehen) die Eigenschaft Objects. Die hält jetzt eine Liste von TObject* Instanzen welche man auch zum halten einer Id missbrauchen kann. Wenn die Id nur aus einem int besteht kann man direkt mit Hilfe eines reinterpret_cast da reinschreiben. Alternativ dazu kann man eine von TObject abgeleitete Klasse schaffen welche die Informationen hält. Für das Erzeugen und Löschen der Instanzen ist man dann aber selber verantwortlich.



  • Du kannst mit der Win32 API an jeden Eintrag ein LPARAM heften. Dazu musst du das HANDLE der ComboBox haben, den Index des Eintrags und den Wert natürlich.
    Zum Setzen des Wertes nimmst du CB_SETITEMDATA, zum Lesen entsprechend CB_GETITEMDATA:

    LPARAM lValue = 1336;
    
    // ITEMDATA setzen
    ::SendMessage( MyComboBox->Handle, CB_SETITEMDATA, ItemIndex, lValue );
    
    // ITEMDATA lesen
    lValue = ::SendMessage( MyComboBox->Handle, CB_GETITEMDATA, ItemIndex, 0 );
    


  • Hi,

    man kann natürlich aus beides in den String schreiben, die ID und den Text und beides durch ein geeignetes Zeichen trennen, z.B. dne snekrechten Strich |. Oder man lässt eine feste Anzahl Stellen für die ID zu. Dann muß man nur noch das darstellen selber übernehmen (in OnDrawItem).

    Gruß Mümmel



  • Hallo,

    oder du schreibst parallel zur ComboBox in ein ID-Array (Die Bezeichner in die ComboBox und die ID's ins Array)! Der Index ist - wenn die Reihenfolge stimmt - jeweils der gleiche wie der ItemIndex der ComboBox.

    Array[ComboBox->ItemIndex] == ComboBox->Items[i] // Pseudo

    LG, Micha



  • jo Vielen Dank für die zahlreichen Vorschläge.
    Habe es mit dem Objects Attribut umgesetzt. Klappt perfekt!

    Falls in x Jahren jemand hier reinschaut:

    Setzen

    Poptext -> Items -> Objects[Position] = reinterpret_cast<TObject*>(ID);
    

    Auslesen

    ID = (int)Poptext -> Items -> Objects[Position];
    

Log in to reply