AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Funktionsplotter: Kurve mit Maus flüssig verschieben
Thema durchsuchen
Ansicht
Themen-Optionen

Funktionsplotter: Kurve mit Maus flüssig verschieben

Ein Thema von changlee · begonnen am 28. Aug 2011 · letzter Beitrag vom 30. Aug 2011
Antwort Antwort
changlee
(Gast)

n/a Beiträge
 
#1

Funktionsplotter: Kurve mit Maus flüssig verschieben

  Alt 28. Aug 2011, 12:13
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?
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben

  Alt 28. Aug 2011, 12:21
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.
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#3

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben

  Alt 28. Aug 2011, 12:49
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?
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben

  Alt 28. Aug 2011, 12:55
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
paintbox.canvas.paint({...}); oder BitBlt({...}); im OnPaint-Ereignis der PaintBox.

EDIT: Muss natürlich paintbox.canvas.paint heißen...
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/

Geändert von patti (28. Aug 2011 um 13:00 Uhr)
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#5

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben

  Alt 28. Aug 2011, 13:27
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!

Geändert von changlee (28. Aug 2011 um 13:54 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben

  Alt 28. Aug 2011, 15:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben

  Alt 28. Aug 2011, 16:05
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.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#8

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben

  Alt 28. Aug 2011, 16:15
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.
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#9

AW: Funktionsplotter: Kurve mit Maus flüssig verschieben

  Alt 30. Aug 2011, 14:40
Danke für die vielen Antworten und Tips.

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

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.

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
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:49 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