![]() |
Focuswechsel
Weis nicht, wie ich die Überschrift benennen soll. Fange einfach mal an:
Habe zwei TEdit und eine TListbox Wenn einer der Edits den Focus hat, dann soll die Listbox angezeigt werden. Ansonsten soll die Listbox nicht sichtbar sein. Wenn die Listbox sichtbar ist, dann soll aus der Listbox soll ein Eintrag mit einem Klick herausgewählt werden können. Die Listbox anzeigen/ausblenden kann ich in dem Event OnEnter/OnExit der TEdits. Dazu verwende ich das Property "visible". Problem ist nur, wenn ich auf einen Eintrag in der Listbox klicke, dann verlieren natürlich die Edits den Focus. Damit ist die Listbox mit visible:=false; weggeschaltet und der OnClick der Listbox wird nicht mehr durchgeführt. Wenn ich im OnExit der Edits wüsste, daß das nächste focusierst Element die listbox ist, dann könnte ich visible:=false; überspringen. Gibt es eine Funktion, mit der ich herausfinden kann, welches Control als nächstes den Focus bekommt. |
AW: Focuswechsel
Also, hab ich richtig verstanden, dass du die beiden Edits überprüfst indem du OnEnter bzw. OnExit auswertes? Dann kannst du doch irgendwie sowas machen: (ungetestet)
Delphi-Quellcode:
Und bei OnMouseEnter der Listbox schreibst du dann sowas: (ungetestet)
if MausUeberListbox = false then
{dein Code} else Exit;
Delphi-Quellcode:
Denke, so sollte das funktionieren...
MausUeberListbox:=true;
lg, hans ditter |
AW: Focuswechsel
Kannst Du nicht einfach prüfen:
Delphi-Quellcode:
Edit.Visible := (Edit.Focused or ListBox.Focused);
|
AW: Focuswechsel
Zitat:
|
AW: Focuswechsel
Wieso hellsehen? Im wParam der WM_KILLFOCUS-Message steht ggf. das Handle des Controls, das den Fokus erhalten soll (sofern man dem MSDN glauben darf).
|
AW: Focuswechsel
Das Problem ist ja, dass das alte Control erst den Focus verliert und dann das neue den Focus bekommt.
Evtl. kann man auch ActiveControl abfragen. Es ist aber u.U. auch möglich, dass sich das Verhalten unter den verschiedenen Windows-Versionen unterscheidet. Deshalb ist auch eine zyklische Korrektur in einem Timer zu überlegen. |
AW: Focuswechsel
Zitat:
WM_KILLFOCUS: Zitat:
Zitat:
Aber das kann für ihn schon zu spät sein. |
AW: Focuswechsel
Dann eben anders:
Delphi-Quellcode:
Das müsste dann ins OnExit dieser 3 Controls, dann sollte es klappen, sofern ich keinen dummen Denkfehler mache.
ListBox1.Visible := (ActiveControl = Edit1) or (ActiveControl = Edit2) or (ActiveControl = ListBox1);
|
AW: Focuswechsel
Zitat:
Als Benutzer würde mich diese auftauchende und verschwindende Listbox verwirren. Und was wenn der Benutzer anstelle der Maus die Tastatur benützt um mit TAB ins nächste Control zu springen? Schon mal daran gedacht einfach zweimal TCombobox anstelle der Edits zu verwenden? Die Listbox wird dann natürlich nicht mehr gebraucht. |
AW: Focuswechsel
Machen wir doch mal ne LowRider Lösung (nicht schön aber selten)
Statt die Listbox im OnExit auszublenden starte einen Timer
Delphi-Quellcode:
Das Interval würde ich auf 250ms setzen.
Timer1.Enabled := true;
Im Timer dann
Delphi-Quellcode:
Gleichzeitig den Timer auch bei ListBox1.OnExit starten
Timer1.Enabled := False;
ListBox1.Enabled := ListBox1.Focused or Edit1.Focused; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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