TLabel auf TPanel verschieben?



  • Moin Gemeinde,

    wie kann ich ein Label auf einem Panel mit der Mouse verschieben? Habs schon mit BeginDrag / EndDrag versucht, funzt aber nicht?!
    Müssen da bestimmte Einstellungen gemacht werden?
    Hab bei DragKind / DragMode schon alles ausprobiert 😞

    Los gehen solls bei MouseDown, Schluss is bei MouseUp.

    void __fastcall TSDIAppForm::OnLblMouseDown(TObject *Sender,
    	  TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    	Label2->BeginDrag( true );
    }
    

    MouseUp dann mit EndDrag

    grüssle 🙂

    Ach ja - C++Builder 2007 Pro



  • hier mal ne Alternative

    //im Header
    private:
    int MoveX1, MoveY1;
    
    //die Ereignisse der Komponente
    void __fastcall TReportForm::Label1MouseDown(TObject *Sender,
    			TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    MoveX1=X;
    MoveY1=Y;
    }
    
    void __fastcall TReportForm::Label1MouseUp(TObject *Sender, TMouseButton Button,
    			TShiftState Shift, int X, int Y)
    {
    ((TLabel*)Sender)->Left += X-MoveX1;
    ((TLabel*)Sender)->Top += Y-MoveY1;
    }
    


  • Thx, tut sich nur nichts 😞

    Mit der rechten Maustaste bleibt er ab und zu an sehr merkwürdigen Stelle stehen. Aber nicht da, wo er stehen soll?!

    grüssle 🙂

    Edit: TLabel durch TPanel ersezt und schon gehts 👍



  • Hallo Smitty,

    Kannst ja mal anstad MouseUp mit MouseMove versuchen

    void __fastcall TReportForm::Label1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
        if (Shift.Contains(ssLeft))
        {
    	((TLabel*)Sender)->Left = ((TLabel*)Sender)->Left -(X-MoveX1);
    	((TLabel*)Sender)->Top  = ((TLabel*)Sender)->Top -(Y-MoveY1);
        }
    }
    


  • Bitte gewöhn dir vernünftige casts an. Wenn Sender kein TLabel ist gibt es undefiniertes Verhalten. Wenn schon dann so.

    void __fastcall TReportForm::Label1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
    {
        if (Shift.Contains(ssLeft))
        {
            TLabel* lab = dynamic_cast<TLabel*>(Sender);
            if( !lab ) return;
            lab->Left = lab->Left -(X-MoveX1);
            lab->Top  = lab->Top -(Y-MoveY1);
        }
    }
    


  • Guten Morgen,

    da muss ich nochmal nachfragen @Braunstein: wo man auch hinschaut, du scheinst der "cast-Prediger" zu sein. 🙂 Dabei interessiert mich Folgendes: Wenn ich ein kleines Projekt habe und nicht viele Komponenten und eine Methode ist wirklich nur einer Komponente zugeordnet, warum soll ich dann nicht so casten wie es Linnea und cesa gemacht haben? Ich kann mir nicht vorstellen, dass Windows falsche Botschaften sendet, oder?
    Gehst du einfach davon aus, das man einen konsequenten Programmierstil haben sollte, egal ob großes oder kleines Projekt, und um sich vor sich selbst zu schützen immer dieselben Abläufe verwenden sollte?

    MfG



  • Ja, ich halte es für notwendig einen ordentlichen Programmierstil durchzuziehen. Stell dir nur mal vor du schreibst so ein kleines Programm mit diesen C-Casts und dann irgendwann später erweiterst du es. Da kann doch nettes Chaos rauskommen. 🙂
    Ich verstehe sowieso nicht warum man mehrere Programmierstile pflegen sollte. Ich finde die dynamic_cast-Version sogar besser lesbar. Wenn du dir völlig sicher bist, das es immer ein TLabel ist kannst du statt dem dynamic_cast auch einen static_cast nehmen und den Test weglassen. Aber bitte keinen C-Cast. Der castet das Objekt ohne Rücksicht auf Verlste. Außerdem warum mehere casts wenn einer reicht?
    Alternative wenn du ganz sicher bist.

    void __fastcall TReportForm::Label1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
    {
        if (Shift.Contains(ssLeft))
        {
            TLabel* lab = static_cast<TLabel*>(Sender);
            lab->Left = lab->Left -(X-MoveX1);
            lab->Top  = lab->Top -(Y-MoveY1);
        }
    }
    


  • Dankeschön 🙂


Log in to reply