Discussion:
Radiogroup mit Eigenleben
(zu alt für eine Antwort)
Christian Schmitt
2019-08-17 21:40:13 UTC
Permalink
Hallo Leute,

nachdem ich jetzt 5h lang einen Fehler bei mir gesucht habe, habe ich festgestellt, dass die TRadioGroup ein gewisses Eigenleben hat. Man stelle sich ein Fenster mit einer RadioGroup (2 Elemente) und einem Button nebst folgendem Code vor:

procedure form1.TestbuttonClick(Sender:TObject);
begin
RadioGroup1.Button[0].Setfocus;
RadioGroup1.Itemindex:=1;
end;

Wenn man den Testbutton klickt, hat man folgenden Status: Die Radiogroup hat den Focus, genauer gesagt, das 0te Item. Ausgewählt, also mit schwarzem Punkt, ist aber das 1. Item. Sobald nun das Fenster neu gezeichnet wird, weil es z.B. inaktiv und wieder aktiv wird, springt der Radiobutton dorthin, wo der Focus war/ist, auf das 0. Element.

Natürlich kommt jetzt der Einwand, warum sollte man sowas tun?! Natürlich sollte man das nicht :-), es hat sich nur so ergeben: Ich habe eine Anwendung, in der ich zum Einen per Mausklick die Radiobuttons setzen kann, zum anderen aus einem anderen Fenster heraus mit Messages und ItemIndex die Radiobuttons gesetzt werden. Und wenn dies geschieht und ich vorher im aktiven Fenster als letztes einen Radiobutton angeklickt hatte (der also den Focus hat wenn das Fenster wegen wechsels Inaktiv wird) und dann mit einer Message vom anderen Fenster ein anderer Radiobutton ausgewählt wird und ich dann wieder das Fenster aktiviere (Repaint), dann springt mein Radiobutton dorthin, wo er nicht hingehört :-(. Ist das ein Bug oder bin ich zu blöd? Ich habe mir jetzt als Workaround beholfen, in dem ich bei jedem Setzen des ItemIndex auch ein Setfocus hinterher schiebe. Dann habe ich keine Probleme. Das kann aber doch nicht die Lösung sein, oder doch?

Kann das bitte mal jemand mit anderen Delphi-Versionen testen (ich habe XE)?

Gruß
Christian
Jens Köhler
2019-08-18 07:04:01 UTC
Permalink
Post by Christian Schmitt
Hallo Leute,
procedure form1.TestbuttonClick(Sender:TObject);
begin
RadioGroup1.Button[0].Setfocus;
RadioGroup1.Itemindex:=1;
end;
Kann das bitte mal jemand mit anderen Delphi-Versionen testen (ich habe XE)?
Gruß
Christian
Unter D5 kann ich es nicht nachvollziehen, weil es da kein Button[0] gibt.

Jens
Alfred Gemsa
2019-08-18 09:31:50 UTC
Permalink
Post by Christian Schmitt
procedure form1.TestbuttonClick(Sender:TObject);
begin
RadioGroup1.Button[0].Setfocus;
RadioGroup1.Itemindex:=1;
end;
Ersma: es muss Buttons[0] heißen.
Post by Christian Schmitt
Wenn man den Testbutton klickt, hat man folgenden Status: Die Radiogroup hat den Focus, genauer gesagt, das 0te Item. Ausgewählt, also mit schwarzem Punkt, ist aber das 1. Item. Sobald nun das Fenster neu gezeichnet wird, weil es z.B. inaktiv und wieder aktiv wird, springt der Radiobutton dorthin, wo der Focus war/ist, auf das 0. Element.
Das macht D7 genauso und ist m.E. richtig so. Nur: was soll der Fokus
auf einem Item einer Radiogroup? Ein Radiogroup1.SetFocus würde für mich
mehr Sinn machen.
Post by Christian Schmitt
Natürlich kommt jetzt der Einwand, warum sollte man sowas tun?! Natürlich sollte man das nicht :-), es hat sich nur so ergeben: Ich habe eine Anwendung, in der ich zum Einen per Mausklick die Radiobuttons setzen kann, zum anderen aus einem anderen Fenster heraus mit Messages und ItemIndex die Radiobuttons gesetzt werden. Und wenn dies geschieht und ich vorher im aktiven Fenster als letztes einen Radiobutton angeklickt hatte (der also den Focus hat wenn das Fenster wegen wechsels Inaktiv wird) und dann mit einer Message vom anderen Fenster ein anderer Radiobutton ausgewählt wird und ich dann wieder das Fenster aktiviere (Repaint), dann springt mein Radiobutton dorthin, wo er nicht hingehört :-(. Ist das ein Bug oder bin ich zu blöd? Ich habe mir jetzt als Workaround beholfen, in dem ich bei jedem Setzen des ItemIndex auch ein Setfocus hinterher schiebe. Dann habe ich keine Probleme. Das kann aber doch nicht die Lösung sein, oder doch?
Ich verstehe nicht, was du genau willst: Was heißt "andere Anwendung,
die Radiobuttons setzt"?

Werden neue Items erzeugt oder soll nur ein anderer Item gewählt werden?

Alfred.
Christian Schmitt
2019-08-18 16:22:40 UTC
Permalink
Post by Alfred Gemsa
Ersma: es muss Buttons[0] heißen.
Si, mea culpa
Post by Alfred Gemsa
Das macht D7 genauso und ist m.E. richtig so. Nur: was soll der Fokus
auf einem Item einer Radiogroup? Ein Radiogroup1.SetFocus würde für mich
mehr Sinn machen.
Der Focus wurde in dem Beispiel von mir jetzt absichtlich so gesetzt um das Problem zu demonstrieren, Sinn macht das natürlich nicht.
Post by Alfred Gemsa
Ich verstehe nicht, was du genau willst: Was heißt "andere Anwendung,
die Radiobuttons setzt"?
Werden neue Items erzeugt oder soll nur ein anderer Item gewählt werden?
Es muß nicht unbedingt eine andere Anwendung sein, ein anderes Fenster tut es auch: Das Problem ist wie folgt: Ich habe 2 Fenster, das 1. (Form1) hat eine Radiogroup mit 2 Items. Wenn ich jetzt beispielsweise das 2. Item anklicke, wird dieses ausgewählt und hat den Focus. Soweit so gut. Wenn ich jetzt in das andere Fenster (Form2) wechsele, und dort auf einen Button klicke, der einfach nur Form1.RadioGroup.ItemIndex:=0 aufruft, dann sehe ich wie das 1. Element der RG ausgewählt wird. Allerdings bleibt der Focus auf dem zweiten Element sitzen. In dem Moment, in dem ich in Form1 wieder hineinklicke, das Fenster also aktiv wird, merkt wohl die Radiogroup, dass der Focus (2. Element) und das ausgewähle Element (Nr. 1) nicht die gleichen sind und schwupps wird das Element mit dem Focus nochmal ausgewählt, ohne mein Zutun. Das ist mein Problem und meines erachtens nach kein normales Verhalten. Man kann dies übrigens auch sehen, wenn man statt der Maus die Tastatur verwendet: Mit Tab in die RG wechseln und man sieht einen kleinen Rahmen, der den Focus darstellt. Sobald das zweite Fenster Itemindex:=0 aufruft, wandert der Punkt der RG, jedoch nicht der Focusrahmen. Ich kann gerne mal ein Beispiel zur Verfügung stellen oder ein Video machen, es ist etwas kompliziert...

Gruß
Christian Schmitt
2019-08-19 05:27:40 UTC
Permalink
Post by Christian Schmitt
Es muß nicht unbedingt eine andere Anwendung sein,
Es geht auch mit nur einem Formular und einem Timer, gerade getestet: Radiogroup mit 2 Items, OnTimer-Event ein "Radiogroup.ItemIndex:=1", Timer auf 10 sek. stellen und starten. Dann das erste Item anklicken (damit dies den Focus hat) und abwarten bis der Timer den Befehl ausgeführt hat. Jetzt ins Startmenü klicken (damit die Anwendung inaktiv wird) und wieder in die Anwendung, schwupps der Button ist zurück auf Item 1...

Gruß

Loading...