Einzelnen Beitrag anzeigen

SirTwist

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

Re: Werte aus StringGrid mit Canvas darstellen

  Alt 13. Mai 2007, 12: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