Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Werte aus StringGrid mit Canvas darstellen (https://www.delphipraxis.net/92005-werte-aus-stringgrid-mit-canvas-darstellen.html)

felix1806 13. Mai 2007 09:35


Werte aus StringGrid mit Canvas darstellen
 
Hallo Delphifreunde!!! ;)

ich habe eine Frage: Kann mir jemand sagen wie man Werte aus einem StringGridFeld als Punkte in einem Image mit Canvas darstellen kann???

Ich programmiere nämlich ein Festgeldberechnungsprogramm: Und um die Punkte mathematisch richtig darzustellen müsste ich auch wissen wie man die Benennung im Image von Punkt [0,0] links oben in [0,0] rechts unten ändern kann bzw das Problem anderweitig umgeht.

Als letztes bräuchte ich noch einen Tip wie man noch die Achsen einzeichnen kann und mit Werten(am besten noch mit denen aus dem StringGrid) versieht.


Also eigentlich wird das Image wie ein Koordinatensystem benutzt und ich habe noch fast keine Erfahrung mit Canvas gemacht...

Vielen Dank !!!
Gruß Felix

:coder:

Apollonius 13. Mai 2007 10:43

Re: Werte aus StringGrid mit Canvas darstellen
 
Das mit dem Koordinatenursprung ändern ist einfach. Die komplizierte Variante: einfach statt x immer image1.width-x schreiben. Für die einfache solltest du dir in der Hilfe mal SetViewportOrgEx anschauen.
Hoffe geholfen zu haben
Apollonius

felix1806 13. Mai 2007 11:03

Re: Werte aus StringGrid mit Canvas darstellen
 
ja danke erstmal aber ich weiss immer noch nicht wie das mit den stringgrid werten im image funktioniert!!!!

SirTwist 13. Mai 2007 11:37

Re: Werte aus StringGrid mit Canvas darstellen
 
Hi Felix,

Du solltest erstmal überlegen, wie Du Deine Daten im Speicher hälst, also Dir eine Datenstruktur überlegen, z.B. ein Array von Records oder ähnliches. Dann kannst Du viel einfacher auf Deine Zahlenwerte zugreifen, als wenn Du über das StringGrid gehen müsstest.

Danach guckst Du Dir mal die Funktionen an, die TCanvas bereitstellt. Grundlegend sind das z.B. MoveTo(x,y) und LineTo(x,y), mit denen Du einzelne Linien zeichnen kannst. Dann gibt es die Eigenschaft Pen, und über die Untereigenschaften Pen.Color, Pen.Width, Pen.Style kannst Du Farbe, Stiftdicke und Muster festlegen.

Dann musst Du Dir zwei Funktionen schreiben, die Deine Zahlenwerte in Koordinaten umwandeln: ScaleX(w) und ScaleY(w). Diese Funktionen hängen von Deinen Zahlenwerten ab. Du musst Dir Gedanken darüber machen, welchen Wertebereich Du darstellen willst. Wenn Du z.B. auf der X-Achse (die von links nach rechts) Datumswerte darstellen willst vom 01.01.2007 bis zum 31.12.2037, wäre die Umrechnung
Delphi-Quellcode:
x := Round(Canvas.Width * datumwswert / (EncodeDate(2037,12,31) - EncodeDate(2007,1,1));
Warum? Du musst die Datumswerte, die ganz links und ganz rechts sein sollen, in eine Zahl umwandeln, mit der Delphi (bzw. Dein Computer) rechnen kann. Das macht EncodeDate(). Dann "skalierst" Du Deinen eigentlichen Datumswert von dem Datumsumfang auf den Pixelumfang Deiner X-Achse.

Normalerweise möchte man links und rechts noch etwas Platz lassen. Also so:
Delphi-Quellcode:
x := 50 + Round((Canvas.Width - 70) * datumwswert / (EncodeDate(2037,12,31) - EncodeDate(2007,1,1));
Da diese Umrechnung sehr häufig passiert, macht es Sinn, einige Werte vorher auszurechnen. Dazu brauchst Du eine globale Variable ScaleFactorX (vom Typ Double), die Du nur einmal berechnest. Bzw. immer dann neu berechnest, wenn sich einer der Werte ändert, also z.B. die Breite des Canvas oder der Datumsbereich:
Delphi-Quellcode:
StartDatum  := EncodeDate(2007, 1, 1);
EndDatum    := EncodeDate(2037, 12, 31);
ScaleFactorX := (Canvas.Width - 70) / (EndDatum - StartDatum);
Danach kannst Du Dir eine Funktion definieren:
Delphi-Quellcode:
function TMain.ScaleX(datum: TDate): Integer;
begin
  result := Round(datum * ScaleFactorX);
end;
Genau das Gleiche musst Du nun für die Y-Achse machen, dann aber mit Deinen Geldbeträgen. Wenn das auch fertig ist, kannst Du so Dein Achsenkreuz zeichnen:
Delphi-Quellcode:
  with Canvas do begin
    MoveTo(ScaleX(StartDatum), ScaleY(KleinsterWert));
    LineTo(ScaleX(EndDatum),  ScaleY(KleinsterWert));
    MoveTo(ScaleX(StartDatum), ScaleY(KleinsterWert));
    LineTo(ScaleX(StartDatum), ScaleY(GroessterWert));
  end;
So. Den Rest erarbeite Dir mal bitte selber :-) Und wenn Du das alles verstanden hast, was da im Hintergrund passiert, guckst Du Dir bitte die TChart-Komponenten an, die machen das alles von alleine :-)

felix1806 13. Mai 2007 18:25

Re: Werte aus StringGrid mit Canvas darstellen
 
vielen dank sir twist!!!

ich muss mir das erst einmal natürlich genau anschauen bevor ich dagen kann dass ich deine ausführliche beschreibung verstanden habe, aber trotzdem schon mal veieln dank für deine bemühungen :-D


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