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 OKDanach 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 Objektinspectortype 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