![]() |
Problem beom Bewegen der Image. man sieht Streifen
Hallo
wenn ich eine Image mit der Maus verschiebe, dann glänzt die Image
Delphi-Quellcode:
Gibt es eine Lösung für mein Problem ?
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer); begin Image1.Left:=Mouse.CursorPos.X-left - x; Image1.Top:= Mouse.CursorPos.Y-top - y; Oder ist es halt so : ( _ |
Re: Problem beom Bewegen der Image. man sieht Streifen
Schreib mal ins OnCreate des Formulars
Delphi-Quellcode:
Vielleicht hilft's.
DoubleBuffered := true;
|
Re: Problem beom Bewegen der Image. man sieht Streifen
Es hat leider nicht geholfen : (
_ |
Re: Problem beom Bewegen der Image. man sieht Streifen
Zitat:
probier es mal mit folgendem Code im Mousemove Event des Forms :
Code:
Image1.Left:=ScreenToClient( Mouse.CursorPos ).X;
Image1.Top:= ScreenToClient( Mouse.CursorPos ).Y; |
Re: Problem beom Bewegen der Image. man sieht Streifen
Ja, mein Code funktioniert auch ; )
|
Re: Problem beom Bewegen der Image. man sieht Streifen
Zitat:
Hier ein kleines Beispiel, funktioniert auch mit mehreren Controls (bzw. Images).
Delphi-Quellcode:
Edit:
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; 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. ![]() ![]() |
Re: Problem beom Bewegen der Image. man sieht Streifen
Das könnte dir helfen:
![]() |
Re: Problem beom Bewegen der Image. man sieht Streifen
Die Nachricht WM_ERASEBKGND für das TImage abzufangen bringt keine Veränderung.
Fängt man die Nachricht WM_ERASEBKGND für das Parent ab, so ergibt sich zusätzlich dieser Effekt. ![]() ![]() Das Problem wird damit aber nicht beseitigt. Wie eine Darstellung mit offscreen Bitmaps realisiert wird ist mir bekannt. Ich wollte aber eigentlich die Ursache für den Darstellungsfehler mit TImage beseitigen. |
Re: Problem beom Bewegen der Image. man sieht Streifen
und wenn man repaint nach jeder verschiebung aufruft?
|
Re: Problem beom Bewegen der Image. man sieht Streifen
Repaint scheint zu funktionieren, zusätzlich muss danach noch ValidateRect aufgerufen werden, damit der störende Effekt verschwindet.
Delphi-Quellcode:
procedure TFTest.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); var Diff: Integer; ControlPos: TPoint; ControlRect: TRect; begin if (ssLeft in Shift) and (Sender = Selected.Control) then begin ControlPos.X := Selected.Control.Left + X - Selected.Pos.X; ControlPos.Y := Selected.Control.Top + Y - Selected.Pos.Y; {Element im Clientbereich einsperren} with Selected.Control.Parent.ClientRect do begin Diff := Right - (ControlPos.X + Selected.Control.Width); if Diff < 0 then ControlPos.X := ControlPos.X + Diff; Diff := Left - ControlPos.X; if Diff > 0 then ControlPos.X := ControlPos.X + Diff; Diff := Bottom - (ControlPos.Y + Selected.Control.Height); if Diff < 0 then ControlPos.Y := ControlPos.Y + Diff; Diff := Top - ControlPos.Y; if Diff > 0 then ControlPos.Y := ControlPos.Y + Diff; end; with Selected.Control do begin if (Left <> ControlPos.X) or (Top <> ControlPos.Y) then begin SetBounds(ControlPos.X, ControlPos.Y, Width, Height); Repaint; ControlRect := BoundsRect; ValidateRect(Parent.Handle, @ControlRect); end; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz