Zitat:
SetCapture(TWinControl(Sender).Handle);
TImage, TLabel, TShape usw. sind keine "eigentständigen" Window-Controls. (TStaticText ist seitens Windows das eigentlich "TLabel")
Diese haben kein eigenes
Handle (HWND und vorallem kein eigenes Canvas) und sie zeichnen sich direkt auf ihrem Parent, wo sie sich sich "hinterhältig" reingehäckt haben.
Sooooo, und beim Debuggen, was mal am wirklich lernen sollte, wäre dir aufgefallen, dass dieses TImage kein TWinControl ist und somit der Code in OnMouseDown garnicht ausgeführt wird.
> Denn die Genannten sind alles Nachfahren von TGraphicControl
[edit]
Versuch es mal so:
Delphi-Quellcode:
procedure TForm1.ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if chkPositionRunTime.Checked then
begin
inReposition := True;
GetCursorPos(oldPos);
if Sender is TWinControl then
SetCapture(TWinControl(Sender).Handle);
end;
end;
Und was im OnMouseMove geändert werden muß, weiß ich jetzt nicht direkt, aber tausch dort mal das TWinControl gegen ein TControl aus und schau was von dem code dann nicht mehr geht.
PS: Vorallem als Anfänger würde ich dir empfehlen lieber weiche Castes/Konvertierungen wie
(Sender as TWinControl)
zu verwenden, anstatt den harten Castes ala
TWinControl(Sender)
.
Diese lassen sich problemlos austauschen, aber bei den harten Casts ist keine automatisch Typprüfung vorhanden.
Im ControlMouseDown wurde zwar vorher via
IS geprüft, aber im ControlMouseMove würde es nun womöglich "ungeprüft" knallen (eine
Exception), nach meinen Änderungen im ControlMouseDown.