AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Einfache Graphen zeichnen
Thema durchsuchen
Ansicht
Themen-Optionen

Einfache Graphen zeichnen

Ein Thema von xZise · begonnen am 28. Nov 2008 · letzter Beitrag vom 7. Dez 2008
Antwort Antwort
Benutzerbild von xZise
xZise
Registriert seit: 3. Mär 2006
Hallo ihr,
nun lag dieser Thread ziemlich lange brach, aber ich habe mich heute mal dran gesetzt und sie vervollständigt.

An sich ist diese Unit einfach zu verwenden:
  • Zuerst obligatorisches wie erstellen, zerstören, setzen von Breite, Höhe, Parent
  • Nun kann man die verschiedenen Eigenschaften setzen:
    • Das Intervall (sofern nicht manuell der Graph neue Werte bekommt)
    • Ein Ereignis welches bei jedem Intervall ausgelöst wird (sofern nicht manuell der Graph neue Werte bekommt)
    • Der Abstand zweier Gitterlinien zueinander
    • Eine Graphfarbe
    • Eine Netzfarbe
    • Eine Hintergrundfarbe
    • Eine Balkenfarbe
    • Eine Basislinie (s.u.)
    • Und irgendwann sollte man es starten (sofern nicht manuell der Graph neue Werte bekommt )

Nun habe ich mehrmals folgendes erwähnt:
Zitat:
(sofern nicht manuell der Graph neue Werte bekommt)
Ich meine damit, dass es drei Modi gibt:
  • Angehalten
  • Manuell
  • Automatisch
Der Automatische Modus lässt intern einen Timer laufen, nachdem ein neuer Wert eingetragen werden soll. Dabei wird das Ereignis "OnInterval" aufgerufen, mit dem zweiten Parameter "NewValue". In diesem Parameter kann man nun den neuen Wert angeben.

Beim manuellen Modus muss dabei die Anwendung ".NextStep()" aufrufen, bei welchen ein Parameter übergeben wird, wie groß der neue Wert ist.

Nun ein Wort zur Basislinie:
Die Basislinie ist sozusagen die x-Achse: Dort haben die y-Werte alle 0. Nun kann man mit der Eigenschaft „Baseline“ bestimmen, wie hoch sie über der unteren Kante liegt. Natürlich nur im unskalierten Zustand.

Geraden/Balken:
Um Vergleiche zu ermöglichen habe ich eine Möglichkeit eingebaut eine Gerade anzugeben. Diese Gerade ist entweder horizontal oder vertikal und deren Y- bzw. X-Koordinate wird in jeweils einer IntegerList gespeichert. Da nun der Graph passend in der Vertikalen skaliert wird, werden die Horizontalen Balken in der Höhe skaliert. Leider ist das Feature relativ neu, sodass die horizontalen Gerade in der Grafik leider nicht so einfach zu handhaben sind. Aber die vertikalen gehen.

Wo wir gerade dabei sind: Einfach mit der linken (= horizontal)/rechten (=vertikal) Maustaste auf die Zeichenfläche klicken und schon sind sie da.

Zusätzlich habe ich noch eine kleine Demonstration angehangen.

So sieht das erstellen dynamisch dann aus:
Delphi-Quellcode:
FGraph := TGraph.Create(self);
FGraph.Width := 500;
FGraph.Height := 200;
FGraph.Parent := self;
FGraph.MaxOffset := 10;
FGraph.Interval := 100;
FGraph.OnInterval := OnInterval;
FGraph.GraphColor := clRed;
FGraph.GridColor := clBlue;
FGraph.BackgroundColor := clBlack;
FGraph.BarColor := clGreen;
FGraph.BaseLine := 0;
MfG
xZise
Angehängte Dateien
Dateityp: zip graph_151.zip (216,7 KB, 120x aufgerufen)
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
 
Benutzerbild von sx2008
sx2008

 
Delphi 2007 Professional
 
#2
  Alt 28. Nov 2008, 23:38
Nicht schlecht!!
Wenn du die Methoden DrawGrid, DrawGraph und DrawBars so änderst, dass sie ein TCanvas-Objekt übergeben bekommen:
Delphi-Quellcode:
procedure DrawGrid(ACanvas:TCanvas);
procedure DrawGraph(ACanvas:TCanvas);
procedure DrawBars(ACanvas:TCanvas);
dann sparst du noch etwas Zeit weil dann nicht immer FGraphBit.Canvas ausgewertet werden muss.
Zusätzlich sieht es auch im Sourcecode besser aus.

Als Anregung hätte ich noch, dass der Graph optional auch "gefüllt" gezeichnet werden könnte.
Siehe Anhang.
Miniaturansicht angehängter Grafiken
multigraph_169.gif  
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#3
  Alt 29. Nov 2008, 09:50
Danke
Die Option hatte ich auch vor zu implementieren. Aber da muss ich nochmal gucken, da es bis zur Nullline gefüllt sein kann, oder ganz runter.

Dürfte aber (zumindest ersteres) nicht so schwer werden.

MfG
xZise
Fabian
  Mit Zitat antworten Zitat
Florian H

 
Delphi 6 Professional
 
#4
  Alt 3. Dez 2008, 20:56
Bei mir flimmerts und die waagrechten Markierungsstriche (-> Linke Maustaste) kommen am völlig falschen Fleck und entgegengesetzt zur Mausbewegung (Maus weiter nach unten: Linie weiter oben)...
Florian Heft
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#5
  Alt 5. Dez 2008, 00:01
Zitat von Florian H:
Bei mir flimmerts
Darüber kann ich nichts genaueres sagen.

Zitat von Florian H:
die waagrechten Markierungsstriche (-> Linke Maustaste) kommen am völlig falschen Fleck und entgegengesetzt zur Mausbewegung (Maus weiter nach unten: Linie weiter oben)...
Zitat von xZise:
Leider ist das Feature relativ neu, sodass die horizontalen Gerade in der Grafik leider nicht so einfach zu handhaben sind. Aber die vertikalen gehen.
Weil ich muss die Y-Koordinate irgendwie in einen Wert auf der Kurve umwandeln. Wie genau ich das mache, überlege ich noch.

MfG
xZise
Fabian
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms

 
Delphi XE Professional
 
#6
  Alt 5. Dez 2008, 08:36
Hallo

Bei mir flickert es auch. DoubleBuffered := True reduziert das Flickern schon mal.
Zudem könnte bei Verwendung von BitBlt() das Flickern weiter reduziert werden.

PS: Es gibt noch einen Memory Leak: FHorizontalBars und FVerticalBars werden nicht freigegeben.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#7
  Alt 7. Dez 2008, 15:17
Wo würdest du den BitBtl einsetzen?

MfG
xZise
Fabian
  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 21:04 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