AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi festgeldentwicklung mit canvas als Graph darstellen
Thema durchsuchen
Ansicht
Themen-Optionen

festgeldentwicklung mit canvas als Graph darstellen

Ein Thema von felix1806 · begonnen am 21. Mai 2007 · letzter Beitrag vom 22. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
felix1806

Registriert seit: 13. Mai 2007
24 Beiträge
 
#1

festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 16:58
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
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 17:48
Der freundliche Helfer war wohl ich 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.
  Mit Zitat antworten Zitat
felix1806

Registriert seit: 13. Mai 2007
24 Beiträge
 
#3

Re: festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 17:51
eigentlich muss es nicht sein(mir wurd es nur empfohlen)
  Mit Zitat antworten Zitat
MasterChief2

Registriert seit: 21. Jun 2006
7 Beiträge
 
Delphi 6 Professional
 
#4

Re: festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 17:57
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);
  Mit Zitat antworten Zitat
felix1806

Registriert seit: 13. Mai 2007
24 Beiträge
 
#5

Re: festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 18:01
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...
  Mit Zitat antworten Zitat
MasterChief2

Registriert seit: 21. Jun 2006
7 Beiträge
 
Delphi 6 Professional
 
#6

Re: festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 18:06
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.
  Mit Zitat antworten Zitat
felix1806

Registriert seit: 13. Mai 2007
24 Beiträge
 
#7

Re: festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 18:16
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 )
  Mit Zitat antworten Zitat
felix1806

Registriert seit: 13. Mai 2007
24 Beiträge
 
#8

Re: festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 18:39
mein problem ist wie krieg ich die werte der variablen zum beispiel 3.Jahr 100Euro als koordinaten in das Image
  Mit Zitat antworten Zitat
MasterChief2

Registriert seit: 21. Jun 2006
7 Beiträge
 
Delphi 6 Professional
 
#9

Re: festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 18:42
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;
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#10

Re: festgeldentwicklung mit canvas als Graph darstellen

  Alt 21. Mai 2007, 18:53
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:49 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