Ich habe Dir mal etwas aus meiner Komponente für eine elektronische Pinnwand rauskopiert - um Dir nicht die Arbeit abzunehmen, musst Du den Weg selber finden. Programmieren ist oft auch Kopfzerbrechen...
Delphi-Quellcode:
private
FDownX,
FDownY: integer;
FDragging: Boolean;
procedure TPinItem.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
BringToFront;
if (ssDouble in Shift) then Exit; // Doppelklick abfangen
if (Button = mbLeft) then
begin
FDownX := X;
FDownY := Y;
FDragging := True;
MouseCapture := True;
end;
end;
procedure TPinItem.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
pw: Integer;
begin
if (Button = mbLeft) and FDragging then
begin
FDragging := False;
MouseCapture := False;
if (Left < 0) then Left := 0;
if (Top < 0) then Top := 0;
pw := Parent.Width - Width - 4;
if (Left > pw) then Left := pw;
end;
end;
procedure TPinItem.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
if FDragging then
begin
Left := X - FDownX + Left;
Top := Y - FDownY + Top;
end;
end;
Daniel hat natürlich Recht, bei der vorher genannten Methode wird einem das Zepter quasi aus der Hand genommen, deshalb habe ich damals auch diese Methode mit Erfolg angewendet.