AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem beom Bewegen der Image. man sieht Streifen
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beom Bewegen der Image. man sieht Streifen

Ein Thema von thomas2009 · begonnen am 26. Aug 2008 · letzter Beitrag vom 3. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
thomas2009
(Gast)

n/a Beiträge
 
#1

Problem beom Bewegen der Image. man sieht Streifen

  Alt 26. Aug 2008, 16:33
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 : (

_
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#2

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 26. Aug 2008, 16:36
Schreib mal ins OnCreate des FormularsDoubleBuffered := true; Vielleicht hilft's.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#3

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 26. Aug 2008, 16:58
Es hat leider nicht geholfen : (


_
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#4

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 26. Aug 2008, 18:46
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

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

n/a Beiträge
 
#5

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 26. Aug 2008, 23:10
Ja, mein Code funktioniert auch ; )
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#6

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 27. Aug 2008, 11: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
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 27. Aug 2008, 16:15
Das könnte dir helfen: http://forum.delphi-treff.de/showthread.php?t=24461 (Die 2 Variante)
Besucht doch mal meine Homepage
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#8

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 28. Aug 2008, 10:17
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.
  Mit Zitat antworten Zitat
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 28. Aug 2008, 15:54
und wenn man repaint nach jeder verschiebung aufruft?
Besucht doch mal meine Homepage
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#10

Re: Problem beom Bewegen der Image. man sieht Streifen

  Alt 29. Aug 2008, 12:57
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 Uhr.
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