CheckBox und SendMessage



  • Ich denke, das war soweit klar. 😉
    Interessant wäre, warum das Ereignis nicht ausgelöst werden soll.



  • Vielleicht solltest du das OnClick Ereignis ganz einfach nur mittels einer globalen / Formularklassen - Variablen "ausschalten". (sprich if(...) return;) fertig.



  • @ Jansen

    Ich denke nicht das es von wichtigkeit ist, warum das Ereignis nicht ausgelöst werden soll. Ist ja wohl echt Nebensache oder nicht? 😮

    @ Dasd

    Es ist ja nicht so das ich das OnClick Ereignis nicht brauche.
    Es geht mir eigentlich nur darum das, wenn ich einen Haken per Programm setze nicht das OnClick Ereignis ausgeführt werden soll. Und das tut es nun dummerweise wenn ich

    CheckBox1->Checked = true;
    

    schreibe. Mit der SendMessage Methode sollte das doch wohl eigentlich Möglich sein. Es wäre ja echt dumm wenn es nicht gehen würde.

    😕



  • Der Vorschlag von Dasd ist doch soweit OK. Erfinde eine boolsche Variable in deiner Form (wenn true wird OnClick ausgeführt). Setze sie kurz vor Veränderung deiner Checked Eigenschaft auf false und dann gleich wieder true;
    Du kannst auch den OnClick Event deiner Checkbox kurzfristig aushängen (auf NULL setzen). Das würde auch gehen, obwohl es für meine Begriffe etwas brutal wirkt.



  • ratfury schrieb:

    Ich denke nicht das es von wichtigkeit ist, warum das Ereignis nicht ausgelöst werden soll.

    Diesbezügliche Informationen würden es uns ggf. erlauben, einen komplett anderen Lösungansatz vorzuschlagen.

    Braunstein:
    Super Vorschlag, scheint so, als ob wenigstens du die besagten Alternativen aus dem FAQ-Beitrag studiert hättest? 😉



  • Sorry Jansen,
    ich hatte jetzt nicht in die FAQ geschaut. Das nächste mal mach ich es und verweise direkt drauf. 😉



  • Ich finde Braunsteins Methode ziemlich uncool. Scheint aber so, als ob ich es so machen müsste.
    Blöd.
    Wozu ist denn dann die SendMessage Methode da??

    @Jansen :p



  • Braunstein schrieb:

    Das nächste mal mach ich es und verweise direkt drauf.

    Hatte ich hier ja bereits zweimal getan, offensichtlich ohne Erfolg.

    ratfury schrieb:

    Wozu ist denn dann die SendMessage Methode da?

    SendMessage ist WinAPI, TCheckBox ist VCL.
    Es gibt sicher auch eine reine WinAPI-Variante, um allein den "grafischen" Zustand der CheckBox auszulesen, die TCheckBox-Klasse (die ja ein Wrapper um das entsprechende Windows-Control ist) bietet so eine Möglichkeit aber nicht.



  • Das ganze kann man auch ohne SendMessage bewerkstelligen :

    TNotifyEvent NotifyEvent=CheckBox->OnClick ; // Event sichern
    CheckBox->OnClick=0 ; // Event auf 0 setzen
    CheckBox->Checked=true ; 
    CheckBox->OnClick=NotifyEvent ; // Event wieder setzen
    


  • Super, case, jetz haben wir diese Lösung zum vierten Mal in diesem Thread.
    Vielen Danke für's Mitlesen.



  • Das hat den Nachteil, dass ein echter Klick, der zum falschen Moment kommt verloren geht.

    Es geht aber auch einfacher und sicherer:

    Du nimmst einfach das OnMouseUp Event und togglest darin die Checked Eigenschaft. Das OnClick Event läßt du leer.



  • Wenn ich ratfury richtig verstanden habe soll unter gewissen Umständen durchaus das OnClick-Event ausgelöst werden.

    Ansonsten siehe auch den FAQ-Thread, Stichwort 'Leertaste'.



  • Wenn ich ratfury richtig verstanden habe soll unter gewissen Umständen durchaus das OnClick-Event ausgelöst werden.

    Na klar, dann setzt er seinen Code dafür eben in das OnMouseUp Event.



  • Die Leertaste nicht vergessen.

    Statt dieses Geeiers ist es doch aber viel sinnvoller, die von dasd erwähnte zusätzliche Variable abzufragen. Die Tag-Property schreit ja geradezu danach, hier verwendet zu werden.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      CheckBox1->Tag = 1;
      CheckBox1->Checked ^= 1; // das programmatische Umschalten
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::CheckBox1Click(TObject *Sender)
    {
      if (CheckBox1->Tag)   // nicht vom User direkt gesetzt,
        CheckBox1->Tag = 0; // also nichts tun
      else
      {
        Beep();
        // der normale OnClick-Code
      }
    }
    


  • Hallo,

    Das führt aber dazu, das der erste Klick nach einem manuellen setzen immer ins Leere geht. Lieber gleich den Tag zurücksetzen.



  • Braunstein schrieb:

    Das führt aber dazu, das der erste Klick nach einem manuellen setzen immer ins Leere geht.

    Mit "manuell" meinst du per Code, im Beispiel also per Button?
    Kann ich nicht nachvollziehen. Nach dem "manuellen" Setzen wird Tag doch zurückgesetzt!?



  • ok hast ja recht 😉


Anmelden zum Antworten