Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Focus richtig setzten? (https://www.delphipraxis.net/179771-focus-richtig-setzten.html)

MoziGut 31. Mär 2014 15:01

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!

MoziGut 2. Apr 2014 07:21

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!

Der schöne Günther 2. Apr 2014 11:15

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:
Memo1.SetFocus()
ins Spiel?

MoziGut 2. Apr 2014 13:29

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:
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;
Bei "deletbutton" und "editbutton" sind normale Events hinterlegt!

Der schöne Günther 2. Apr 2014 13:46

AW: Focus richtig setzten?
 
Angenommen, man hängt nach dem
Delphi-Quellcode:
btn2.OnClick := deletebutton;
noch ein
Delphi-Quellcode:
btn2.SetFocus();
an, dann hat bei mir der Button2 den Fokus und kann auch direkt gedrückt werden. Btn1 natürlich ebenso.

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?

himitsu 2. Apr 2014 13:59

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?

MoziGut 2. Apr 2014 14:06

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?

MoziGut 2. Apr 2014 14:26

AW: Focus richtig setzten?
 
@himitsu: könntest du die Frage nochmal anders formulieren? Ich weiß nicht genau wie du das meinst!

Perlsau 2. Apr 2014 17:43

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.

MoziGut 3. Apr 2014 08:25

AW: Focus richtig setzten?
 
Ja das klingt plausibel. Jetzt ist die Frage wie dem Button direkt den Focus geben könnte!?!

Perlsau 3. Apr 2014 11:23

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.

MoziGut 7. Apr 2014 07:36

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

Perlsau 7. Apr 2014 08:15

AW: Focus richtig setzten?
 
Zitat:

Zitat von MoziGut (Beitrag 1254848)
es verliert den Fokus nur bei der auf das Handy compilierten Version.

Wenn es auf deinem Android-Handy sowas wie einen Taskmanager gibt, kannst du ja mal beobachten, ob da noch was geladen wird, wenn du dein Programm dort startest. Vielleicht rufst du ja auch mit deiner Anwendung irgendwas auf, das dann den Fokus behält. Welche Anwendung hat denn nach dem Start deines Programms den Fokus, wenn dein Programm sichtbar nicht den Fokus hat?

Ich hab von Android absolut keine Ahnung, aber ich hab ein wenig gegoogelt und Folgendes gefunden:

Die Standard-Anleitung von Emba: Dort steht an der Stelle, die man mit dem Suchbegriff Fokus findet:
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)
Offenbar haben andere hier auch dieses Problem. Du kannst den User ja mal fragen, ob er inzwischen eine Lösung gefunden hat.

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.

himitsu 7. Apr 2014 08:49

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.

MoziGut 7. Apr 2014 09:31

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 07:50 Uhr.

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