Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TCombobox - Autoselect deaktivieren (https://www.delphipraxis.net/180290-tcombobox-autoselect-deaktivieren.html)

Sergej_Molotov 8. Mai 2014 08:57

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:
Test
Testmann
Blubber
AutoComplete ist auf false, da der Eintrag nicht direkt ausgewählt werden soll.

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?

Helmi 8. Mai 2014 11:28

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)

Sergej_Molotov 8. Mai 2014 12:34

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.

DeddyH 8. Mai 2014 12:48

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.

Sergej_Molotov 8. Mai 2014 13:13

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

DeddyH 8. Mai 2014 13:54

AW: TCombobox - Autoselect deaktivieren
 
Ein Ansatz ist hier zu finden: http://www.codeproject.com/Tips/6199...n-partial-stri. Das Fensterhandle der Liste befindet sich anscheinend in TCustomCombo.ListHandle (protected). Nun hätte ich vermutet, dass sich die "Aufklapp"-Routine dann hinter ListWndProc versteckt, das scheint aber nicht der Fall zu sein.

Sergej_Molotov 8. Mai 2014 14:36

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 09:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz