TDBLookupComboBox: wie aktuellen Eintrag der Dropdownliste festststellen?



  • Hallo,
    in einer TDBLookupComboBox kann ich mittels Dropdownliste verschiedene Einträge anzeigen lassen, die zur Auswahl anstehen.
    Mit KeyDown, KeyUp kann ich den Auswahlbalken nach oben bzw. unten verschieben.

    Wie kann ich auf das Element der Dropdownliste zugreifen, das der Auswahlbalken gerade anzeigt?
    Bzw. läßt sich der häßliche blaue "Leuchtbalken" in eine andere Farbe umändern?



  • thunderbol4 schrieb:

    Wie kann ich auf das Element der Dropdownliste zugreifen, das der Auswahlbalken gerade anzeigt?

    Hallo,

    diese Combobox hat in der Eigenschaft Field den Wert, den du meinst. Der wird gecastet. Kommt dann ganz darauf an, was du weiter damit vorhast.
    Um nur den Text dieses Feldes anzuzeigen:

    TField *field;
       field = static_cast<TField*>(DBLookupComboBox1->Field);
       // Anzeige
       Label1->Caption = field->Text;
    

    Zum zweiten Teil deiner Frage. Da die Box im Moment deiner Abfrage den Focus hat, bleibt sie selektiert,
    wenn du nix anderes machst. Im einfachsten Fall einfach den Focus in ein Grid setzen. ( der blaue Leuchtbalken ist dann dort 😃 ).

    Eine andere Möglichkeit wäre eine Komponentenableitung von DBLookupComboBox und das Mappen der WM_PAINT-Message zur Manipulierung
    der Farben. Mit OwnerDraw ist hier nichts zu machen.

    mfg
    kpeter



  • Vielen Dank @kpeter, 🙂
    Deine Tipps helfen mir schon ein bißchen weiter. Den Cast werde ich gleich 'mal ausprobieren.

    Beim "blauen Leuchtbalken" habe schon vermutet, dass das nicht so einfach zu ändern ist. Ob ich mir das mit WM_PAINT antue, weiß ich noch nicht. Da kenne ich mich noch zu wenig aus. Notfalls muß der blaue Balken dann halt bleiben.



  • Hallo,

    nachfolgend mal eine WM_PAINT-Behandlung für deinen Fall. Wir überschreiben die WndProc des Formulares.
    Das ist die kürzeste Variante. Normalerweise schreibt man eine Message-Map für diese eine Botschaft (was aber auch nicht
    komplizierter ist ).
    In den Form-Header einfügen:

    protected:
    	void __fastcall WndProc(Messages::TMessage &Message);
    

    In die Sourcedatei :

    void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
       switch (Message.Msg) {
    
          case WM_PAINT :
             RECT    rect;
             HWND hWnd = DBLookupComboBox1->Handle;
             HDC  hDC  = GetDC( hWnd );
    
             ::GetClientRect( hWnd, &rect );        // Win-Api-Fkt.
             rect.right   -= 17;	                // Abzug für den Arrow Button
             HBRUSH hBrush = NULL;
             hBrush = CreateSolidBrush( clSilver ); // neue Farbe
             SelectObject( hDC, hBrush );
    
             FillRect( hDC, &rect, hBrush );
    
             DeleteObject( hBrush );
             ReleaseDC( hWnd, hDC );
             break;
       }
       TForm::WndProc(Message);
    }
    

    Günstig ist, wenn du DBLookupComboBox1->Color vorher wie die Brush-Farbe angibst.

    Probiers mal aus 😉

    mfg
    kpeter



  • Hallo @kpeter,
    habe gerade entdeckt, dass Du nochmals geantwortet hast. Damit habe ich gar nicht gerechnet. Deshalb etwas verspätet die Antwort 😉
    Nehme Deinen Vorschlag (der sieht ja fast wie aus dem Lehrbuch aus 😃 )gerne an und werde mich 'mal an die Sache mit WM_PAINT herantasten.

    Vielen Dank, erstmal.


Anmelden zum Antworten