AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TCombobox - Autoselect deaktivieren

Ein Thema von Sergej_Molotov · begonnen am 8. Mai 2014 · letzter Beitrag vom 8. Mai 2014
Antwort Antwort
Sergej_Molotov

Registriert seit: 18. Jul 2006
61 Beiträge
 
Delphi 11 Alexandria
 
#1

TCombobox - Autoselect deaktivieren

  Alt 8. Mai 2014, 08:57
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?
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#2

AW: TCombobox - Autoselect deaktivieren

  Alt 8. Mai 2014, 11:28
Hallo,

du könntest probieren, die Pfeiltaste im OnKeyDown oder OnKeyPress abzufangen und dann "Key" zurückzusetzen
(hab jetzt nur kein Delphi da)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Sergej_Molotov

Registriert seit: 18. Jul 2006
61 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TCombobox - Autoselect deaktivieren

  Alt 8. Mai 2014, 12:34
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.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TCombobox - Autoselect deaktivieren

  Alt 8. Mai 2014, 12:48
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Sergej_Molotov

Registriert seit: 18. Jul 2006
61 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TCombobox - Autoselect deaktivieren

  Alt 8. Mai 2014, 13:13
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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TCombobox - Autoselect deaktivieren

  Alt 8. Mai 2014, 13:54
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Sergej_Molotov

Registriert seit: 18. Jul 2006
61 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TCombobox - Autoselect deaktivieren

  Alt 8. Mai 2014, 14:36
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.
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:40 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