CheckBox und SendMessage



  • 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