AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Werte aus StringGrid mit Canvas darstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Werte aus StringGrid mit Canvas darstellen

Ein Thema von felix1806 · begonnen am 13. Mai 2007 · letzter Beitrag vom 13. Mai 2007
Antwort Antwort
SirTwist

Registriert seit: 28. Sep 2006
198 Beiträge
 
Delphi XE Professional
 
#1

Re: Werte aus StringGrid mit Canvas darstellen

  Alt 13. Mai 2007, 11:37
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
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:
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
  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 15:37 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