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 ausprobiertLos 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