![]() |
Aktuellen Focus verlieren oder löschen
Folgendes Problem:
Ich hab eine App-Bildschirmmaske mit einem TabControl mit 3 Seiten. Das Blättern funktioniert unter anderem durch Wischen. Auf jeder Seite gibt es Steuerelemente, die durch Schieben eingestellt werden können (Switches und Trackbars). Wenn nun ein Trackbar ein Stückchen verschoben wird, will die App neben dem gewünschten Verstellen der Komponente auch umblättern, weil es das Schieben für ein Wischen hält. Also fange ich das ab. Wenn der Focus beim Auslösen einer Geste auf einem der Switch/Trackbar-Steuerelemente liegt, dann setze ich "Handled" auf "true" und schon blättert es nicht mehr um. Jetzt ruht der Focus allerdings auf einem Switch/Trackbar, was zur Folge hat, dass das Blättern nicht mehr funktioniert, weil es IMMER abgefangen wird. Also will ich den Focus EINFACH NUR LÖSCHEN oder ersatzweise auf ein anderes Element legen. Und genau das ist das Problem. Ich habe kein anderes Steuerelement auf dem Bildschirm, dass den Focus erhalten kann. Vorraussetzungen dafür sind nämlich: - Steuerelement hat die Eigenschaft "CanFocus" - Steuerelement ist auf der aktuell sichtbaren Maske - Steuerelement ist sichtbar Ich kann also keinen unsichtbaren Dummy-Button oder ein Element von einem anderen Formular oder einer anderen Tab-Seite benutzen. :S
Delphi-Quellcode:
Gibt es einen Trick, den Focus, der auf TSwitch oder TTrackbar liegt, loszuwerden?
procedure TFormOptions.TabControl1Gesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin //wir wollen die "blättern"-geste vermeiden, wenn der Focus auf dem Trackbar/TSwitch liegt, //damit beim Einstellen des Trackbars/TSwitchs nicht immer der Bildschirm gewechselt wird if Assigned(Focused) then begin //bei Trackbar-Verschiebung nicht durch die Tabs blättern if Focused.GetObject is TTrackbar then Handled:=true; //bei Switch-Bewegung nicht durch die Tabs blättern if Focused.GetObject is TSwitch then Handled:=true; if Handled then begin //zum Schluss Focus wegschicken, damit die Gesten nun wieder funktionieren //ClearFocus oder ReleaseFocus oder ForgetFocus wäre schön, gibts aber nicht //nur-lesen-eigenschaft: TTrackbar(Focused.GetObject).IsFocused:=false; //funzt nicht, weil visible=false // if TabControl1.ActiveTab=TabItem1 then // SetFocused(ButtonFocusDummyPage1); // if TabControl1.ActiveTab=TabItem2 then // SetFocused(ButtonFocusDummyPage2); // if TabControl1.ActiveTab=TabItem3 then // SetFocused(ButtonFocusDummyPage3); end; end; if not Handled then begin case EventInfo.GestureID of sgiLeft: ExecuteAction(NextTabActionPGOptions); sgiRight: ExecuteAction(PreviousTabActionPGOptions); end; end; end; Danke! |
AW: Aktuellen Focus verlieren oder löschen
Zitat:
gruss |
AW: Aktuellen Focus verlieren oder löschen
Ja, unter Windows.
|
AW: Aktuellen Focus verlieren oder löschen
Zitat:
sorry dann weis ich auch nicht. PS: Und SetFocused(0); ? gruss |
AW: Aktuellen Focus verlieren oder löschen
cool, danke für die schnellen Antworten!
so wie es aussieht, ist
Delphi-Quellcode:
die Lösung!
SetFocused(nil);
Herzlichen Dank für die Tipps! in Gänze sieht das also so aus:
Delphi-Quellcode:
procedure TFormOptions.TabControl1Gesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin //wir wollen die "blättern"-geste vermeiden, wenn der Focus auf dem Trackbar/TSwitch liegt, //damit beim Einstellen des Trackbars/TSwitchs nicht immer der Bildschirm gewechselt wird if Assigned(Focused) then begin //bei Trackbar-Verschiebung nicht durch die Tabs blättern if Focused.GetObject is TTrackbar then Handled:=true; //bei Switch-Bewegung nicht durch die Tabs blättern if Focused.GetObject is TSwitch then Handled:=true; if Handled then begin //zum Schluss Focus wegschicken, damit die Gesten nun wieder funktionieren SetFocused(nil); end; end; if not Handled then begin case EventInfo.GestureID of sgiLeft: ExecuteAction(NextTabActionPGOptions); sgiRight: ExecuteAction(PreviousTabActionPGOptions); end; end; end; |
AW: Aktuellen Focus verlieren oder löschen
Ich habe mir schon gedacht das es auch so etwas in was auch immer du programmierst Windows, Android.. bla bla geben muss.
War mir nur nicht sicher was bei SetFocused verwendet wird. Aber gut wenn es geht ;) Lag ich doch nicht SOooo falsch. gruss |
AW: Aktuellen Focus verlieren oder löschen
Zitat:
Delphi-Quellcode:
Geht das besser (in VLC)?
procedure Blur();
begin if Enabled then begin Self.Enabled := False; Self.Enabled := True; end; end; |
AW: Aktuellen Focus verlieren oder löschen
Zitat:
Er wollte mir sagen das es SetFocus unter Windows gibt aber nicht unter Android. Wo gibt es nun mit deiner Antwort einen Bezug zu Android? Und der Frage vom TE Man muss verstehen was man liest.. aber keine bange mir geht es mitunter auch nicht anders. Ich habe vorher auch nicht gewusst das es NICHT um Windows geht. gruss |
AW: Aktuellen Focus verlieren oder löschen
Zitat:
![]() |
AW: Aktuellen Focus verlieren oder löschen
Zitat:
Delphi-Quellcode:
SetFocused(nil);
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 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-2025 by Thomas Breitkreuz