C++ Builder Snippets  


TComboBox mit Lookup-Funktion:
 
Die Lookup-Funktionalität der ComboBoxen kennt heutzutage jeder Comuteranwender, der schon mal mit Web-Browsern gearbeitet hat. Nahezu alle Browser stellen für die Eingabe der URL eine ComboBox mit automatischer "Textvervollständigungsfunktion" bereit.

Ergänzung vom 13.10.2003:

seit der Version 6 des C++ Builder unterstützt die Komponente TComboBox die oben beschriebene Funktionalität ohne, dass zusätzlicher Code benötigt wird. Um die automatische Textvervollständigung zu aktivieren muüssen lediglich die Eigenschaften AutoComplete und AutoDropDown der Combobox auf true gesetzt werden.


Die Lookup-Funktionalität lässt sich aber auch in älteren C++ Builder-Versionen mit einem relativ geringen Aufwand implementieren.

Vielen Dank an Lars Prager für die Korrektur des ursprünglichen Snippet-Codes !
  1. Benötigt wird eine TComboBox-Komponente (Eigenschaft Style muss auf csDropDown gesetzt sein !)
  2. Die ComboBox muss natürlich beim Programmstart bzw. während der Benutzung mit Einträgen gefüttert werden.
  3. Folgender Code in der OnKeyPress-Ereignisbehandlungsroutine der ComboBox sorgt dafür, dass die Komponente dem Anwender während des Tippens Vorschläge unterbreiten kann:
void __fastcall TForm_Main::CB_KeyPress(TObject *Sender, char &Key)
{
  if(Key > 31)  // Falls ASCII-Zeichen
  {
    // Sender-Zeiger casten:
    TComboBox* pCmb = dynamic_cast<TComboBox*>(Sender);

    // Das einegegebene Zeichen einfügen:
    pCmb->SelText = EmptyStr;
    pCmb->Text = pCmb->Text.Insert(Key, pCmb->SelStart+1);
    int ilTextLength = pCmb->Text.Length();
    pCmb->SelStart = ilTextLength;

    // ComboBox durchsuchen:
    int ilIndex = SendMessage(pCmb->Handle, CB_FINDSTRING, 0,
      (long)pCmb->Text.c_str());

    // Falls passenden String in der ComboBox gefunden:
    if(ilIndex != CB_ERR && pCmb->Text.Length())
    {
      AnsiString temp = pCmb->Text;
      // Falls der gefundene Substring EXACT dem 
      // eingegebenen entspricht:
      if(!pCmb->Text.AnsiCompare(pCmb->Items->Strings[ilIndex].
        SubString(1,pCmb->Text.Length())))
      {
        // ComboBox "öffnen"
        pCmb->DroppedDown = true;
        // Text in das Eingabefeld übernehmen:
        pCmb->Text = pCmb->Items->Strings[ilIndex];
        // automatisch ergänzten Text selektieren:
        pCmb->SelStart = ilTextLength;
        pCmb->SelLength=pCmb->Text.Length()-pCmb->SelStart;
      }
      else
      {
         pCmb->DroppedDown = false; // ComboBox "schließen"
         pCmb->Text = temp;
         pCmb->SelStart = ilTextLength;
      }
    }
    else pCmb->DroppedDown = false;   // ComboBox "schließen"
    Key = 0;
  }
}


© '99-2003 by S. Kreutzmann