Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verschiebung eines Graphen (https://www.delphipraxis.net/110339-verschiebung-eines-graphen.html)

Nils_13 16. Mär 2008 18:59


Verschiebung eines Graphen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

wenn der Graph den Fensterrand erreicht, soll er verschoben werden, damit man die aktuellen Werte noch sehen kann.
Delphi-Quellcode:
GrpDX := 0;

...

with Grp.Canvas do // Grp = Graph = TBitmap
begin
  MoveTo(GrpX  , GrpY);
  LineTo(GrpX+20, ...));
  GrpX := GrpX+20;
  GrpY := ...;

  if GrpX > frmMain.Width then
    GrpDX := GrpDX-20;
end;
Canvas.Draw(GrpDX, 16, Grp);
In dem Code wird erstmal mit MoveTo Punkt1 festgelegt und mit LineTo die nötige Verbindungslinie zu Punkt2 gezeichnet. GrpX ist der aktuelle X-Wert, GrpY der aktuelle Y-Wert. Also wird GrpX immer um 20 erhöht und auf der Basis des neuen GrpX wieder der nächste Schritt berechnet. Um es zu vereinfachen habe ich die Berechnung von GrpY in dem Codeausschnitt weggelassen.
Nun wird mit der If geschaut, ob der nächste X-Wert schon zu weit draußen liegt. Wenn ja, wird GrpDX um 20 verkleinert. GrpDX ist der X-Wert welcher von Canvas.Draw genutzt wird um das Bitmap Grp zu zeichnen. Ich will also einfach Grp weiter links zeichnen um rechts mehr Platz zu erhalten. Dies funktioniert nicht. Es wiederholt sich sobald der Graph den Fensterrand erreicht hat der Graph immer wieder. Der rote Kasten auf dem Screenshot markiert den sich ständig wiederholenden Bereich.

Mein Fehler muss ein ganz simpler sein. Seht ihr ihn ?

bitsetter 16. Mär 2008 20:30

Re: Verschiebung eines Graphen
 
Hallo,

wen ich es richtig sehe rechnest du erst
Delphi-Quellcode:
GrpX := GrpX+20;
und dann kurz danach wieder
Delphi-Quellcode:
GrpDX := GrpDX-20;
wenn Dx > Breite des Formulars ist. Ist es nicht normalerweise so, dass sich die gessamte Linie nach links bewegen muss, wenn GrpDX den Rand des Formulars überschreitet.

Müsste mann dafür nicht eher eine Liste mit allen Punkten die sich auf dem Graph befinden nehmen. Oder man kopiert ein Teil des Bildes und verschiebt ihn nach links und hängt hinten den nächsten Wert an.


Man könnte ansonsten dafür auch die Komponente TChart nehmen.

Nils_13 17. Mär 2008 18:48

Re: Verschiebung eines Graphen
 
GrpDX ist die Position des Bitmaps. Die erreicht bei einem nach rechts laufenden Graphen den rechten Fensterrand niemals. GrpX ist der X-Wert, welcher den Fensterrand erreichen kann. Ein Graph wird ja immer weiter nach rechts gezeichnet und der X-Wert muss dementsprechend erhöht werden. GrpX wird immer weiter erhöht. Das heißt ich kann den Graphen verschieben wie ich will, der Graph wird außerhalb des Fensters weitergezeichnet und ist deshalb nicht sichtbar.
Delphi-Quellcode:
Flag := True;

...

with Grp.Canvas do
begin
  MoveTo(GrpX , GrpY);
  LineTo(GrpX+20, 62-Round((62/100)*cpu));
  if Flag then
    GrpX := GrpX+20;
  GrpY := 62-Round((62/100)*cpu);
end;
Canvas.Draw(0, 0 , Bmp);

if GrpX > frmMain.Width then
begin
  Flag := False;
  GrpDX := GrpDX-20;
end;
Canvas.Draw(GrpDX, 16, Grp);
Lustigerweise ändert das nichts: Der Graph wiederholt sich am Ende nur noch. Die Wiederholung ist eine andere Geschichte, welche ich erst später lösen möchte. In Wirklichkeit wird der Graph nur an der falschen Position gezeichnet, bloß die Frage warum. Ich hoffe ich konnte es nun noch mal besser erklären, wenn nicht einfach schreien.

bitsetter 17. Mär 2008 20:45

Re: Verschiebung eines Graphen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Unter einen Graph verstehe ich eher sowas, wie in meiner Demo.

So wie du das machst, müsste IMHO dein Bitmap doch immer breiter werden.

Nils_13 17. Mär 2008 21:01

Re: Verschiebung eines Graphen
 
Das Ergebnis sieht schonmal gut aus, aber werde mir den Code natürlich nochmal genauer anschauen, denn das Verständnis ist wichtiger. Danke :)


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