Zitat von
thomas2009:
Ja, mein Code funktioniert auch ; )
Offensichtlich nicht richtig und wenn das Steuerelement z.B. auf einem Panel liegt funktioniert er garnicht mehr.
Hier ein kleines Beispiel, funktioniert auch mit mehreren Controls (bzw. Images).
Delphi-Quellcode:
var
Selected: record
Control: TControl;
Pos: TPoint; {relative Position an der das Control "angefasst" wurde}
end;
procedure TFTest.ImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
Selected.Control := TControl(Sender);
Selected.Pos.X := X;
Selected.Pos.Y := Y;
{das ausgewählte Steuerelement in den Vordergrund bringen}
Selected.Control.BringToFront;
{Funktion für den Anwender erkennbar machen}
Screen.Cursor := crSizeAll;
end;
end;
procedure TFTest.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
Diff: Integer;
begin
if (ssLeft in Shift) and (Sender = Selected.Control) then
begin
Selected.Control.Left := Selected.Control.Left + X - Selected.Pos.X;
Selected.Control.Top := Selected.Control.Top + Y - Selected.Pos.Y;
{Control im Clientbereich einsperren}
with Selected.Control.Parent.ClientRect do
begin
Diff := Right - Selected.Control.BoundsRect.Right;
if Diff < 0 then
Selected.Control.Left := Selected.Control.Left + Diff;
Diff := Left - Selected.Control.BoundsRect.Left;
if Diff > 0 then
Selected.Control.Left := Selected.Control.Left + Diff;
Diff := Bottom - Selected.Control.BoundsRect.Bottom;
if Diff < 0 then
Selected.Control.Top := Selected.Control.Top + Diff;
Diff := Top - Selected.Control.BoundsRect.Top;
if Diff > 0 then
Selected.Control.Top := Selected.Control.Top + Diff;
end;
end;
end;
procedure TFTest.ImageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and (Sender = Selected.Control) then
begin
Screen.Cursor := crDefault;
Selected.Control := nil;
end;
end;
Edit:
Ich konnte das Problem allerdings nachvollziehen und es lässt sich mit "DoubleBuffered := true;" nicht beseitigen.
Hier eine Montage wie der Effekt aussieht, der fehlerhafte Balken kann an jeder vertikalen Position des bewegten Image erscheinen und verschwindet sofort wieder, sobald die Bewegung endet. Der Fehler ist unabhängig davon ob das Image horizontal oder vertikal bewegt wird.
http://img524.imageshack.us/img524/9...ehlein3.th.jpg