Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 27. Aug 2008, 10:08
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
  Mit Zitat antworten Zitat