TRadioButton - SetFocus

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

TRadioButton - SetFocus

Beitrag von wolf_z »

Folgendes Verhalten von TRadioButton ist sehr seltsam und ziemlich problematisch für mich:

Man setze 3 RadioButtons auf ein Formular und verbinde das 'onMouseMove'-Ereignis mit folgender Funktion

Code: Alles auswählen

procedure TForm1.RadioButton1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  TRadioButton(Sender).SetFocus;
end;


Wenn man jetzt mit der Maus über die Radio-Buttons fährt, wird immer der RadioButton aktiviert, der den Focus erhält. Das ist meiner Meinung nach ein Bug. Checkboxen und normale Buttons verhalten sich dagegen korrekt!

Allerdings verhält sich Delphi5 genauso! Ich finde aber, dass dieses Verhalten ziemlich nervig ist und man sollte doch Fehler aus Delphi in Lazarus nicht unbedingt kopieren!

Sollte man sowas als Bug melden?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TRadioButton - SetFocus

Beitrag von theo »

wolf_z hat geschrieben:Wenn man jetzt mit der Maus über die Radio-Buttons fährt, wird immer der RadioButton aktiviert, der den Focus erhält.


Das ist doch der Sinn von SetFocus, dass das Ding aktiviert wird.
Oder meinst du "checked"?

Wenn sich D5 auch so verhält, würde ich das nicht melden. Es gibt eindeutigere Bugs zu fixen.

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: TRadioButton - SetFocus

Beitrag von wolf_z »

Das sehe ich nicht unbedingt so. Aktiviert wird ein Radiobutton oder eine Checkbox mit checked. SetFocus setzt aber nur den Eingabecursor und dann hat man normalerweise die Wahl, seine Eingabe zu machen.

Auf das Setzen von SetFocus folgt nicht immer das Aktivieren oder Eingeben. Z.B. kann auch ein F1-Tastendruck folgen, der sich dann auf das Element bezieht, das den Focus hat, um einen Hilfetext aufzurufen (genau dafür brauche ich das nämlich).

Also für mich ist das ein Bug. Aber gut, ich schau mal, wo man das woanders anbringen kann. Das Problem ist nämlich, dass mir dafür kein Work-Around einfällt, weil das Setzen des Radiobuttons nicht unmittelbar bei setFocus passiert, sondern irgendwo viel später in der Ereignisbehandlung, wo das Programm sich gar nicht mehr in der Ereignis-Methode befindet.

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: TRadioButton - SetFocus

Beitrag von creed steiger »

Wenn Delphi 5 sich auch so verhält würde ich es auch nicht unbedingt als Bug melden,vielleicht als Feature Request?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TRadioButton - SetFocus

Beitrag von theo »

wolf_z hat geschrieben:Aktiviert wird ein Radiobutton oder eine Checkbox mit checked.


Ich glaube wir reden da aneinander vorbei.
Ich meine das "aktiviert" wie in
ActiveControl:=RadioButton2;
Das schaltet übrigens auf GTK2 bei mir (ebenso wie SetFocus) nicht den "checked" Zustand um.

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: TRadioButton - SetFocus

Beitrag von wolf_z »

@creed steiger: guter Vorschlag. Danke!

@theo: Das wäre natürlich eine Möglichkeit. Ich verwende nämlich als LCL win32/win64. Aber wenn ich GTK2 einstellen will, bekomme ich einen fatal error beim Compilieren. Kann ich das überhaupt unter Windows verwenden? Das ist doch die Linux-Gui! Wo muss ich das einstellen? Ich habe das mal versucht unter "Optionen für schnelles Build" und "Erweiterte Build-Optionen".

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TRadioButton - SetFocus

Beitrag von theo »

Da braucht's wahrsch. noch die GTK+ Libraries.
Ich würde das allerdings nicht machen.
WinAPI auf Windows verwenden ist irgendwie schlauer... ;-)

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: TRadioButton - SetFocus

Beitrag von wolf_z »

Nun, ja. Unter dem Gesichtspunkt "Write once, compile everywhere" könnte man doch überlegen, den Linux Widgetset zu nehmen, am besten sogar einen der auch auf Macintosh läuft :mrgreen: Aber soweit bin ich noch nicht. Dafür frage ich mal später vielleicht mal in einem neuen Thread nach. Muß erst mal mein Programm unter Lazarus als Windows-Programm zum Laufen bringen. Da tut's es auch, allerdings Bugs, Bugs, Bugs!

