Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Funktionsplotter: Kurve mit Maus flüssig verschieben (https://www.delphipraxis.net/162540-funktionsplotter-kurve-mit-maus-fluessig-verschieben.html)

changlee 28. Aug 2011 11:13

Funktionsplotter: Kurve mit Maus flüssig verschieben
 
Hallo,

ich habe ein Problem beim verschieben einer Grafik/Kurve auf einem TImage: Das verschieben der Kurve mit der Maus ist nicht "flüssig" sondern es sieht aus als sei die Akualisierungfrequenz des Bildes zu niedrig.
Gibt es eine Möglichkeit das zu verbessern?

Zur Vorgehensweise:
Ich habe ein TImage und ein TBitmap. Bewege ich die Maus mit gedrückter linker Maustaste, soll der Inhalt des Images entsprechend verschoben werden.
  1. OnMouseDown Ereignis löst aus und ich merke mir die Mausposition (MouseDownPoint)
  2. OnMouseMove Ereignis löst aus und ich berechne mir den Verschiebeweg mittels aktueller Mausposition und MouseDownPoint. Dann zeichne ich den neuen Bildausschnitt auf das Bitmap und übernehme es anschließend in Image.Canvas. Am Ende erhält MouseDownPoint die aktuelle Mausposition und ich führe ein Image.Repaint aus.

Ist eine höhrer Frequenz mit diesen Komponenten überhaupt möglich? Oder sollte ich methodisch ganz anders vorgehen?

patti 28. Aug 2011 11:21

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben
 
Zitat:

Zitat von changlee (Beitrag 1119974)
Oder sollte ich methodisch ganz anders vorgehen?

Ja!
Eine TImage-Komponente ist wirklich nur für das Wiedergeben von "statsichen" Bilder gedacht, und nicht geeignet, wenn es darum geht, häufig neu zu zeichnen. Für solche Fälle eignet sich eher eine PaintBox, auf deren Canvas im OnPaint-Ereignis gezeichnet werden kann.

changlee 28. Aug 2011 11:49

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben
 
Danke für den Tip!
Bin gerade dabei das Program auf TPaintbox umzuschreiben.
Soweit ich bisher gelesen habe, muss (oder kann?) man bei TPaintbox direkt auf den Canvas zeichnen und muss (oder braucht?) nicht den Umweg über ein TBitmap gehen.
Hat das nicht auch wieder Performance Nachteile, wenn ich jede einzelne Zeichenaktion direkt im Onpaint Ereignis ausführen muss?
Habe gerade versucht die Grafik per Assign vom separaten Bitmap zu kopieren, aber offensichtlich sind TPaintbox.Canvas und TBitmap.Canvas nicht kompatibel.
Wie bekomme ich die Grafik denn nun in die Paintbox?

patti 28. Aug 2011 11:55

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben
 
Bei einer PaintBox muss du nicht erst auf ein Bitmap im Speicher zeichnen, sondern du kannst direkt auf die Canvas der PaintBox zeichnen. Wenn du dir in diesem Zusammenhang die Eigenschaft "Hier im Forum suchenDoubleBuffered" anschaust, dann kannst du auch ein Flackern der Ausgabe recht gut verhindern.
Ausgeben kannst du dann z.B. per
Delphi-Quellcode:
paintbox.canvas.paint({...});
oder
Delphi-Quellcode:
BitBlt({...});
im OnPaint-Ereignis der PaintBox.

EDIT: Muss natürlich paintbox.canvas.paint heißen...

changlee 28. Aug 2011 12:27

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben
 
Ich habe jetzt auf TPaintbox umgestellt. Allerdings ist das Verschieben immer noch nicht flüssig.
Im OnPaint-Ereignis der Paintbox kopiere ich mit bitblt den Inhalt des bitmaps in die Paintbox.
Im OnMouseMove-Ereignis erstelle ich das bitmap neu und rufe dann paintbox.repaint auf.
Sollte es so schon funktionieren, oder sollte ich direkt in die Paintbox zeichnen?

EDIT:
Habe gerade ein Minimalbeispiel gemacht und dort funktioniert es. Ich werde jetzt erstmal prüfen müssen, wann bzw. wo der Fehler erzeugt wird.
Danke!

Namenloser 28. Aug 2011 14:35

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben
 
Ich würde zunächst mal mit Delphi-Referenz durchsuchenTCanvas.CopyRect oder besser Delphi-Referenz durchsuchenBitBlt den bereits berechneten Teil der Kurve verschieben, und nur den „neuen“ Teil neu berechnen/plotten, statt jedes mal alles zu berechnen.

jfheins 28. Aug 2011 15:05

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben
 
Zitat:

Zitat von changlee (Beitrag 1119982)
Im OnPaint-Ereignis der Paintbox kopiere ich mit bitblt den Inhalt des bitmaps in die Paintbox.
Im OnMouseMove-Ereignis erstelle ich das bitmap neu und rufe dann paintbox.repaint auf.
Sollte es so schon funktionieren, oder sollte ich direkt in die Paintbox zeichnen?

Grundsätzlich gut, aber rufe statt repaint() lieber invalidate() auf.

Jens01 28. Aug 2011 15:15

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben
 
Sowas habe ich vor kurzem erst mit TImage32 und GR32_lines von Graphics32 hergestellt und es ging so wie von Dir anfangs beschrieben sehr gut.

changlee 30. Aug 2011 13:40

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben
 
Danke für die vielen Antworten und Tips.

Nach einigem Aufräumen im Code funktioniert etzt alles einwandfrei.

Zitat:

Zitat von NamenLozer (Beitrag 1119999)
Ich würde zunächst mal mit Delphi-Referenz durchsuchenTCanvas.CopyRect oder besser Delphi-Referenz durchsuchenBitBlt den bereits berechneten Teil der Kurve verschieben, und nur den „neuen“ Teil neu berechnen/plotten, statt jedes mal alles zu berechnen.

Ich mache es der Einfachheit wegen momentan so, dass die gesamte Kurve gezeichnet wird, auch wenn sich dann ein Teil der Kurve außerhalb der Canvas-Fläche befinden und somit nicht sichtbar sind. Von der Performance reicht es bislang aus.

Zitat:

Zitat von jfheins (Beitrag 1120004)
Zitat:

Zitat von changlee (Beitrag 1119982)
Im OnPaint-Ereignis der Paintbox kopiere ich mit bitblt den Inhalt des bitmaps in die Paintbox.
Im OnMouseMove-Ereignis erstelle ich das bitmap neu und rufe dann paintbox.repaint auf.
Sollte es so schon funktionieren, oder sollte ich direkt in die Paintbox zeichnen?

Grundsätzlich gut, aber rufe statt repaint() lieber invalidate() auf.

OK, verwende jetzt invalidate - auch wenn ich den Vorteil mit den Infos aus der Hilfe noch nicht so richtig verstanden habe :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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