Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Focuswechsel (https://www.delphipraxis.net/155577-focuswechsel.html)

bernau 29. Okt 2010 16:18

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.

hans ditter 29. Okt 2010 16:43

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:
if MausUeberListbox = false then
   {dein Code}
else Exit;
Und bei OnMouseEnter der Listbox schreibst du dann sowas: (ungetestet)

Delphi-Quellcode:
MausUeberListbox:=true;
Denke, so sollte das funktionieren...

lg, hans ditter

stahli 29. Okt 2010 17:45

AW: Focuswechsel
 
Kannst Du nicht einfach prüfen:
Delphi-Quellcode:
Edit.Visible := (Edit.Focused or ListBox.Focused);

Luckie 29. Okt 2010 18:18

AW: Focuswechsel
 
Zitat:

Zitat von bernau (Beitrag 1058509)
Gibt es eine Funktion, mit der ich herausfinden kann, welches Control als nächstes den Focus bekommt.

Also hell sehen können Computer, Gott sei dank, noch nicht.

DeddyH 29. Okt 2010 18:22

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).

stahli 29. Okt 2010 18:30

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.

Luckie 29. Okt 2010 18:34

AW: Focuswechsel
 
Zitat:

Zitat von DeddyH (Beitrag 1058528)
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).

Ich habe fünf Schaltflächen: S1 bis S5 die auch diese Tabreihenfolge haben. Jetzt erkläre mir mal woher das Programm wissen soll, welche Schaltfläche ich anklicke werde, nach dem ich S1 angeklickt habe?

WM_KILLFOCUS:
Zitat:

Sent to a window immediately before it loses the keyboard focus.
Wird also von dem Steuerelement gesendet, welches den Fokus verliert, nach dem ein anderes ausgewählt wurde bevor dieses neue den Fokus erhält.
Zitat:

A handle to the window that receives the keyboard focus.
Gut hier könnte das Handle des Steuerelementes drin stecken, welches den Fokus erhält.
Aber das kann für ihn schon zu spät sein.

DeddyH 29. Okt 2010 18:45

AW: Focuswechsel
 
Dann eben anders:
Delphi-Quellcode:
ListBox1.Visible := (ActiveControl = Edit1) or (ActiveControl = Edit2) or (ActiveControl = ListBox1);
Das müsste dann ins OnExit dieser 3 Controls, dann sollte es klappen, sofern ich keinen dummen Denkfehler mache.

sx2008 29. Okt 2010 20:59

AW: Focuswechsel
 
Zitat:

Zitat von bernau (Beitrag 1058509)
Wenn einer der Edits den Focus hat, dann soll die Listbox angezeigt werden. Ansonsten soll die Listbox nicht sichtbar sein.

Also ich habe noch kein Windows Programm gesehen, dass sich so seltsam verhält.
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.

Sir Rufo 29. Okt 2010 21:13

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:
Timer1.Enabled := true;
Das Interval würde ich auf 250ms setzen.
Im Timer dann
Delphi-Quellcode:
Timer1.Enabled := False;
ListBox1.Enabled := ListBox1.Focused or Edit1.Focused;
Gleichzeitig den Timer auch bei ListBox1.OnExit starten


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 Uhr.
Seite 1 von 2  1 2      

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