Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem beom Bewegen der Image. man sieht Streifen (https://www.delphipraxis.net/119435-problem-beom-bewegen-der-image-man-sieht-streifen.html)

thomas2009 26. Aug 2008 15:33


Problem beom Bewegen der Image. man sieht Streifen
 
Hallo
wenn ich eine Image mit der Maus verschiebe, dann glänzt die Image
Delphi-Quellcode:
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;
Gibt es eine Lösung für mein Problem ?
Oder ist es halt so : (

_

DeddyH 26. Aug 2008 15:36

Re: Problem beom Bewegen der Image. man sieht Streifen
 
Schreib mal ins OnCreate des Formulars
Delphi-Quellcode:
DoubleBuffered := true;
Vielleicht hilft's.

thomas2009 26. Aug 2008 15:58

Re: Problem beom Bewegen der Image. man sieht Streifen
 
Es hat leider nicht geholfen : (


_

mr_emre_d 26. Aug 2008 17:46

Re: Problem beom Bewegen der Image. man sieht Streifen
 
Zitat:

Zitat von thomas2009
Hallo
...
Delphi-Quellcode:
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;
...
_

Ich frage mich gerade, ob sich das Bild auch wirklich bewegt :gruebel:

probier es mal mit folgendem Code im Mousemove Event des Forms :
Code:
Image1.Left:=ScreenToClient( Mouse.CursorPos ).X;
Image1.Top:= ScreenToClient( Mouse.CursorPos ).Y;

thomas2009 26. Aug 2008 22:10

Re: Problem beom Bewegen der Image. man sieht Streifen
 
Ja, mein Code funktioniert auch ; )

Blup 27. Aug 2008 10:08

Re: Problem beom Bewegen der Image. man sieht Streifen
 
Zitat:

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

Gandalfus 27. Aug 2008 15:15

Re: Problem beom Bewegen der Image. man sieht Streifen
 
Das könnte dir helfen: http://forum.delphi-treff.de/showthread.php?t=24461 (Die 2 Variante)

Blup 28. Aug 2008 09:17

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.

http://img357.imageshack.us/img357/4...gsfehlegr2.jpg

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.

Gandalfus 28. Aug 2008 14:54

Re: Problem beom Bewegen der Image. man sieht Streifen
 
und wenn man repaint nach jeder verschiebung aufruft?

Blup 29. Aug 2008 11:57

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 14:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz