Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi RadioGroup.Itemindex verstellt sich selbst?!? (https://www.delphipraxis.net/82002-radiogroup-itemindex-verstellt-sich-selbst.html)

Mysticus 6. Dez 2006 13:54


RadioGroup.Itemindex verstellt sich selbst?!?
 
Hallo,

obwohl ich schon sehr viel mit Delphi und VCL programmiert habe, bin ich heute auf ein Problemchen gestoßen, das sich letztlich schon anhand von nur zwei effektiven Programmzeilen demonstrieren läßt, welche mit aber Rätsel aufgeben, die ich Euch nicht vorenthalten will:

Eine VCL-Anwendung (Delphi 7) mit zwei Formularen; Form1 enthält lediglich einen Button, dessen OnClick-Ereignisfunktion das zweite Formular anzeigt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show();
end;
Form2 enthält lediglich eine RadioGroup mit den drei Items "A", "B", und "C", deren ItemIndex in der OnShow-Ereignisfunktion auf 0 gesetzt wird:

Delphi-Quellcode:
procedure TForm2.FormShow(Sender: TObject);
begin
  RadioGroup1.ItemIndex := 0;
end;
So, das war's schon. Ich starte nun dieses Progrämmchen, betätige den Button, worauf sich Form2 öffnet. Hier wähle ich in der RadioGroup Item "C" aus und schließe Form2 (durch Click auf das Schließen-Symbol oben rechts) wieder. Wenn ich jetzt den Button erneut betätige, öffnet sich Form 2 wieder und nun kommt das (für mich) Unglaubliche: in der RadioGroupo ist Item "C" selektiert, d.h. der ItemIndex ist 2, obwohl ich ihn in FormShow() explizit auf 0 setze und dieser Code auch tatsächlich durchlaufen wird.

Das Problem tritt im C++-Builder 5 genauso auf.

Anscheinend wird irgendwo in den Tiefen der VCL nach dem Aufruf von FormShow() der RadioGroup1.ItemIndex wieder auf den Wert restauriert, der beim Schließen des Formulars galt. Aber warum, was soll dieses unverständliche "Eigenleben"? Und weiß jemand einen eleganten Weg, den ItemIndex beim erneuten Anzeigen des Formulars dennoch auf einen Startwert zurücksetzen?

raiguen 6. Dez 2006 14:08

Re: RadioGroup.Itemindex verstellt sich selbst?!?
 
Moin :-)
Ich vermute mal, dass du die Form2 nur versteckst also Form2.Hide machst :gruebel: dann dürfte das von die beschriebene Phänomen erklärbar sein? Wieso ich darauf komme? Nun, in deinem Button1Click sagst du Form2.show... d.h. also die Form2 ist schon irgendwo erstellt und vertsteckt sich nur und wartet auf die Aufforderung, sich zeigen zu dürfen...

Darkchild 6. Dez 2006 14:12

Re: RadioGroup.Itemindex verstellt sich selbst?!?
 
Hallo erstmal,

Dein Problem könnte sein das wenn Du die Form schliesst diese nicht wirklich beendet wird sondern immer noch im hintergrund aktiv ist, um sicher zu gehen das diese form wirklich geschlossen wird solltest Du im FormClose Event der Form2 folgendes eintragen:

Delphi-Quellcode:
action := cafree;
form2 := nil;
Und in der Form1 auf dem Button mit dem Du die Form aufrufst noch folgendes:
Delphi-Quellcode:
if frmForm2= nil then
     begin
     frmForm2 := TfrmForm2.Create(self);
     frmForm2.Show;
     end;
Damit sollte sich Dein Problem theoretisch erledigt haben.

Gruss
Darkchild

Lannes 6. Dez 2006 14:34

Re: RadioGroup.Itemindex verstellt sich selbst?!?
 
Hallo,

die Lösung:
Delphi-Quellcode:
procedure TForm2.FormShow(Sender: TObject);
begin
  RadioGroup1.SetFocus;
  RadioGroup1.ItemIndex := 0;
