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 eigene ComboBox (https://www.delphipraxis.net/105780-eigene-combobox.html)

stahli 29. Dez 2007 23:13


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

bitsetter 30. Dez 2007 01:03

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;

Sharky 30. Dez 2007 07:45

Re: eigene ComboBox
 
Hai stahli,

wäre es nicht einfacher das OnEnter-Ereigniss zu "überschreiben"?

stahli 30. Dez 2007 10:25

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.

stahli 1. Jan 2008 18:56

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:
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;
Das ist optisch sehr ansprechend und für den Nutzer intuitiv, wenn auch etwas aufwändig umzusetzen...

stahli


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 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