bei Form->Show() ändert sich einfach mein RadioButton->Checked



  • hallo,
    ich habe folgendes mir unerklärliches Verhalten in meiner anwendung:
    Ich habe zwei RadioButtons in einer GroupBox, die nicht gleichzeitig gesetzt werden können.
    wenn ich auf einen radiobutton klicke und z.B. in der OnClick-Methode den anderen RadioButton auf Checked = true setze, dann setzt der erste RadioButton beim Aufruf von Form->Show in der Ereignisbehandlungsroutine meines TrayIcons seine Checked-Property auf true!
    Reihenfolge wie folgt:

    // Click auf Radiobutton ruft:
    void __fastcall SubmitAllAndQuit(TObject *Sender)
    {
         // PCS_NO_ACTION verhindert die Ausführung des folg. Codes
         if( ((TControl*)Sender)->Tag == PCS_NO_ACTION ) return; 
         bool* Restart = new bool;
         *Restart = true;
         TErrorPopup* ErrorPopup = new TErrorPopup(this);
         //hier wird ein neues Dialog-Form angelegt...
         TBeforeRestart* LastWnd = new TBeforeRestart( Restart, this, m_LangObj, 
                                       m_LangObj->GetValue( RES_SAVECHGMSG ));
         //... und hier modal angezeigt
         LastWnd->ShowModal();                                                   
         if( *Restart )
         {
             if( ... ){
    	     ...	
    	 }
    	 else{ // ... + Restart
                 ...
    	     WindowsExit( EWX_REBOOT, TRUE, 0);
                 return;          // wahrscheinlich nicht nötig, aber egal                                  
             }
         }
         // In case of Cancel, *Restart = false
         // Setze jeweils anderen RadioButton auf Checked
         // falls im Dialogfenster Abbrechen gewählt wurde
         if( ProtectionOff->Checked ) ProtectionOn->Checked = true;  
         else ProtectionOff->Checked = true;                         
         delete LastWnd; LastWnd = NULL;
    }
    

    Wenn ich nun anschließend auf mein TrayIcon clicke, passiert folgendes:

    void __fastcall OpenClick(TObject *Sender)
    {
         Application->ShowMainForm = true;
    	// hier sind die 2 RadioButtons noch so, wie sie waren + sein sollen
         Show();
    	// jetzt ist der RadioButton gecheckt, der auch oben angeklickt worden war
    }
    

    Diesen Effekt hat es aber nur, wenn mein Form eh schon sichtbar ist. Wenn die Anwendung minimiert im Systray hockt und ich dann mein OpenClick() aufrufe, passiert das phänomen nicht.
    Hat irgendjemand einen blassen schimmer warum das so ist?

    der oli



  • halt, zurück.

    das problem ist doch ganz anderer natur und hat mit der überschrift höchstens indirekt was zu tun.

    wenn ich den zweiten RadioButton auf Checked=true setze, hat der erste immer noch den Focus, und wie sich durch experimentieren nun gezeigt hat, ist es egal, welche aktion das Form ausführt: solange es im OpenClick() von vorhin etwas tut, ändert sich der radiobutton zurück. wenn ich in OpenClick() alles auskommentiere, dann passiert nix, aber dasselbe ist auch der fall, wenn ich vor OpenClick() z.b. irgendwo auf das form clicke und somit dem radiobutton den focus klaue.

    bleibt eigentlich die frage, warum der RadioButton sich Checked setzt, wenn er noch den focus hat und das Form irgendwas tut...

    der oli



  • Wieso eigentlich in einer GroupBox? Dafür gibt's doch TRadioGroup. Einfacher kann man RadioButtons nicht handhaben.



  • Hallo Oli,

    du schreibst das du in einem OnClick Ereignis eines RadioButton einen anderen RadioButton Checked = true setzt.

    Ich möchte dich darauf hinweisen, das wenn man Checked = true bei einen RadioButton setzt auch der OnClick des gecheckten RadioButtons ausgeführt wird!

    also führt sowas

    void __fastcall TForm1::RadioButton1Click(TObject *Sender)
    {
    	RadioButton2->Checked = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RadioButton2Click(TObject *Sender)
    {
    	RadioButton1->Checked = true;
    }
    

    zu einem unendlichen hin und her schieben des Checked = true.

    evtl. ist das ansatzweise dein Problem.



  • hallo!

    danke für eure antworten, dazu gibt es folgendes:

    @Joe_M:

    Wieso eigentlich in einer GroupBox? Dafür gibt's doch TRadioGroup.

    ich weiß. nur leider ist folgendes bei mir (BCB 5 Professional) der Fall: wenn ich in eine RadioBox RadioButtons einfüge, dann ordnen die sich nicht innerhalb dieser sondern innerhalb des übergeordneten Fensters an (zur Entwicklungszeit). Heißt, bei der kleinsten Verschiebung der Box musst du jeden einzelnen Button verschieben! (wenn man's nicht dynamisch macht, oder weil man einfach zur Entwicklungszeit schon einigermaßen sehen will). das wollte ich umgehen und es geht ja auch.

    @VergissEs:

    Dieses wunderbare Verhalten ist mir schon ziemlich früh aufgefallen, deswegen setze ich auch zu einem bestimmten Zeitpunkt das Tag eines der beiden Buttons auf PCS_NO_ACTION, was ich dann im OnClick abfange und sofort rausspringe. Somit habe ich die Endlosschleife umgangen. Vielleicht gibt's aber noch ne schönere Lösund?

    Das merkwürdige war ja im Endeffekt nun eigentlich das:

    bleibt eigentlich die frage, warum der RadioButton sich Checked setzt, wenn er noch den focus hat und das Form irgendwas tut...

    aber das habe ich jetzt umgangen, indem ich den focus auf ein anderes steuerelement sezte. nur interessant zu wissen wär's schon.

    na dann frohes schaffen,

    der oli



  • der oli schrieb:

    wenn ich in eine RadioBox RadioButtons einfüge, dann ordnen die sich nicht innerhalb dieser sondern innerhalb des übergeordneten Fensters an (zur Entwicklungszeit).

    Dir ist aber klar, dass man RadioButtons in der RadioGroup über die Items-Property der letzeren "erzeugt", nicht durch Plazieren von normalen RadioButtons!? Und diese Items müssen dann auch nicht von Hand verschoben werden.

    Sie können es auch gar nicht, und da liegt ein möglicher Grund, GroupBox+RadioButtons anstelle einer RadioGroup zu verwenden: man hat mehr Einfluss auf die Positionierung der RadioButtons. Prinzipiell einfacher, zumal bei nennenswert vielen RadioButtons, ist aber die RadioGroup.

    nur interessant zu wissen wär's schon.

    Stell doch mal ein Beispiel-Projekt in's Netz, das das entsprechende Problem zeigt. Allein anhand deiner Erklärungen und der Codeausschnitte lässt sich das nicht nachvollziehen.


Anmelden zum Antworten