ComboBox Echtzeit Auswahl



  • Ein Pascal Kumpel hat mir das gegeben:

    Das Ereignis OnHighlighted tritt ein, wenn ein anderer Listeneintrag hervorgehoben wird.

    type TComboBoxHighlightEvent = procedure(Sender: TObject; Index: Integer) of object;
    property OnHighlighted: TComboBoxHighlightEvent;

    Beschreibung

    Mit einer Ereignisbehandlungsroutine für OnHighlighted können Sie Aktionen implementieren, die ausgeführt werden sollen, wenn ein anderer Eintrag in der Liste hervorgehoben wird. Beispielsweise kann eine entsprechende Routine die Statusleiste aktualisieren, in der Informationen über den aktuellen Eintrag angezeigt werden.

    Sender ist das Kombinationsfeld, in dem ein anderer Listeneintrag hervorgehoben wurde.

    Index ist der Index des Eintrags, der jetzt markiert ist.

    Hinweis: OnHighlighted wird immer ausgelöst, wenn ein anderer Listeneintrag hervorgehoben wird - also auch dann, wenn der betreffende Eintrag nicht ausgewählt ist (der Wert der Eigenschaft Text noch nicht geändert wurde). Das Ereignis tritt beispielsweise mehrmals auf, wenn der Benutzer durch die Dropdown-Liste blättert. Wenn nur auf die tatsächliche Auswahl eines Eintrags reagiert werden soll, schreiben Sie eine Behandlungsroutine für das Ereignis OnSelect.

    In meiner CBuilder5 Hilfe finde ich leider darüber garnichts.
    Wie baut man dies ein und nutzt es? Weiss das wer?



  • OnHighlighted finde ich in meinem BCB6 Enterprise nur bei der CLX-Version der TComboBox.
    Ich weiß aber nicht, ob die CLX-Komponenten beim BCB5 schon dabei waren.
    Ansonsten hat Dein Kumpel aber das richtige Ereignis gefunden.

    Gruß,

    Alexander



  • Ich benötige dies für eine ComboBox aus einem Skin Komponentenpack.
    Also heisst das wohl es ist nicht möglich. Sehr schade. 😞



  • Hallo

    nein, beim BCB5 war ein solcher Event noch nicht dabei.
    Ist aber nicht schlimm, kann man durch Vererbung nachbauen.

    Dazu erstellst du eine neue Ableitung von TComboBox :
    Dialog Komponente/Neue Komponente... aufrufen. Dann nacheinander eingeben
    - "TComboBox"
    - "TComboBoxEx"
    - <gewünschte Palette>
    - <sinnvoller Unitname>
    Ok drücken.

    Dann erweiterst du die Header-Datei der neuen Unit so

    // Neuer Eventtyp für ausgewähltes Item der Liste
    typedef void __fastcall (__closure *TItemHighlightEvent)(System::TObject* Sender, int Index);
    
    class PACKAGE TComboBoxEx : public TComboBox
    {
    private:
    
      TItemHighlightEvent iOnItemHightlight; // interner Speicher des zugewiesenen Events
    
    protected:
    
      // Überschriebene Methode zum Anzeigen
      virtual void __fastcall DrawItem(int Index, const Windows::TRect &Rect, Windows::TOwnerDrawState State);
    
    public:
            __fastcall TComboBoxEx(TComponent* Owner);
    __published:
    
      // Neue Eigenschaft zum Zuweisen des Highlight-Events
      __property TItemHighlightEvent OnItemHightlight = {read = iOnItemHightlight, write = iOnItemHightlight};
    };
    

    Die Implementationsdatei erweiterst du so :

    void __fastcall TComboBoxEx::DrawItem(int Index, const Windows::TRect &Rect, Windows::TOwnerDrawState State)
    {
      TComboBox::DrawItem(Index, Rect, State); // Ursprungsfunktion ausführen
    
      // Wenn Item ausgewählt und Highlight-Event vorhanden, diesen ausführen
      if ((State.Contains(odSelected)) && (iOnItemHightlight))
        iOnItemHightlight(this, Index);
      }
    
    __fastcall TComboBoxEx::TComboBoxEx(TComponent* Owner)
            : TComboBox(Owner)
    {
      iOnItemHightlight = NULL; // Eventspeicher zurücksetzen
      Style = csOwnerDrawVariable; // Style auf OwnerDraw... setzen	
    }
    

    Dann öffnest du denn Dialog Komponente/Komponente installieren
    und gibst im Tab In neues Package
    - den Namen der erstellten Unit "ComboBoxEx.cpp" an
    - als Namen des Packages z.B. "Package_ComboBoxEx" an
    - als Beschreibung "Erweiterte ComboBox" an
    und drückst OK

    Danach wirst du gefragt, ob das kompiliert und installiert werden soll (->OK).
    Wenn es erfolgreich ist, bekommst du eine entsprechende Meldung angezeigt.

    Danach ist die neue Komponente in der entsprechenden Palette verfügbar.
    Du solltest noch ComboBoxEx.h nach <BCB-Path>\Include kopieren.

    Beachte das der Style der ComboBoxEx auf OwnerDraw... sein muß, damit der Highlight-Event angesprochen wird.

    bis bald
    akari



  • Mit der TComboBox funktioniert das hervorragend.
    Super vollständige Beschreibung und bestimmt eine FAQ Wert! 😉
    Vielen lieben Dank für die schnelle gute Hilfe!

    Leider funktioniert das nicht mit meiner TTeSComboBox = class(TComboBox) 😞

    Ich habe zu der TTeSComboBox Komponente den Pascal Quelltext.
    Wäre es möglich es dort gleich einzubauen? Aber dazu müsste man Pascal können. 🙄



  • Ich habs mal bissle probiert in Pascal nachzubauen.
    Kann jemand sagen wo mein Fehler ist, denn mir fehlt das Ereignisse OnItemHightlight im Objektinspector

    type
    	TItemHighlightEvent = procedure(Sender: TObject; Index: Integer) of Object;
    
    TTeSComboBox = class(TComboBox)
      protected
        procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); virtual;
      published
        property OnItemHightlight: TItemHighlightEvent read iOnItemHightlight write iOnItemHightlight;
      end;
    
    procedure TTeSComboBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);
    begin
    	DrawItem(Index, Rect, State);
    
    	if (odSelected in State) and Assigned(iOnItemHightlight) then
    	begin
    		iOnItemHightlight(Self, Index);
    	end;
    end;
    

    in CBuilder

    .hpp

    public:		// Anwender-Deklarationen
    	__fastcall TForm1(TComponent* Owner);
    	void __fastcall test(TObject *Sender, Integer Index);
    

    .cpp

    void __fastcall TForm1::test(TObject *Sender, Integer Index)
    {
    	Caption = IntToStr(Index);
    	ShowMessage("");
    }
    //----------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    TeSComboBox1->OnItemHightlight=test;
    }
    

    passiert aber garnichts 😡
    Kenn mich leider mit Pascal net so aus 😞



  • Ich habe nun das OnItemHightlight Eregnis indem ich die Klasse nochmals abgeleitet habe. Allerdings scheint er die Funktion DrawItem niemals zu erreichen, zumindest passiert nie etwas 😞
    Kennt sich hier wer mit Pascal aus und sieht den Fehler?

    Und ja ich habe: TTeSComboBoxEx->Style = csOwnerDrawVariable; eingestellt im Objektinspector 😉

    Komletter Code der Komponente:

    type
        TItemHighlightEvent = procedure(Sender: TObject; Index: Integer) of Object;
    
    TTeSComboBoxEx = class(TTeSComboBox)
      private
      protected
        procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); virtual;
      public
      published
        property OnItemHightlight: TItemHighlightEvent read iOnItemHightlight write iOnItemHightlight;
      end;
    
    procedure TTeSComboBoxEx.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);
    begin
    	DrawItem(Index, Rect, State);
    
    	if (odSelected in State) and Assigned(iOnItemHightlight) then
    	begin
    		iOnItemHightlight(Self, Index);
    	end;
    end;
    

    Bitte, bitte Hilfe. 🙄



  • Hallo

    Wenn ich das ganze von Manni richtig verstanden habe.

    void __fastcall TForm1::ComboBox1Change(TObject *Sender)
    {
    switch(ComboBox1->ItemIndex)
    {
    case 0: Label1->Caption = "Auswahl Nummer 1";
    break;

    case 1: Label1->Caption = "Auswahl Nummer 2";
    break;

    case 2: Label1->Caption = "Auswahl Nummer 3";
    break;

    case 3: Label1->Caption = "Auswahl Nummer 4";
    break;
    }
    }



  • Hallo

    @ Tommops : Nein, du hast es nicht richtig verstanden. Außerdem ist dein Code auch noch ineffizient.

    bis bald
    akari



  • Verdammt und ich dachte schon jemand hat die Pascal Lösung gefunden 🙂



  • Hallo

    wenn wenigstens der Event TTeSComboBoxEx::OnDrawItem funktioniert, aknnst du ja wenigstens diesen nehmen, um ohne Ableitung extern den Status der Auswahl zu ermitteln. Du must nur dann auch die Darstellung der Items mit Canvas-Operationen übernehmen.

    bis bald
    akari



  • Als nicht Pascal alles ein wenig schwer 😉
    Das Event DrawItem ist von der Skin Komponente komplett geblockt bzw ohne Wirkung.
    Ich habe mich nochmal rangesetzt und in der Windows Message Funktion bei ihm die passende Stelle gefunden und nun läufts. Danke! Ohne dein Code wäre das nie was geworden.

    @Moderator ich würde es begrüssen wenn meine Pascal Beiträge entfernt würden inklusive diesem 🙂
    Danke!

    Grossartige Hilfe 🙂 👍


Anmelden zum Antworten