Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi festgeldentwicklung mit canvas als Graph darstellen (https://www.delphipraxis.net/92519-festgeldentwicklung-mit-canvas-als-graph-darstellen.html)

felix1806 21. Mai 2007 16:58


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:
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.
hier der Code von einem freundliche Helfer ,den ich aber bis jetzt nicht verstehen kann.... unit Unit24;
Delphi-Quellcode:
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.
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

Jelly 21. Mai 2007 17:48

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.

felix1806 21. Mai 2007 17:51

Re: festgeldentwicklung mit canvas als Graph darstellen
 
eigentlich muss es nicht sein(mir wurd es nur empfohlen)

MasterChief2 21. Mai 2007 17:57

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);

felix1806 21. Mai 2007 18:01

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...

MasterChief2 21. Mai 2007 18:06

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.

felix1806 21. Mai 2007 18:16

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 )

felix1806 21. Mai 2007 18:39

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

MasterChief2 21. Mai 2007 18:42

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;

Nikolas 21. Mai 2007 18:53

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.
Seite 1 von 2  1 2      

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