Problem mit ComboBox



  • Ich habe in meinem Programm mehrere ComboBoxen, welche aus einer SQLite DB in gegeseitiget Abhängigkeit gefüllt werden - d.h. der Inhalt der Auswahl hängt davon ab, was in den anderen bereits ausgewählt wurde. Da sich das zeitnah bei jeder Änderung anpassen soll, habe ich das in eine OnChange Ereignisroutine verpackt, die folgendes macht:

    Löschen der Einträge mittels ComboBox->Items->Delete(0) in einer while Schleife für jede ComboBox.

    Danach füllen der ComboBox mit den vorher entsprechend ausgelesenen Einträgen aus der DB. Hier werden nur die Einträge aus der DB gelesen, welche noch nicht ausgelesen wurden.
    Das ausgewählte wird bei jeder noch zusätzlich hinzugefügt.

    Nun habe ich folgendes Problem: Ich würde erstens gerne das Editfeld der Combobox benützen (deswegen auch keine ComboBox->Clear () Methode) und auch das ausgewählte im Editfeld sehen.

    Die ItemIndex Methode funktioniert nicht, da sonst im Editfeld die bisherige Eingabe markiert und mit der nächsten Tasteneingabe gelöscht wird.

    Für Lösugen in irgendeiner Form bin ich völlig offen.

    Danke im voraus



  • Devas schrieb:

    Löschen der Einträge mittels ComboBox->Items->Delete(0) in einer while Schleife für jede ComboBox.

    Devas schrieb:

    Nun habe ich folgendes Problem: Ich würde erstens gerne das Editfeld der Combobox benützen (deswegen auch keine ComboBox->Clear () Methode) und auch das ausgewählte im Editfeld sehen.

    ComboBox1->Items->Clear();
    

    Devas schrieb:

    Die ItemIndex Methode funktioniert nicht, da sonst im Editfeld die bisherige Eingabe markiert und mit der nächsten Tasteneingabe gelöscht wird.s

    ItemIndex ist keine Methode sonder eine Eigenschaft.

    Wenn du einfach Tasteneingaben unterdrücken willst:

    void __fastcall TForm1::ComboBox1KeyPress(TObject *Sender, char &Key)
    {
       Key = 0;
    }
    


  • Klar ist das eine Eigenschaft - habe mich nur verschrieben ...

    Allerdings hilft mir Deine Antwort nicht wirklich weiter.

    Sobald ich mit Clear arbeite kann ich nicht flüssig weiterschreiben, und sobald ich mit Items->Delete arbeite sehe ich bei einer Auswahl per Maus die Eingabe nicht mehr, sobald ich das Combo - Feld verlasse.



  • irgendwie werde ich nicht ganz schlau, was du möchtest.
    kannst du nochmals erklähren, wie die ComboBox reagieren soll?
    im Styl von

    ComboBox1->AutoComplete = true;
       ComboBox1->AutoDropDown = true;
    

    und dan ins Editfeld schreiben?

    mfg
    BigNeal



  • Meinst du sowas ?

    void __fastcall TForm1::cbExit(TObject *Sender)
    {
       TStringList *list=new TStringList();
       list->Assign(cb->Items);
       if(!list->Find(cb->Text,0)) cb->Items->Add(cb->Text);
       delete list;
    }
    


  • Die ComboBox soll reagieren, wie man es von Ihr gewohnt ist.

    D.H.

    Es wird etwas ausgewählt -> man arbeitet weiter -> das Ausgewählte ist sichtbar.

    Es wird etwas editiert -> mehr als ein Buchstabe sollte zu sehen/editieren sein.

    Vll hilt doch etwas Code - das hier ist der relevante Teil der Ereignisbehandlungsroutine (OnChange):

    String query, str;
      sql::Results res;
    
      db.connect("siedler.db"); // Datenbank connecten
    
      (..)
    
    // query zusammenbauen
    
      db.execute (query);            // jetzt ID holen
    
      res = db.get_results();
    
      int size = res.size();
    
    //  EdNameSp1->Clear (); // damit wird auch edit feld gelöscht -> unerwünscht
    
      // Nur Combos löschen -> ohne Editfeld
    
      while (EdNameSp1->Items->Count != 0) // ComboBox Einträge löschen
        EdNameSp1->Items->Delete(0);
    
      // Combos füllen
    
      for (int i = 0; i < size; i++)
      {
        str = StdToAnsi(res[i]["Name"].get_asString()); //Stringkonvertierung
    
        EdNameSp1->AddItem(str, 0);
      } // ende for i
    
      if (sp_name[0] != "")
        EdNameSp1->AddItem (sp_name[0],0);
    
    /*  EdNameSp1->ItemIndex = size; // wenn das gesetzt, dann kein sinnvolles Editieren möglich
    
    */
    //  EdNameSp1->Text = sp_name[0];
    
      db.disconnect ();
    

    sp_name[0] ist das erste Element eines String Arrays, welches meine Daten zur weiterverabeitung zwischenspeichert.

    Ich habe das jetzt auch soweit gekürzt, daß nur eine ComboBox zusehen ist -> in Wirklichkeit sind es 6.



  • was bewirkt

    EdNameSp1->Items->Clear ();
    

    statt

    EdNameSp1->Clear ();
    

    ?



  • Die beide wirken sich augenscheinlich genau gleich aus.

    Bei beiden ist jedoch der Cursor stets am Anfang, bei meiner Lösung:

    while (EdNameSp1->Items->Count != 0)
      EdNameSp1->Items->Delete(0);
    

    hier jedoch am Ende ...

    Hmm ...

    Edit: Gibt es eine Möglichkeit den Cursor im Eingabefeld Programmgesteuert zu verschieben?



  • Hallo

    Edit: Gibt es eine Möglichkeit den Cursor im Eingabefeld Programmgesteuert zu verschieben?

    TComboBox::ItemIndex

    bis bald
    akari



  • Genau das funktioniert nicht - dann wird der gesamte Text im Feld markiert. Das hat zur Folge, daß das nächste eingegebene Zeichen alles weitere überschreibt.



  • Hallo

    sorry, hab nicht mitgedacht.
    Du suchst sicher TComboBox::SelStart bzw. TComboBox::Length

    bis bald
    akari



  • Kein Problem - kann passieren

    SelStart passt - damit bekomme ich das gewünschte Ergebnis. Schade nur, daß das in der Hilfe nicht auftauchte ...

    Length im Bezug auf TComboBox kennt er bei mir übrigens nicht.

    Aber danke für die Hilfe



  • Hallo

    *seufz* also noch ein Versuch : TComboBox::SelLength.
    aber beide Sachen stehen in der BCB-Hilfe zu TComboBox.
    Einbißchen mehr Suchwillen ist angebracht.

    bis bald
    akari



  • *rotwerd*

    Ich habe die ganze Zeit bei TComboBox gesucht, und das dort wirklich nicht gefunden. Sonst hätte ich die anderen Fkt. ja auch gefunden.

    Also sorry nochmal und auch danke - Problem ist inzwischen behoben.


Anmelden zum Antworten