![]() |
Focus richtig setzten?
Hallo Freunde,
ich hab hier eine App, bei der sich durch einen Swipe ein Calloutpanel öfffnet. In dem Calloutpanel befinden sich zwei Buttons für die ich den direkten Focus haben möchte. Zur Zeit, muss ich zwei mal auf das Panel tippen um das Event des Buttons auszuführen! Gibt es eine Möglichkeit das zu umgehen? Also das ich den Button nur einmal drücken muss? Ich habs mit
Delphi-Quellcode:
.
Memo1.SetFocus;
Irgendwelche Ideen? Vielen Dank PS: Ich nutzte Delphi XE5, es ist eine Mobile Firemonkey Anwendung und es ist für Android! |
AW: Focus richtig setzten?
Ist das so schwierig?
Oder hab ich mich schlecht ausgedrückt und ihr braucht noch Informationen? Ich bin dankbar für jeden Anstoss den ich bekommen kann! |
AW: Focus richtig setzten?
Ich kann es nicht nachvollziehen. TCalloutPanel, zwei Buttons rein. Mit einem drittem Button außerhalb kann ich meinetwegen die Enabled-Eigenschaft des Panels umschalten. Und wenn das Panel grade aktiviert wird, kriegt Button1 den Fokus.
Egal was man anstellt, beim ersten Klick wird der Button (erwartungsgemäß) gedrückt. Und wie kommt bei dir nun ein
Delphi-Quellcode:
ins Spiel?
Memo1.SetFocus()
|
AW: Focus richtig setzten?
Ich lasse das Panel mit einer Swipefunkttion öffnen. Und dann hab ich dort das Calloutpanel mit zwei Buttons. Und nein ich habe dann nicht den direkten Focus auf die Buttons. ICh muss immer zwei mal Drücken...
Delphi-Quellcode:
Bei "deletbutton" und "editbutton" sind normale Events hinterlegt!
begin
if EventInfo.GestureID = sgiLeft then begin I := strtoint(ListBox1.Selected.itemdata.detail); if scall = False then inf := TCalloutPanel.Create(Self); inf.Parent := ListBox1.Selected; inf.Height := 60; inf.Width := ListBox1.Width; inf.CalloutLength := 0; inf.Position.Y := 0; inf.Visible := true; scall := true; btn1 := TButton.Create(Self); btn1.Parent := inf; btn1.Text := 'Edit'; btn1.Height := 40; btn1.Cursor := crHandPoint; btn1.Width := 120; btn1.Position.Y := 5; btn1.Position.X := 20; btn1.Visible := true; btn1.Enabled := true; btn1.OnClick := editbutton; btn2 := TButton.Create(Self); btn2.Parent := inf; btn2.Text := 'Löschen'; btn2.Height := 40; btn2.Cursor := crHandPoint; btn2.Width := 120; btn2.Position.Y := 5; btn2.Position.X := ListBox1.Width - 140; btn2.Visible := true; btn2.Enabled := true; btn2.OnClick := deletebutton; end else begin if EventInfo.GestureID = sgiright then begin Form2.Show; end; end; end; |
AW: Focus richtig setzten?
Angenommen, man hängt nach dem
Delphi-Quellcode:
noch ein
btn2.OnClick := deletebutton;
Delphi-Quellcode:
an, dann hat bei mir der Button2 den Fokus und kann auch direkt gedrückt werden. Btn1 natürlich ebenso.
btn2.SetFocus();
Unter Windows. Ob sich bei Android da jetzt andere Dinge abspielen weiß ich nicht. Auch verstehe ich nicht, warum du jedes mal die Buttons neu erzeugst? |
AW: Focus richtig setzten?
Kann es sein, daß hier eigentlich die Form garnicht aktiv ist und daher mit dem ersten Klick der Fokus erstmal in die Form wandert?
Schaltet das SetFocus auf den Button nun auch die Form auf aktiv, oder setzt es nur das ActiveControl in der Form? |
AW: Focus richtig setzten?
hab ich versucht, trotzdem muss ich zwei mal tippen. Und wie soll ich es denn schreiben wenn ich die Button beständig haben wollen würde? Bzw welchen Vorteil bringt mir das?
|
AW: Focus richtig setzten?
@himitsu: könntest du die Frage nochmal anders formulieren? Ich weiß nicht genau wie du das meinst!
|
AW: Focus richtig setzten?
Ganz einfach: Die Form = das Formular = das Fenster, das dein Programm beinhaltet. Es könnte sich unter Umständen ereignen, daß deinem Programmfenster beim oder nach em Start aus irgend einem Grund der Fokus entzogen wird. Vielleicht wird ja noch eine andere Anwendung mitgestartet oder danach aufgerufen. Dann hätte diese andere Anwendung den Fokus. Mit einem Klick auf besagten Button innerhalb deiner Anwendung würde das so ausgelöste Ereignis eine Message senden, die dazu verwendet würde, deinem Programm den Fokus zuzuweisen. Damit wäre die Message sozusagen aufgebraucht und würde nicht bis zu deinem Button weiterwandern.
|
AW: Focus richtig setzten?
Ja das klingt plausibel. Jetzt ist die Frage wie dem Button direkt den Focus geben könnte!?!
|
AW: Focus richtig setzten?
Wenn dein Programm direkt nach dem Start den Fokus verliert, kann hier im Forum keiner beurteilen, wodurch das ausgelöst wird. Das kannst nur du, denn nur du bist im Besitz dieses Android-Dingens, auf dem womöglich gleich nach dem Start deiner Anwendung ein weiteres Programm gestartet wird, das den Fokus an sich reißt. Ich weiß ja nicht einmal, ob sich das Phänomen nur beim Entwickeln auf deinem PC-Desktop ereignet oder ebenfalls auf deinem Android-Handy.
|
AW: Focus richtig setzten?
ja das müsste ich jetzt irgendwie herausbekommen...
es verliert den Fokus nur bei der auf das Handy compilierten Version. Auf dem Desktop funktioniert es einwandfrei... |
AW: Focus richtig setzten?
Zitat:
Ich hab von Android absolut keine Ahnung, aber ich hab ein wenig gegoogelt und Folgendes gefunden: ![]()
Code:
Einstellungen für Tastatur, TEdit und TMemo
Tastatur Legen Sie die Eigenschaft vkAutoShowMode auf vkasDefinedBySystem, vkasNever oder vkasAlways fest. TEdit und TMemo Legen Sie KillFocusByReturn fest (beim Drücken der Eingabetaste verliert das Steuerelement den Fokus) ![]() Eine andere Möglichkeit bestünde darin, ein quasi leeres Projekt auf das Handy zu kompilieren und zu schauen, ob das dann immer noch auftritt. Wenn nicht, könntest du durch Kopieren nach und nach das leere Projekt mit den Komponenten und dem Code aus deiner derzeitigen Anwendung füllen und so herausfinden, ab wann oder mit welchem Code bzw. mit welchen Komponenten das Phänomen auftritt. Du könntest auch mal "mit wachem Blick" über deinen Code "huschen" und dir dabei überlegen, ob da irgendwo eine andere Anwendung wie z.B. ein virtuelles Keyboard oder was weiß ich aufgerufen wird. Das klingt zwar alles umständlich und langwierig, ist aber vielleicht die einzige Methode zum Auffinden der Fehlerquelle. |
AW: Focus richtig setzten?
Falls es das im FMX auch gibt: (in der VCL funktioniert das ganz gut)
Screen.OnActiveFormChange und Screen.OnActiveControlChange ein eigenes Event zuweisen und darin den Namen von Screen.ActiveCustomForm, bzw. Screen.ActiveControl, auslesen und irgendwo loggen. Schon sieht man wie und wo der Fokus rumwandert. Falls das nicht hilft, dann dort je einen Haltepunkt rein, genauso so den Aufruf des Fenster, und dann gemütlich debuggen. Bei mir gehen Logmeldungen direkt auch nochmal als DebugMessage an den Debugger raus, so daß man diese live im Debugger verfolgen kann. Und schon sieht man was da nun eigentlich passiert. |
AW: Focus richtig setzten?
ah super, danke euch beiden. Ich werde das alles erstmal ausprobieren und melde mich dann wieder.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 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