![]() |
festgeldentwicklung mit canvas als Graph darstellen
Hallo,
wenn es jemanden interessiert, kann mir bitte dabei helfen eine festgeldentwicklung mit canvas als Graph darszutellen... Ich bin Delphianfänger und benötige den Quelltext, habe aber leider trotz tagelanger Arbeit in Tutorials keine Lösung für das Problem gefunden. Ich habe von vielne Leuten Tipps bekommen, die verstehe ich aber nicht, weil si nicht meinem Wissensstand entsprechen. Hier sit meine bisheriger Quelltext:
Delphi-Quellcode:
hier der Code von einem freundliche Helfer ,den ich aber bis jetzt nicht verstehen kann.... unit Unit24;
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Grids, ExtCtrls; type TForm1 = class(TForm) BitBtn1: TBitBtn; GroupBox1: TGroupBox; EdSparbetrag: TEdit; EdFestzins: TEdit; EdMindestlaufzeit: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.BitBtn1Click(Sender: TObject); var i,Mindestlaufzeit:Integer; Festzins,Zinsen,Ende,Anfang:Real; begin Anfang:=StrToFloat(EdSparbetrag.Text); Festzins:=StrToFloat(EdFestzins.Text)/100; Mindestlaufzeit:=StrToInt(EdMindestlaufzeit.Text); StringGrid1.RowCount:=Mindestlaufzeit+1; for i:=1 to Mindestlaufzeit do with StringGrid1 do begin Cells[0,i]:=IntToStr(i); Cells[1,i]:=FloatToStrF(Anfang,ffFixed,10,3); Zinsen:=Anfang*Festzins; Cells[2,i]:=FloatToStrF(Zinsen,ffFixed,10,3); Ende:=Anfang+Zinsen; Cells[3,i]:=FloatToStrF(Ende,ffFixed,10,3); Anfang:=Ende; end; end; procedure TForm1.FormCreate(Sender: TObject); begin with StringGrid1 do begin Cells[0,0]:='Jahr'; Cells[1,0]:='Anfang'; Cells[2,0]:='Zinsen'; Cells[3,0]:='Ende'; end; end; procedure Einspeichern; begin end; end.
Delphi-Quellcode:
ich weiss jetzt nicht wie ich die werte in ein Image als graph bekomme und bin auch trotz massiven Einarbeitens nicht weitergekommen Vielen Dank für eure Hilfe Gruß Felix
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, Buttons, contnrs ; type TZinsen = class private FJahr: integer; FAnfang: double; FZinsen: double; function GetEnde: double; public property Jahr : integer read FJahr write FJahr ; property Anfang : double read FAnfang write FAnfang ; property Zinsen : double read FZinsen write FZinsen ; property Ende : double read GetEnde ; end; TForm1 = class(TForm) BitBtn1: TBitBtn; edSparbetrag: TEdit; edFestzins: TEdit; edMindestLaufzeit: TEdit; StringGrid1: TStringGrid; GroupBox1: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; procedure FormCreate(Sender: TObject); procedure BitBtn1Click(Sender: TObject); private procedure ShowListe(Liste: TObjectList); { Private declarations } public { Public declarations } ZinsListe : TObjectList ; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.BitBtn1Click(Sender: TObject); var i,Mindestlaufzeit:Integer; Festzins, Anfang:Double; Zins : TZinsen ; begin // Eingaben aus Feldern lesen Anfang:=StrToFloat(EdSparbetrag.Text); Festzins:=StrToFloat(EdFestzins.Text)/100; Mindestlaufzeit:=StrToInt(EdMindestlaufzeit.Text); // ObjectList füllen ZinsListe.Clear ; for i:=1 to Mindestlaufzeit do begin Zins := TZinsen.Create ; Zins.Jahr := i ; Zins.Anfang := Anfang ; Zins.Zinsen := Anfang * Festzins ; // Zins.Ende braucht nicht gesetzt zu werden, da dies sehr leicht // aus Anfang und Zinsen berechnet werden kann // dafür gibts in TZinsen die ReadOnly Eigenschaft Ende, die im Grunde eine Funktion aufruft // somit stellst du sicher, dass der Inhalt konsistent bleibt. Denn wann immer // du Anfang oder Zinsen veränderst, so wird Ende automatisch beim nächsten Lesen // korrekt neu berechnet // Ab damit in die Liste ZinsListe.Add(Zins) ; Anfang := Zins.Ende ; end; // Damit wäre alles berechnet... Fehlt noch die Darstellung ShowListe (Zinsliste) ; end; procedure TForm1.ShowListe (Liste : TObjectList) ; var i: Integer; Zins : TZinsen ; begin Stringgrid1.ColCount := 4 ; StringGrid1.RowCount := 1 + Liste.Count ; StringGrid1.cells[0,0] := 'Jahr' ; StringGrid1.cells[1,0] := 'Anfang' ; StringGrid1.cells[2,0] := 'Zinsen' ; StringGrid1.cells[3,0] := 'Ende' ; for i := 0 to Liste.Count - 1 do begin // der Listenindex beginnt bei 0 !!! if Liste[i] is TZinsen then begin Zins := Liste[i] as TZinsen ; StringGrid1.cells[0,i+1] := format ('%d',[Zins.Jahr]) ; StringGrid1.cells[1,i+1] := format ('%.2m',[Zins.Anfang]) ; StringGrid1.cells[2,i+1] := format ('%.2m',[Zins.Zinsen]) ; StringGrid1.cells[3,i+1] := format ('%.2m',[Zins.Ende]) ; end else raise exception.Create ('Ungültiges Objekt in Objektliste.') ; end; StringGrid1.FixedCols := 0 ; StringGrid1.FixedRows := 1 ; end; procedure TForm1.FormCreate(Sender: TObject); begin ZinsListe := TObjectList.Create ; end; { TZinsen } function TZinsen.GetEnde: double; begin Result := Anfang + Zinsen ; end; end. |
Re: festgeldentwicklung mit canvas als Graph darstellen
Der freundliche Helfer war wohl ich :mrgreen: Deshalb mach ich dann mal hier weiter:
Muss es zwingend über Canvas sein, denn sonst würde sich eventuell eine Chart-Komponente anbieten, wie z.B. TChart, die bei Delphi dabei ist. Wenns unbedingt über Canvas sein muss, so kannst Du eine TImage nehmen, die ein Canvas als Eigenschaft. Und mit dem kannst du dann zeichnen wie es dir beliebt. Delphi bietet genügend Zeichenroutinen dafür. |
Re: festgeldentwicklung mit canvas als Graph darstellen
eigentlich muss es nicht sein(mir wurd es nur empfohlen)
|
Re: festgeldentwicklung mit canvas als Graph darstellen
am besten nimmst du ein image, da kannst du die x-achse in deinem gewählten abstand eintragen und anschließend die y-koordinate für den betrag berechnen und abtragen bzw. mit dem vorhergehenden punkt verbinden! beim image reicht da moveto (startpunkt) und lineto (endpunkt). zwischen den koordinaten wird dann ein strich gezogen und eine art diagramm entsteht. wenn du erstmal eine einfache variante hinbekommen hast, wird es im nach-hinein einfacher, ein optisch ansprechenderes konzept umzusetzen.
also hier mal die anregung: //erstmal startpunkt setzen, ACHTUNG die koordinate (0/0) - ursprung - befindet sich links oben in der ecke image1.canvas.moveto(x,y); //im folgenden den zielpunkt setzen image1.canvas.lineto(x,y); |
Re: festgeldentwicklung mit canvas als Graph darstellen
ja mein problem is das zeichnen der punkte im canvas , die in den datenlisten bzw stringgrid erstellt werden ich hab keine ahnung wie das gehen könnte da brauch ich hilfe...
|
Re: festgeldentwicklung mit canvas als Graph darstellen
es soll doch eine art verlauf von links nach rechts entstehen? ich nehm es mal an:
für x kannst du einen festen abstand nehmen in form von beispielsweise 15 pixeln, dann musst du dich nur noch um die y-koordinate kümmern. die werte in dem stringgrid (die dem momentanbetrag entsprechen) multiplizierst du auch mit einem festen pixelwert und trägst die beispielsweise vom boden deines images ab. das ganze machst du in einer schleife, in der die einzelnen beträge abgearbeitet werden. |
Re: festgeldentwicklung mit canvas als Graph darstellen
genau das kann ich mir nicht erklären (wärst du vielleicht so net mir den schritt als quell code zu schreiben das wäre super )
|
Re: festgeldentwicklung mit canvas als Graph darstellen
mein problem ist wie krieg ich die werte der variablen zum beispiel 3.Jahr 100Euro als koordinaten in das Image
|
Re: festgeldentwicklung mit canvas als Graph darstellen
das ist jetzt so ohne programm entstanden, ich hoffe es hilft. fehler dürften keine drin sein! an der anpassung kannst du noch arbeiten, es sind nur die oldx, oldy, newx, newy interessant!!
Delphi-Quellcode:
var zinsen: real;
geldbetrag: array[0..11] of real; i,oldx,oldy,newx,newy : integer; begin //übernahme der variablen von den edit-feldern geldbetrag[0] := strtofloat(edit_start.Text); zinsen := 1 + (strtofloat(edit_zins.Text)/100); //berechnung der erhaltenen zinsen für jeden monat for i:=1 to 11 do begin geldbetrag[i] := geldbetrag[i-1]*zinsen; end; //zeichnen in das image for i:=0 to 11 do begin //koordinate des startpunktes bzw. des vorrangegangenen punktes oldx := i*10; oldy := image1.height-trunc(geldbetrag[i]/20);//durch 20 ist nur zur skalierung //berechneten koordinaten eintragen image1.Canvas.MoveTo(oldx,oldy); //koordinaten des folgenden punktes newx := i*10+10; newy := image1.height-trunc((geldbetrag[i]*zinsen)/20);//durch 20 ur zur skalierung //linie zu diesem folgenden punkt ziehen image1.Canvas.lineto(newx,newy); end; end; |
Re: festgeldentwicklung mit canvas als Graph darstellen
Versuchs mal auf einem Papier und übertrage die Idee.
Als erstes brauchst du einen Umrechnungsfaktor (besser zwei) so nach der Art: 1 Jahr entspricht 50Pixel und 100€ entsprechen 70Px. Wenn du dann das erste Jahr einzeichnen willst, hat das untere Ende eine beliebige y-Position, sagen wir mal 600. (Musst du von deinem Form abhängig machen). Wenn der einzuzeichenende Wert bei 550 liegt, ist die y-Koordinate des oberen endes bei 600-550/100*70=215 ( wie du wahrscheinlic schon festgestellt hast, die der Origo deines Canvassystems in der linken oberen Ecke und die y Werte nehmen nach unten hin zu) Die linken ecken liegen dann bei einem beliebigen Wert, sagen wir mal 100, die rechten dann bei x=100+50; Für das n-te Jahr hast du also die Linke ecke bei 100+n*50 und die y-Werte so wie für das erste Jahr bestimmt. Mit der Technik kannst du dir recht einfach dann ein Balkendiagramm bauen. SEHR WICHTIG ist es, dass du diese festen Werte wie umrechnungsfaktoren nicht fest reinschreibst, sondern immer ausrechnest. Wenn du z.b. einen Satz mit 10 Jahren einzeichnen willst, könnte deine Breite der Balken z.B. bei ((image.width-image.width/10) div 10) liegen. Dann hast du links und rechts noch einen schönen Rand mit einem Zehntel der CanvasBreite als Größe. für den y-Koeffizient könntest du vor dem Zeichnen den größten Geldbetrag auslesen und daraus dann den Umrechnungsfaktor errechnen. So hast du nie Probleme, wenn du mal mehr oder weniger Jahre, mehr oder weniger Geld oder auch nur ein kleineres Image benutzen willst. Am Anfang ist es vielleicht etwas mehr Mühe, aber sowas zählt zum schönen Programmieren, was dir später sehr viel Zeit sparen kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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