![]() |
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 |
Re: Diagramm zeichnen...
Schau dir mal TChart an.
|
Re: Diagramm zeichnen...
Was willst du denn Anzeigen? Messwerte oder Funktionen?
|
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.
|
Re: Diagramm zeichnen...
Vielen Dank für die Antworten!
Zitat:
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:
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:
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:
Vielen Dank, Andreas |
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:
Zu Maßstab:
for i:=k to (length+k) do
memo1.Lines.Add(inttostr(i mod (length+1) )); 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: |
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 |
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. |
Re: Diagramm zeichnen...
:mrgreen: Danke!
Ich habe mir jetzt den Source von TJvSimScope angesehen. Das arbeitet mit:
Delphi-Quellcode:
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?
CopyRect(...)
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. |
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. |
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