end;
Im Delphi-Forum gab es ein ähnliches Problem:
[TForm, VCL Win32] Mit Button oder mit X schließen unterscheidet sich

Mysticus 6. Dez 2006 16:35

Re: RadioGroup.Itemindex verstellt sich selbst?!?
 
Hallo zusammen,

das geht aber echt schnell, daß hier die ersten Antworten eintrudeln.

@raiguen & darkchild:

Mein Programm enthält wirklich nur die beiden genannten von mir geschriebenen Funktionen. Ich schließe Form2 - wie gesagt - durch Click auf das Schließen-Symbol oben rechts, dabei wird das Formular tatsächlich geschlossen und seine Close()-Funktion wird ausgeführt. Es bleibt aber natürlich instanziert (ich führe ja kein Destroy() aus, was unter Delphi ja auch ganz und gar unüblich wäre). Das alles sollte aber m. E. auch nichts zur Sache tun, denn in FormShow setzte ich den ItemIndex ja explizit neu und dieser Code wird auch wirklich ausgeführt, wie sich mit einem Breakpoint leicht überprüfen läßt. Aber er wird danach von einem nicht von mir stammenden Code wieder überschrieben, und das fand ich ziemlich obskur.

@lannes:

Tatsächlich, diese Lösung funzt und erfüllt das, was ich mit elegant gemeint habe. Anscheinend merkt sich die VCL, auf welchem Steuerelementen der Focus beim Schließen saß und teilt diesem Steuerelement den Focus nach dem Ausführen von FormShow wieder zu. Das kann ja noch als Feature durchgehen, aber wenn dieses Steuerelement ein RadioButton (einzelner RadioButton oder auch Subelement einer RadioGroup) ist, wird dessen Eigenschaft Checked hierbei gesetzt! Eine CheckBox verhält sich da anderst, nämlich so wie erwartet. Was es alles gibt...

Jedenfalls vielen Dank allen Antwortenden.

Mysticus 6. Dez 2006 18:15

Re: RadioGroup.Itemindex verstellt sich selbst?!?
 
Noch eine Anmerkung (um die gute VCL etwas zu entlasten): Das Setzen der Eigenschaft Checked eines RadioButtons, wenn diesem der Focus zugeteilt wird, geht auf das Konto von Windows, nicht der VCL, wie man leicht anhand der Zeile

Delphi-Quellcode:
Windows.SetFocus(RadioButton1.Handle);
nachweisen kann.

raiguen 6. Dez 2006 21:26

Re: RadioGroup.Itemindex verstellt sich selbst?!?
 
Zitat:

Zitat von Mysticus
...durch Click auf das Schließen-Symbol oben rechts, dabei wird das Formular tatsächlich geschlossen und seine Close()-Funktion wird ausgeführt. Es bleibt aber natürlich instanziert (ich führe ja kein Destroy() aus...

Nun ja, das Formular wird nicht tatsächlich geschlossen, auch wenn es die Close()-Funktion durchläuft - es wird 'versteckt' bzw wird geHIDEd ;) solange im OnClose-Ereignis nicht explizit Action := caFree gesetzt wird, wird die Form auch nicht destroyed und freigegeben.
Im Übrigen würde das Setzen eines RadioGroup.ItemIndex im OnActive funktionieren, ohne die RadioGroup vorher expliziet zu focusieren...
Soweit noch die eine oder andere Bemerkung meinerseits... Aber wie wir sehen,m gibts es doch so das eine oder andere, worüber man sich wundert bzw den Kopf zerbricht - so macht doch das Programmieren wenigstens ein bissl 'Spaß' - ohne dem wäre es doch langweilig ;)

isilive 5. Mär 2011 11:40

AW: RadioGroup.Itemindex verstellt sich selbst?!?
 
Danke Lannes! Radiogroup.setfocus ist die Lösung. Auf was man alles kommen muss (bzw. was ich alles vorher probiert habe...) :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 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