AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RadioGroup.Itemindex verstellt sich selbst?!?

Ein Thema von Mysticus · begonnen am 6. Dez 2006 · letzter Beitrag vom 5. Mär 2011
Antwort Antwort
Mysticus

Registriert seit: 16. Sep 2003
Ort: Gomaringen
13 Beiträge
 
Delphi 2009 Professional
 
#1

RadioGroup.Itemindex verstellt sich selbst?!?

  Alt 6. Dez 2006, 13:54
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?
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#2

Re: RadioGroup.Itemindex verstellt sich selbst?!?

  Alt 6. Dez 2006, 14:08
Moin
Ich vermute mal, dass du die Form2 nur versteckst also Form2.Hide machst 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...
  Mit Zitat antworten Zitat
Darkchild

Registriert seit: 13. Okt 2006
Ort: NRW
169 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: RadioGroup.Itemindex verstellt sich selbst?!?

  Alt 6. Dez 2006, 14:12
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
Ich bin der Geist der stets verneint und das mit recht, denn alles was entsteht ist wert das es zugrunde geht, drum besser wär das nichts entstünde, so ist denn alles was ihr Sünde, Zerstörung, kurz das Böse nennt, mein eigendliches Element.
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#4

Re: RadioGroup.Itemindex verstellt sich selbst?!?

  Alt 6. Dez 2006, 14:34
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
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Mysticus

Registriert seit: 16. Sep 2003
Ort: Gomaringen
13 Beiträge
 
Delphi 2009 Professional
 
#5

Re: RadioGroup.Itemindex verstellt sich selbst?!?

  Alt 6. Dez 2006, 16:35
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.
  Mit Zitat antworten Zitat
Mysticus

Registriert seit: 16. Sep 2003
Ort: Gomaringen
13 Beiträge
 
Delphi 2009 Professional
 
#6

Re: RadioGroup.Itemindex verstellt sich selbst?!?

  Alt 6. Dez 2006, 18:15
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

Windows.SetFocus(RadioButton1.Handle); nachweisen kann.
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#7

Re: RadioGroup.Itemindex verstellt sich selbst?!?

  Alt 6. Dez 2006, 21:26
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
  Mit Zitat antworten Zitat
Benutzerbild von isilive
isilive

Registriert seit: 15. Okt 2008
Ort: Österreich
192 Beiträge
 
Delphi 2009 Professional
 
#8

AW: RadioGroup.Itemindex verstellt sich selbst?!?

  Alt 5. Mär 2011, 11:40
Danke Lannes! Radiogroup.setfocus ist die Lösung. Auf was man alles kommen muss (bzw. was ich alles vorher probiert habe...)
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten API wie ein Stolperstein wirken.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:35 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