Radio group initialisieren ohne OnClick



  • Hallo Leute

    Ich habe mehrere radio groups auf einem Formular. Diese möchte ich in der FormShow() - Routine initialisieren.
    zum Beispiel so:

    void __fastcall TForm1::FormShow(TObject *Sender)
    {
      rgM21->ItemIndex = 0;
    }
    

    Soweit funktioniert das auch.

    Aber:--- Wie kann ich verhindern, dass für jede radio group das OnClick-Ereignis ausgelöst wird.

    Kann mir wer helfen ??



  • eventuell hilft dir ja dieser Beitrag aus der FAQ, ist zwar für eine CheckBox, aber das sollte sich auch für eine RadioGroup abwandeln lassen



  • Dank Linnea,
    mit einer kleinen Anpassung hat's gleich geklappt.

    Mach dir eine Funktion "MouseIsIn" wie folgt

    bool __fastcall TForm1::MouseIsIn(TWinControl* ctrl)
    {
       POINT p;
       GetCursorPos(&p);
       HWND wnd = WindowFromPoint(p);
       return (wnd==ctrl->Handle);
    }
    

    Dann kannst du in der OnClick-Methode feststellen, ob die CheckBox direkt angeklickt wurde.

    void __fastcall TForm1::CheckBox1Click(TObject *Sender)
    {
      if(MouseIsIn(CheckBox1)) ShowMessage("HALLO");
    }
    

    Wenn man statt der konkreten CheckBox1 den Sender verwendet, lässt sich die Routine auf alle Checkboxes anwenden.
    (Auch sinnvoll, wenn man eine Routine für mehrere Checkboxes nutzen will.)

    void __fastcall TForm1::CheckBoxClick(TObject *Sender)
    {
      if(MouseIsIn((TCheckBox *)Sender)) ShowMessage("HALLO");
    }
    


  • zu früh gefreut, jetzt werden alle Mouseclicks abgeschmettert.



  • Ich vermute, es liegt daran, dass es sich bei dem Fenster, das die radiogroups enthält, um ein ChildWindow handelt.
    Dafür müsste ich wohl folgende Funktion verwenden ??

    HWND ChildWindowFromPoint(          HWND hWndParent,
        POINT Point
    );
    

    Aber wo bekomme ich den Parameter hWndParent her ??



  • Hast du den FAQ-Eintrag bis zum Ende gelesen? Die Maus-Variante ist generell suboptimal, da ja auch mit der Tastatur "geklickt" werden kann.
    Das vorübergehende Disablen des OnClick-Events aus den Newsgroup-Beitrag scheint deutlich praktikabler.



  • Gelesen habe ich es sehr wohl bis zu Ende, aber leider nicht alles verstanden.
    Eine umhüllende Klasse möchte ich nicht definieren, dafür ist in meinem Fall der Aufwand zu komplex.
    Wenn Du mir die folgenden Zeilen erläutern könntest, wäre ich Dir sehr dankbar, das könnte DIE Lösung für mich sein.

    No, but you can unwire the event:

    CurrentOnClick = CheckBox->OnClick;
      CheckBox->OnClick = 0;
      ...
      CheckBox->OnClick = CurrentOnClick;
    


  • Hallo

    Die Events einer Komponente sind auch nur Properties, deren Werte man auslesen, zwischenspeichern und zuweisen kann. Nur das die Werte bei Events eben Methoden sind.
    Die 3 zeilen sagen konkret :
    - Speichere die Methodenadresse des Events OnClick in der Variable CurrentOnClick
    - Setze die Methodenadresse des Events OnClick auf 0, sprich der Event wird keine Methode mehr aufrufen
    (Führe Aktionen aus, während deren die Komponente nicht die ursprüngliche Eventmethode aufrufen soll)
    - Kopiere die Methodenadresse zurück in den Event, um die Methode wieder bei folgenden Events aufzurufen.

    bis bald
    akari



  • Wie muss ich denn dann die Variable

    CurrentOnClick

    definieren ??



  • deine RadioGroup hat doch eine OnClick-Funktion z.B. OnRadioGroup1Click
    und die mußt du einfach nur mal "ausschalten"

    RadioGroup1->OnClick = 0; //ausschalten
    RadioGroup1->ItemIndex = 0;  //Wert setzen
    RadioGroup1->OnClick = OnRadioGroup1Click; //wieder anschalten
    

    für eine dydnamische Variante kannst du den Wert von OnClick natürlich wie in dem Beispiel zwischenspeichern (CurrentOnClick)

    [Edit]

    Classes::TNotifyEvent CurrentOnClick = RadioGroup1->OnClick ;
    


  • Besten Dank;
    Funktioniert -- priemstens--
    Und nicht nur das, ich habe auch verstanden, was ich tue 👍


Anmelden zum Antworten