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