Und solche Sachen, wie dieses "SetFocus" bei "RadioButtons" bringen einen immer wieder aus dem Konzept. Da hat man einen plausiblen Ansatz gefunden, und dann geht der grundsätzlich nicht wegen einer einzigen Komponente, die sich nicht wie die anderen verhält. Werde mir wohl was anderes für meinen "Hilfe Aufruf per F1" überlegen müssen.

Apropos, es gibt ja kein TApplicationEvents in Lazarus. Das wäre dann nämlich das nächste Problem. Ich suche eine Lösung, wie man möglichst plattformunabhängig Ereignisse, z.B. KeyUp, abfangen kann, d.h. eben ohne Verwendung der WinAPI! Das ist mein Problem. Mit "MouseOver" hätte ich darauf verzichten können, geht aber jetzt wohl leider nicht.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TRadioButton - SetFocus

Beitrag von Socke »

wolf_z hat geschrieben:Nun, ja. Unter dem Gesichtspunkt "Write once, compile everywhere" könnte man doch überlegen, den Linux Widgetset zu nehmen, am besten sogar einen der auch auf Macintosh läuft :mrgreen: Aber soweit bin ich noch nicht. Dafür frage ich mal später vielleicht mal in einem neuen Thread nach. Muß erst mal mein Programm unter Lazarus als Windows-Programm zum Laufen bringen. Da tut's es auch, allerdings Bugs, Bugs, Bugs!

Und solche Sachen, wie dieses "SetFocus" bei "RadioButtons" bringen einen immer wieder aus dem Konzept. Da hat man einen plausiblen Ansatz gefunden, und dann geht der grundsätzlich nicht wegen einer einzigen Komponente, die sich nicht wie die anderen verhält. Werde mir wohl was anderes für meinen "Hilfe Aufruf per F1" überlegen müssen.

Apropos, es gibt ja kein TApplicationEvents in Lazarus. Das wäre dann nämlich das nächste Problem. Ich suche eine Lösung, wie man möglichst plattformunabhängig Ereignisse, z.B. KeyUp, abfangen kann, d.h. eben ohne Verwendung der WinAPI! Das ist mein Problem. Mit "MouseOver" hätte ich darauf verzichten können, geht aber jetzt wohl leider nicht.

Es gibt ein TApplicationPropteies, mit dem du auch grafisch die Event-Handler setzen kannst (alternativ im Code von Hand).

GTK2 gibts für Windows, Linux und Mac. Sollte also überall kein Problem darstellen.

Das Problem ist meiner Meinung nach recht nervtötend: Wie wollt ihr ein Formular mit mehreren TRadioButtons korrekt mit der Tastatur (ohne Zeigegerät) steuern ohne die nicht gewünschten RadioButtons zu aktivieren?
Es ist vielleicht im Vergleich zu Delphi kein "Bug", aber doch (meiner Meinung nach) sehr bescheiden.
Meine Tests haben ergeben, dass ich mit Lazarus 0.9.27 (Rev. 19561) keine TRadioEdits fokussieren kann.... auch wenn ich generell den Fokus nicht sehe...
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: TRadioButton - SetFocus

Beitrag von wolf_z »

Socke hat geschrieben:Es gibt ein TApplicationPropteies, mit dem du auch grafisch die Event-Handler setzen kannst (alternativ im Code von Hand)

Danke. Als ich das gelesen habe, hat's bei mir Klick gemacht. Auf dem Formular gibt's ja das Property "KeyPreview", das man auf true setzen kann, und man kann dann über FormKeyUp(...) Tastaturereignisse wie F1 abfangen. Leider ist der Sender dann nur das Formular, so dass ich dann noch irgendwie abfragen muss, über welcher Komponente sich der Cursor gerade befindet, aber das dürfte nicht so schwer sein.

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: TRadioButton - SetFocus

Beitrag von wolf_z »

Das Problem tritt übrigens unter qt nicht auf. Da verhalten sich die Radio-Buttons richtig.

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: TRadioButton - SetFocus

Beitrag von hendy »

Das macht glaub ich die Windows-API.
Schon mal Openoffice geöffnet (oder was anderes, wo radiobuttons vorkommen?)
Dort verhält es sich genauso.
Dankt monta !!

Antworten