![]() |
eigene ComboBox
Hi,
ich möchte eine ComboBox so abwandeln, dass Sie automatisch aufklappt, sobald sie den Fokus erhält oder das Editfeld angeklickt wird. (Sonst soll alles original bleiben - kein Autoselect o.ä.) Beim Fokussieren über die Tab-Taste klappt das schon, nicht aber wenn man mit der Maus in das Editfeld klickt. Hat jemand einen Tipp?
Delphi-Quellcode:
TComboBoxData = class(TComboBox)
private ... procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS; procedure WMKillFocus(var Message: TWMSetFocus); message WM_KILLFOCUS; protected ... procedure Click; override; procedure MouseDown(Button:TMouseButton;Shift:TShiftState;X,Y:Integer); override; public ... published ... end; procedure Register; { TComboBoxData } procedure TComboBoxData.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; // :-( Wird nur beim Klick auf den DropDownButton aufgerufen end; procedure TComboBoxData.Click; begin inherited; // :-( wird nur beim Anklicken eines Items aufgerufen end; procedure TComboBoxData.WMSetFocus(var Message: TWMSetFocus); begin inherited; DroppedDown := True; // :-) FUNKTIONIERT beim Fokussieren über Tab-Taste end; Evtl. kann man irgendwie die OnClick-Behandlung der "Edit-Komponente" zuordnen!? Danke Stahli |
Re: eigene ComboBox
Hallo,
keine schöne Lösung, aber es geht:
Delphi-Quellcode:
var
OldWndProc: Pointer; function CbxWndProc(hCbx, uMsg, wParam, lParam: DWORD): DWORD stdcall; begin case uMsg of WM_SETFOCUS, WM_LBUTTONUP: Form1.Combobox1.DroppedDown := True; end; Result := CallWindowProc(OldWndProc, hCbx, uMsg, wParam, lParam); end; procedure TForm1.FormCreate(Sender: TObject); begin OldWndProc := Pointer(SetWindowLong(FindWindowEx(combobox1.Handle, 0, 'Edit', nil) , GWL_WNDPROC, DWord(@CbxWndProc))); end; |
Re: eigene ComboBox
Hai stahli,
wäre es nicht einfacher das OnEnter-Ereigniss zu "überschreiben"? |
Re: eigene ComboBox
Ich möchte möglichst direkt die Komponente ändern.
Außerdem reagiert OnEnter nicht mehr, wenn man auf das Editfeld klickt und die Komp. schon den Fokus hat. |
Re: eigene ComboBox
Ich habe das Problem jetzt über einen Umweg gelöst...
Eine CompoBox (Style=csDropDownList) wird hinter einem Edit-Feld versteckt und softwareseitig bei Bedarf aufgeklappt:
Delphi-Quellcode:
Das ist optisch sehr ansprechend und für den Nutzer intuitiv, wenn auch etwas aufwändig umzusetzen...
procedure TFormTurniere.EditMouseEnter(
Sender: TObject); begin if Edit.Text = '' then BitBtnOpenClick(Self); end; procedure TFormTurniere.BitBtnOpenClick(Sender: TObject); begin ComboBox.Left := Edit.Left; ComboBox.Width := Edit.Width; ComboBox.Top := Edit.Top; ComboBox.Height := Edit.Height; ComboBox.DroppedDown := True; end; stahli |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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 by Thomas Breitkreuz