![]() |
TCombobox - Autoselect deaktivieren
Hallo Zusammen,
ich habe ein Problem mit der TComboBox und ich hoffe, ihr könnt mir weiterhelfen. Die ComboBox wird im Style csDropDown betrieben und hat z.B. folgende Elemente als Items:
Delphi-Quellcode:
AutoComplete ist auf false, da der Eintrag nicht direkt ausgewählt werden soll.
Test
Testmann Blubber Nun zu dem Problem: Wenn man "Te" tippt und dann auf den Pfeil der Combobox drückt, wird automatisch der erste Eintrag selektiert und der eingegebene Text ändert sich auf "Test". Dies soll aber nicht passieren. Es soll der eingebene Text "Te" erhalten bleiben und nur wenn man den aufgeklappten Eintrag auswählt, soll der Text geändert werden. Gibt es eine Möglichkeit, dieses hinzubekommen, dass der partiale String nicht automatisch selektiert wird? |
AW: TCombobox - Autoselect deaktivieren
Hallo,
du könntest probieren, die Pfeiltaste im OnKeyDown oder OnKeyPress abzufangen und dann "Key" zurückzusetzen (hab jetzt nur kein Delphi da) |
AW: TCombobox - Autoselect deaktivieren
Ich drücke doch nicht die "Pfeil nach unten" bzw. "Pfeil nach oben" Taste, sondern wenn ich auf das DropDown-Symbol mit der Maus klicke, wird automatisch der erste Treffer aus der Liste ausgewählt und als Text gesetzt.
@Helmi Vielleicht habe ich dich falsch verstanden, aber irgendwie ist das nicht die Antwort, auf die ich gehofft habe. |
AW: TCombobox - Autoselect deaktivieren
Auch nicht ganz das Gesuchte, aber Du könntest Dir im OnPopup der ComboBox den originalen Text merken und im OnCloseUp (wenn ItemIndex < 0) wiederherstellen. Damit kannst Du aber auch nicht verhindern, dass, während die Liste angezeigt wird, sich der Text ändert. Vielleicht kann es aber als Ansatz dienen.
|
AW: TCombobox - Autoselect deaktivieren
An den Stellen habe ich auch schon mal rumgesucht.
Wie du selber gesagt hast, sieht das aber dann in der GUI extrem doof aus. Wenn man nach diesem Problem googled, dann findet man nur einen Hinweis bzgl. "partial string match". Ich habe aber keinen Plan, wie ich dieses in Delphi unterbinden kann |
AW: TCombobox - Autoselect deaktivieren
Ein Ansatz ist hier zu finden:
![]() |
AW: TCombobox - Autoselect deaktivieren
Bin auch gerade auf den Beitrag gestoßen und habe mal eine Klasse gemacht, die dieses mit einer ComboBox anstellt.
Ich poste die einfach mal, falls andere dieses auch benötigen:
Delphi-Quellcode:
unit U_ComboBoxHelper;
interface uses StdCtrls, Messages; type TComboBoxHelper = class(TOBject) private FComboBox: TCustomComboBox; FOriginalListProc: Pointer; FCustomListProc: Pointer; FListHandle: THandle; procedure RegisterCustomHandler; procedure CustomHandleComboBox(var Msg: TMessage); public constructor Create(const aComboBox: TCustomComboBox); destructor Destroy; override; end; implementation uses Classes, Windows; { TComboBoxHelper } constructor TComboBoxHelper.Create(const aComboBox: TCustomComboBox); begin inherited Create; FComboBox := aComboBox; FOriginalListProc := nil; FCustomListProc := nil; FListHandle := 0; RegisterCustomHandler; end; destructor TComboBoxHelper.Destroy; begin if Assigned(FOriginalListProc) then SetWindowLongPtr(FListHandle, GWL_WNDPROC, LONG_PTR(FOriginalListProc)); inherited; end; procedure TComboBoxHelper.RegisterCustomHandler; var aCBI: tagCOMBOBOXINFO; begin fillchar(aCBI, SizeOf(aCBI), 0); aCBI.cbSize := SizeOf(aCBI); if Windows.GetComboBoxInfo(FComboBox.Handle, aCBI) then begin FCustomListProc := MakeObjectInstance(CustomHandleComboBox); FListHandle := aCBI.hwndList; FOriginalListProc := Pointer(SetWindowLongPtr(FListHandle, GWL_WNDPROC, LONG_PTR(FCustomListProc))); end; end; procedure TComboBoxHelper.CustomHandleComboBox(var Msg: TMessage); begin if (Msg.Msg = LB_FINDSTRING) then Msg.Msg := LB_FINDSTRINGEXACT; Msg.result := CallWindowProc(FOriginalListProc, FListHandle, Msg.Msg, Msg.wParam, Msg.lParam); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz