Dynamisch erzeugtes TPanel verweigert onDblClick wenn onClick existiert



  • Beim DuobleClick wird zuerst das OnClick-Ereigniss ausgelöst und hinterher das OnDblClick (gerade ausprobiert). Dies ist aber nicht nur bei TPanel so, sondern z.B. auch bei einem TEdit.
    @Windoof
    Worin siehst Du denn den grundsätzlichen Unterschied zwischen einem "dynamisch" erzeugten TPanel und einem "nicht dynamisch" erzeugtem ?



  • Ich nicht, aber deshabl frage ich:

    Titel schrieb:

    Dynamisch erzeugtes TPanel verweigert onDblClick wenn onClick existiert

    Ist das nicht logisch, dass wenn man klickt, dass dann onClick aufgerufen wird? - und wenn man eben doppelklickt, dann nochmal extra onDblClick? Tipp: Werte nur OnClick aus, und setz einen Timer, wenn nach dem Timer nicht nochmal geklickt wird, wird halt onClick2 aufgerufen, und wenn doch, eben onDblClick.



  • Windoof schrieb:

    Tipp: Werte nur OnClick aus, und setz einen Timer, wenn nach dem Timer nicht nochmal geklickt wird, wird halt onClick2 aufgerufen, und wenn doch, eben onDblClick.

    Wer macht den sowas?

    Wenn man eine kurze Verzögerung für die Ausführung von OnClick in Kauf
    nehmen kann, so könnte man es auch wie folgt machen:

    Setze eine bool Variable unter privat: der Form-Klasse
    (im Beispiel wäre es bool DoppelKlick)

    void __fastcall TForm1::Panel1Click(TObject *Sender)
    {
            //für Klick und DoppelKlick
            if (!DoppelKlick) {
                    DWORD idle = GetTickCount()+300;
                    while (GetTickCount()<idle) {     //300ms warten
                            Application->ProcessMessages(); //und Messages bearbeiten
                    }
            }
            if (!DoppelKlick) {
                    ShowMessage("OnClick"); // Test
                    //Anweisung für Einzelklick
            } else {
                    DoppelKlick = false;
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Panel1DblClick(TObject *Sender)
    {
            Form1->DoppelKlick = true;
            ShowMessage("OnDblClick"); //Test
            //Anweisung für DoppelKlick
    
    }
    

    Die Verzögerung könnte man auch höhr setzten, wenn man dem Anwender mehr
    Zeit lassen möchte für den zweiten Klick.



  • Nö! Das funzt nicht! Du setzt voraus, dass er OnDblClick ausführt. Tut er aber nicht! Er führt bei einem Doppelklick zweimal OnClick aus und finito.
    Wenn ich jedoch das Panel zur design-time plaziere, macht er den mist nicht!
    Hier mal etwas Code zum ausbeißen:

    TPanel *p = new TPanel(this);
    p->Color = clRed;
    p->BevelInner = bvNone;
    p->BevelOuter = bvRaised;
    p->BorderStyle = bsNone;
    p->OnClick = PanelClick;
    p->OnDblClick = PanelDblClick;
    p->Parent = this;
    p->Visible = true;
    


  • Hmmmm 😕

    bei mir funktioniert es prima.
    Geht der DK nur beim Panel nicht oder auch bei anderen Kompos in
    deinem Formular?

    vieleicht fehlt die Eigenschaft csDoubleClicks im ControlStyle,
    füge das mal zu:

    p->ControlStyle << csDoubleClicks;
    


  • Wie sieht denn deine Ereignisroutine bei OnClick aus ? Wenn du nämlich in der Ereignisroutine den Fokus abgibst (z.B. durch Showmessage), dann geht der Doppelklick nicht.
    Ansonsten funzt es. Hier mal, wie ich das getestet hab:

    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      TPanel *p = new TPanel(this);
      p->Color = clRed;
      p->BevelInner = bvNone;
      p->BevelOuter = bvRaised;
      p->BorderStyle = bsNone;
      p->OnClick = PanelClick;
      p->OnDblClick = PanelDblClick;
      p->Parent = this;
      p->Visible = true;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::PanelClick(TObject *Sender)
    {
      static int c=0;
      Caption ="Click "+IntToStr(++c);
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::PanelDblClick(TObject *Sender)
    {
      ShowMessage("DblClick");
    }
    


  • DennisB schrieb:

    ...
    Wenn ich jedoch das Panel zur design-time plaziere, macht er den mist nicht!
    ...

    @Burkhi
    An dem Focus liegt es nicht, sonst würde es bei einem Entwurfzeit-Panel auch
    nicht gehen, ich gehe davon aus das bei dem dynamisch Erstellten, aus welchen
    Grund auch immer, csDoubleClicks nicht standard mässig gesetzt wird, wie ich
    es oben schon erwähnte.



  • Dann hätte es bei mir ja auch nicht funktioniert 😉



  • Moin! Danke für die Hilfe! Es lag am csDoubleClicks!
    Jetzt funzt alles 🙂



  • Hattest du denn am ControlStyle deines Panels "herumgespielt"? Standardmässig ist csDoubleClicks doch gesetzt, auch bei dynamisch erzeugten Panels.


Anmelden zum Antworten