![]() |
Diagramme in Echzeit zeichnen - "Plots"
Liste der Anhänge anzeigen (Anzahl: 2)
Ich versuche mich momentan daran ein Diagramm in Echtzeit zu zeichnen.
Mein Problem dabei ist, das ist nicht weiß, wie ich die Position setzen soll, wenn das Daten-Array endet. Das Daten-Array hat eine bestimmte Länge. (=Diagrammbreite / pro Wert ein Pixel) Wenn ich das Array auf unendlich laufen lassen, wird alles richtig gezeichnet. Ich steh da momentan auf dem Schlauch :? Vieleicht bin ich auch falsch an die Sache ran gegegangen :gruebel: Hier ist der bisherige Code: |
Re: Diagramme in Echzeit zeichnen - "Plots"
Ich hab Schwachsinn geschrieben. Bitte löschen. *seufz*
:wall: :wall: :wall: http://www.delphipraxis.net/images/a...d1581b2738.jpg |
Re: gelöst! - Diagramme in Echzeit zeichnen - "Plots&am
Ich passe jetzt das Array dynamisch an.
|
Re: gelöst! - Diagramme in Echzeit zeichnen - "Plots&am
Ich hab schon ein parr mal ähnliches geschrieben, in C, VB und Pascal. Dabei hatte ich ein festes Array genommen und über zwei Indizes ("erstes","letztes" Feld mit gültigem Wert) den Bereich im Array markiert der meine aktuellen Werte enthielt.
Immer wenn ein neuer Wert kam wurde "letztes" inkrementiert, sollte es dann das selbe sein wie "erstes" dann wurde zusätzlich auch noch "erstes" inkrementiert. Das heißt das alte Werte im Array überschreiben wurden, also eine Art Ringspeicherung. Der Vorteil dieser Methode ist das man den Maßstab des Diagramms nicht anpassen muss. Die Werte die man überschreibt kann man bei Bedarf in ein anderes Array schreiben und wenn das voll ist ,in ne Datei quetschen. |
Re: gelöst! - Diagramme in Echzeit zeichnen - "Plots&am
ich werde das diagramm mal zu einem späteren Zeitpunkt abändern.
Die Performance ist ja nicht so doll :? |
Re: Diagramme in Echzeit zeichnen - "Plots"
Liste der Anhänge anzeigen (Anzahl: 2)
Für die diejenigen die es interessiert:
Ich habe nun das Flußdiagramm optimiert. |
Re: Diagramme in Echzeit zeichnen - "Plots"
LOL:
Delphi-Quellcode:
Mach dir ein dynamisches Array, das so groß ist, wie das Diagramm Pixel breit. Und dann füllst du es von hinten und zeichnest es von vorne:
{Länge des Arrays festlegen, Laufzeit ca. einen Monat nonStop
bei einer Aktualisierungs-Zeit von 1000ms} SetLength(Data, Month);
Code:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Code:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 |
Code:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 5 |
Code:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 5 | 2 |
Code:
Und wenn du vorne angekommen bist, fängst du wieder an es von hinten zu füllen.
| 0 | 0 | 0 | 0 | 0 | 0 | 3 | 5 | 2 | 4 |
|
Re: Diagramme in Echzeit zeichnen - "Plots"
eigentlich ist der Weg, den ich gewählt habe gar nicht so schlecht, da man die Messdaten ja noch benutzen könnte.
Okay man könnte Sie auch in eine Datei schreiben :wink: mal sehen wie sich das Ganze entwickeln wird. |
Re: Diagramme in Echzeit zeichnen - "Plots"
So:
Delphi-Quellcode:
In dem if-Zweig des OnTimer Ereignisses kannst du es ja dann in eine Datei wegspeichern.
type
TValueArray = array of Cardinal; var ValueArray: TValueArray; implementation {$R *.dfm} procedure PaintGraph(Bmp: TBitmap; Color: TColor; ValueArray: TValueArray); var rect: TRect; i: Integer; len: Integer; begin Bmp.Canvas.Brush.Color := clWhite; rect.Top := 0; rect.Left := 0; rect.Right := Bmp.Width; rect.Bottom := Bmp.Height; Bmp.Canvas.FillRect(rect); len := length(ValueArray); Bmp.Canvas.Pen.Color := Color; for i := 0 to Bmp.Width - 1 do begin Bmp.Canvas.MoveTo(i, Bmp.Height); Bmp.Canvas.LineTo(i, Bmp.Height-ValueArray[len-i-1]); end; end; procedure TForm1.FormCreate(Sender: TObject); begin OffScreenBmp := TBitmap.Create; OffScreenBmp.Width := ClientWidth; OffScreenBmp.Height := ClientHeight; SetLength(ValueArray, ClientWidth); Index := length(ValueArray) - 1; Randomize; Timer1.Interval := 50; DoubleBuffered := True; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(OffScreenBmp); end; procedure TForm1.FormPaint(Sender: TObject); begin BitBlt(Canvas.Handle, 0, 0, ClientWidth, ClientHeight, OffScreenBmp.Canvas.Handle, 0, 0, SRCCOPY); end; procedure TForm1.Timer1Timer(Sender: TObject); var i: Integer; begin ValueArray[Index] := random(ClientHeight); //GetCPUUsage * 10; Dec(Index); if Index = 0 then begin for i := 0 to length(ValueArray) - 1 do ValueArray[i] := 0; PaintGraph(OffScreenBmp, clRed, ValueArray); Repaint; Index := length(ValueArray)-1; end; PaintGraph(OffScreenBmp, clRed, ValueArray); Repaint; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 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