Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Radiogroup mit Eigenleben

20 views
Skip to first unread message

Christian Schmitt

unread,
Aug 17, 2019, 5:40:14 PM8/17/19
to
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

unread,
Aug 18, 2019, 3:04:06 AM8/18/19
to
Am 17.08.2019 um 23:40 schrieb Christian Schmitt:
> Hallo Leute,
>
> 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;
>
> 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

unread,
Aug 18, 2019, 5:31:52 AM8/18/19
to
Am 17.08.2019 um 23:40 schrieb Christian Schmitt:

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

Ersma: es muss Buttons[0] heißen.

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

> 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

unread,
Aug 18, 2019, 12:22:41 PM8/18/19
to
Am Sonntag, 18. August 2019 11:31:52 UTC+2 schrieb Alfred Gemsa:
>
> Ersma: es muss Buttons[0] heißen.
>
Si, mea culpa


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

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

unread,
Aug 19, 2019, 1:27:41 AM8/19/19
to
Am Sonntag, 18. August 2019 18:22:41 UTC+2 schrieb 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ß
0 new messages