Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Diagramm zeichnen... (https://www.delphipraxis.net/76831-diagramm-zeichnen.html)

EConvertError 10. Sep 2006 20:16


Diagramm zeichnen...
 
Hallo!

Ich möchte ein Diagramm zeichnen, wie es der Taskmanager von Windows XP (Tab: Netzwerk) hat. Grundsätzlich habe ich an die Verwendung einer TPaintbox in Verbindung mit einem TBitmap im Hintergrund gedacht.
Wie schaffe ich es außerdem, dass sich das Diagramm immer nach links "verschiebt". Klar mit einem Timer, aber wie funktioniert das aus der Sicht der Grafikprogrammierung?
Und wie verändert man die Größe der Kurve, die man da reinzeichnet, wenn man den Maßstab verändern muss?

Vielen Dank,
Andreas

mkinzler 10. Sep 2006 20:19

Re: Diagramm zeichnen...
 
Schau dir mal TChart an.

Nikolas 10. Sep 2006 20:31

Re: Diagramm zeichnen...
 
Was willst du denn Anzeigen? Messwerte oder Funktionen?

arbu man 10. Sep 2006 20:36

Re: Diagramm zeichnen...
 
Wenn du ein Beispiel brauchst bei den JEDI Komponenten ist in der Unit JvSimScope ein solche Komponente, kanst dir ja mal den Source angucken.

EConvertError 11. Sep 2006 19:00

Re: Diagramm zeichnen...
 
Vielen Dank für die Antworten!

Zitat:

Schau dir mal TChart an.
Ich wusste gar nicht, dass TChart so eine "Verschiebung" nach links unterstützt.
In meinem Fall ist das egal, da ich es auf jeden Fall selbst schreiben will. Unter anderem deshalb, weil mir TChart etwas übertrieben dafür scheint.

Zitat:

Was willst du denn Anzeigen? Messwerte oder Funktionen?
Ich möchte meinen Netzwerk-Monitor mit einem Graphen ausstatten. Im Prinzip also genau das gleiche wie im Taskmanager unter Netzwerk. Allerdings will ich absolute Angaben bei der Skala (keine Prozent).

Deshalb bauche ich auch das verändern des Maßstabs, da ich z.B. anfangs die Skala bis 15kb/sec mache. Wenn dann aber jemand ein wesentlich schnelleres Internet/Netzwerk hat, soll das Diagramm auch noch sinnvoll sein.

Zitat:

Wenn du ein Beispiel brauchst bei den JEDI Komponenten ist in der Unit JvSimScope ein solche Komponente, kanst dir ja mal den Source angucken.
Inspiration ist immer gut, danke!

Ich werde mal mein Hauptprobleme bei der Geschichte etwas genauer erläutern:
Das Zeichnen der Punkte und Kurven, bzw. des Rasters ist nicht wirklich ein Problem. Verwendung von TPaintBox, TImage, TBitmap ist mir auch bekannt.
Leider ist es mir ein komplettes Rätsel, wie ich diese Verschiebung nach lins bewerkstelligen soll. Zwei Ideen habe ich:
  • Ein Bitmap immer nach links verschieben. Mit diesem Ansatz komme ich leider nicht weiter.
  • Ein array/eine Liste mit den ganzen Punkten, die ich nach der Reihe zeichne. Wenn ich einen Punkt hinzufüge, lösche ich auch wieder einen aus der Liste. Meine Sorge bei diesem Ansatz ist, dass ich viel Speicher brauche. Da ich jede Sekunde neue Daten hole und somit einen neuen Punkt habe, erhalte ich zum Beispiel, wenn ich die letzen 5 Minuten im Diagramm anzeige: 5*60= 300 Punkte. Klar ist das nicht soooo viel Speicherplatz, aber vielleicht gibt es ja Idealeres.

Vielen Dank,
Andreas

Nikolas 11. Sep 2006 19:28

Re: Diagramm zeichnen...
 
Nimm dir doch ein Array mit so vielen Einträgen, wie du Punkte anzeigen willst. (Sagen wir mal 60). Das schreibst du erst mal voll und benutzt in der ersten Minute noch eine Integer-Variable, an der du ablesen kannst, wie viele Einträge schon gefüllt sind. Nach dem du eine Minute gewartet hast, überschreibst du den ersten Wert mit dem 61. und setzt deine Variable von vorhin auf 2. Daran kannst du dann ablesen, dass zuerst Wert nr.2 gezeichnet werden soll, dann Werte 3 bis 60 und dann der erste. Dann überschreibst du nr. 2 und passt deine Markierung an.
Somit brauchstdu zeitunabhängig nur 60 Speicherplätze für deine Daten.

Das hier könntest du dann einsetzen:
Delphi-Quellcode:
for i:=k to (length+k) do
 memo1.Lines.Add(inttostr(i mod (length+1) ));
Zu Maßstab:
Geh einfach deine Liste durch und suche den höchsten Wert. Wenn der dann durch einen 100Px hohen Balken dargestellt werden soll, errechnest du die Höhen der Balken einfach per IrgendEinMesswert/MaximalerMesswert*100;
Speicher am Besten den Höchsten Wert und überprüf nur wenn ein neuer dazu kommt, das sollte die schnellste Methode sein.


Mein 1000. Post :mrgreen:

EConvertError 11. Sep 2006 19:39

Re: Diagramm zeichnen...
 
Danke!

Dein Ansatz ist der selbe, wie mein zweiter (nur habe ich Liste statt array geschrieben, was aber dann relativ egal ist). Nur zeige ich sicher 300 Punkte auf einmal an und deshalb frage ich mich, ob es da nicht vielleicht etwas Besseres gäbe.
Immerhin hat man dann vielleicht mehrere Netzwerk-Schnittstellen, dann kannst du die 300 Punkte schon mal mit der Anzahl der Schnittstellen multiplizieren.

Dieser Ansatz geht außerdem davon aus, dass ich alles in einer Paintbox zeichne und selbst für die Speicherung der Punkte verantwortlich bin. Seid ihr/bist du der Meinung, dass das die beste Lösung ist, oder wäre eine Lösung mit TImage/TBitmap (wobei ich nicht wüsste, wie :gruebel: ) im Hintergrund unter umständen besser?
Sehe ich das richtig, dass ich um das Speichern aller Punkte nicht herum komme?

Vielen Dank,
Andreas

Nikolas 11. Sep 2006 19:49

Re: Diagramm zeichnen...
 
Mal ein paar Tausend Werte zu speichern wird dich/deinen Computer nicht umbringen. Auch 100000 32bit integer wären nur 4mb (oder so was). Das sollte das kleinste Problem sein. Wenn du nicht alle Werte immer griffbereit hast, wird die Anpassung der Skala problematisch.
Wenn du unbedingt nicht alles speichern willst, könntest du dein Schaubild malen, alle Daten vergessen, dann per Copyrect das Bild etwas nach links verschieben und dann rechts was neues dranmalen. Aber das wäre schlechter Stilund extrem unflexibel.
Ob du in eine Paintbox oder eine Image malst, dürfte recht egal sein, wobei ich noch nicht mit ersterem gearbeitet habe, aber images, haben da bis jetzt wunderbar funktioniert.

EConvertError 12. Sep 2006 19:39

Re: Diagramm zeichnen...
 
:mrgreen: Danke!

Ich habe mir jetzt den Source von TJvSimScope angesehen. Das arbeitet mit:
Delphi-Quellcode:
CopyRect(...)
Das wäre eigentlich eine perfekte Lösung für mich, wenn da nur nicht das Ändern der Skala wäre. Hat da jemand eine Idee, wie ich das dennoch auf diese Art schaffen könnte?
Oder bleibt mir, sofern ich die Skala ändern will, gar keine andere Möglichkeit?


Eine andere Idee wäre auch, dass im Falle einer Änderung der Skala eine neue Skala rechts auftaucht und sich ebenfalls nach links mitbewegt. Was sagt ihr dazu? Würde das gut aussehen? Lieber wäre mir natürlich eine richtige Änderung der Skala, aber wer weiß: Ich bin offen für Alles.

Anmerkung: Denn in Wirklichkeit soll dieses Diagramm zwar schon sinnvoll sein und stimmen, aber eigentlich dient es nur dazu, dem Eye-Candy zu frönen. :mrgreen: :mrgreen:

Vielen Dank,
Andreas

PS: Dass es nicht viel Speicher wäre, habe ich jetzt eingesehen.

Nikolas 12. Sep 2006 20:09

Re: Diagramm zeichnen...
 
Du könntest das kopierte Bild einfach vergrößern/verkleinern, wenn ein neuer Maßstab eingeführt wird. Ich glaube dafür musst du bei Copyrect einfach nur ein kleineres Zielbild als das Ursprungsbild angeben, wenn ich mich nicht irre.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz