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 Diagramm aus Stringgrid Tabelle zeichnen. (https://www.delphipraxis.net/129660-diagramm-aus-stringgrid-tabelle-zeichnen.html)

otto06 23. Feb 2009 13:43


Diagramm aus Stringgrid Tabelle zeichnen.
 
Hallo,

ich habe folgendes Problem:
Ich habe ein Programm erstellt um eine Abzahlung zu simulieren. Es gibt nun das Problem, dass aus den erzeugten Stringgridwerten ein Diagramm erzeugt werden soll. Dieses soll die Stringgridwerte nutzen und außerdem dynamisch sein also je nach Kreditbetrag die Achseneinteilung variabel anpassen. Zum Einsatz soll eine Image-Komponente kommen (hier soll es hinein gezeichnet werden).

Leider habe ich soetwas noch nie gemacht und weiß deshalb auch nicht wie man in eine Image-Komponente etwas reinzeichnet.

Deshalb würde ich gerne einen Beispiel Quelltext haben oder am besten man würde mein Programm gleich vervollständigen. Würde es dem jenigen dann persönlich schicken.

Außerdem habe ich noch das Problem, dass ich nicht weiß welchen Quelltext man einfügt um einen Absturtz zu verhindern, wenn man in den Edit Feldern folgende Dinge eingibt: Keine, Buchstaben oder negative zahlen. :?: :?: :?:

Hier ist der Hauptquelltext aus der ersten unit (Hier ist auch eine Festgeld anlage integriert):

Delphi-Quellcode:

 unit Festgeldanlage;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, StdCtrls, Buttons, ExtCtrls, Menus, Shellapi, jpeg;

type
  TForm1 = class(TForm)
    Image1: TImage;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    Dokumentation1: TMenuItem;
    N2: TMenuItem;
    Info1: TMenuItem;
    Panel1: TPanel;
    Panel2: TPanel;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label6: TLabel;
    Label1: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit7: TEdit;
    Label2: TLabel;
    Label7: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn4: TBitBtn;
    StringGrid1: TStringGrid;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    BitBtn5: TBitBtn;
    BitBtn6: TBitBtn;
    StringGrid2: TStringGrid;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Datei1: TMenuItem;
    Datei2: TMenuItem;
    N3: TMenuItem;
    DateiSpeichern1: TMenuItem;
    DateiSpeichernunter1: TMenuItem;
    N4: TMenuItem;
    Drucken1: TMenuItem;
    BitBtn7: TBitBtn;
    Dateiffnen1: TMenuItem;
    DateiSpeichern2: TMenuItem;
    DateiSpeichernunter2: TMenuItem;
    DruckenKreditrckzahlung1: TMenuItem;
    Diagrammespeichern1: TMenuItem;
    DiagrammspeichernKreditrckzahlung1: TMenuItem;
    AllesSpeichern1: TMenuItem;
    AllesSpeichernKreditrckzahlung1: TMenuItem;
    N5: TMenuItem;
    Beenden1: TMenuItem;
    SaveDialog2: TSaveDialog;
    SaveDialog3: TSaveDialog;
    OpenDialog2: TOpenDialog;
    SaveDialog4: TSaveDialog;
    SaveDialog5: TSaveDialog;
    SaveDialog6: TSaveDialog;
    Edit8: TEdit;
    Label8: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure Info1Click(Sender: TObject);
    procedure Dokumentation1Click(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
    procedure Edit4Click(Sender: TObject);
    procedure Edit5Click(Sender: TObject);
    procedure Edit6Click(Sender: TObject);
    procedure Edit1Click(Sender: TObject);
    procedure Edit2Click(Sender: TObject);
    procedure Edit3Click(Sender: TObject);
    procedure BitBtn7Click(Sender: TObject);
    procedure StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Datei2Click(Sender: TObject);
    procedure DateiSpeichern1Click(Sender: TObject);
    procedure DateiSpeichernunter1Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);

   

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

const max=100;
type dstz=record
Jahr:string[5];
Anfang:string[20];
Zinsen:string[20];
Tilgung:string[20];
Ende:string[20]; end;
tdateifeld=array[1..max]of dstz;
tdatei=File of tdateifeld;


var
  Form1: TForm1;
  dateifeld:tdateifeld;
  datei: tdatei;

implementation

uses Diagramm1, Diagramm2, Diagramm3;

{$R *.DFM}





procedure StringGridAlignment(Grid: TStringGrid; Rect: TRect; ACol, ARow: Integer;
  Alignment: TAlignment; LineBreak: Boolean);
var
  TextOut: string;
begin
  Grid.Canvas.FillRect(Rect);
  TextOut := Grid.Cells[ACol,ARow];
  if LineBreak = false then
  begin
    if Alignment = taLeftJustify then
      DrawText(Grid.Canvas.Handle, PChar(TextOut), StrLen(PChar(TextOut)), Rect,DT_LEFT);
    if Alignment = taCenter then
      DrawText(Grid.Canvas.Handle, PChar(TextOut), StrLen(PChar(TextOut)), Rect,DT_CENTER);
    if Alignment = taRightJustify then
      DrawText(Grid.Canvas.Handle, PChar(TextOut), StrLen(PChar(TextOut)), Rect,DT_RIGHT);
  end
  else
  begin
    if Alignment = taLeftJustify then
      DrawText(Grid.Canvas.Handle, PChar(TextOut), StrLen(PChar(TextOut)),
      Rect,DT_LEFT+DT_WORDBREAK);
    if Alignment = taCenter then
      DrawText(Grid.Canvas.Handle, PChar(TextOut), StrLen(PChar(TextOut)), Rect,
      DT_CENTER+DT_WORDBREAK);
    if Alignment = taRightJustify then
      DrawText(Grid.Canvas.Handle, PChar(TextOut), StrLen(PChar(TextOut)), Rect,
      DT_RIGHT+DT_WORDBREAK);
  end;
end;





procedure TForm1.FormCreate(Sender: TObject);

var i : integer;

begin for i:=1 to max do
  with stringgrid2 do
    begin cells[0,0]:='Jahr';
          cells[1,0]:='Anfang';
          cells[2,0]:='Zinsen';
          cells[3,0]:='Tilgung';
          cells[4,0]:='Ende';
          dateifeld[i].Jahr:=cells[i,0];
          dateifeld[i].Anfang:=cells[1,i];
          dateifeld[i].Zinsen:=cells[2,i];
          dateifeld[i].Tilgung:=cells[3,i];
          dateifeld[i].Ende:=cells[4,i];
begin
 with stringgrid2 do
  begin
    Cells[0,0]:='Jahr';
    Cells[1,0]:='Anfang';
    Cells[2,0]:='Zinsen';
    Cells[3,0]:='Tilgung';
    Cells[4,0]:='Ende';

 stringgrid1.Cells[0,0]:='Jahr';
 stringgrid1.cells[1,0]:='Guthaben';
 stringgrid1.cells[2,0]:='Zinsen';

 edit1.text:='20000';
 edit2.text:='15';
 edit3.text:='4';
 edit4.text:='20000';
 edit5.text:='7';
 edit6.text:='1700';
 edit7.clear;
 edit8.clear;

 stringgrid1.ColWidths[0] := 40;
 stringgrid2.ColWidths[0] := 40;

 {SetWindowLong(BitBtn1.Handle, GWL_STYLE,GetWindowLong(BitBtn1.Handle, GWL_STYLE) or BS_MULTILINE);
  BitBtn1.Caption := 'Zinsatz und Laufzeit' + #13#10 + 'berechnen';         {Schreibt einen Button zwei zeilig}

end;
end;
end;
end;

procedure dateifeldlesen;
var i:integer;
begin
for i:=1 to max do
with form1.stringgrid2 do
begin
dateifeld[i].jahr:=cells[0,i];
dateifeld[i].anfang:=cells[1,i];
dateifeld[i].zinsen:=cells[2,i];
dateifeld[i].tilgung:=cells[3,i];
dateifeld[i].ende:=cells[4,i];
end;
end;

procedure zurueck;
var k:integer;
begin
for k:=1 to max do
with form1.stringgrid2 do
begin
cells[0,k]:= dateifeld[k].Jahr;
cells[1,k]:= dateifeld[k].Anfang;
cells[2,k]:= dateifeld[k].Zinsen;
cells[3,k]:= dateifeld[k].Tilgung;
cells[4,k]:= dateifeld[k].Ende;
 end;
  end;


procedure TForm1.BitBtn3Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 form2.show;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
 form3.show;
end;



procedure TForm1.Info1Click(Sender: TObject);
begin

 application.MessageBox('Zinsrechner v1.0'+chr(13)+'Computer@ Software Developing'+chr(13)+chr(13)+'Written by'+chr(13)+' Niels Grabowski'+chr(13)+' Rico Guszahn'+chr(13)+chr(13)+'All rights reserved © 2009','Über');

end;



procedure TForm1.Dokumentation1Click(Sender: TObject);
begin

  ShellExecute(Application.Handle, 'open', PChar('Dokumentation\Dokumentation.pdf'), Nil, Nil, SW_NORMAL);

end;

procedure TForm1.BitBtn5Click(Sender: TObject);
var i : integer;
      Kredit,Annuitaet,Ende,Zinsen,Zinssatz : real;
  begin
    Kredit:=Strtofloat (Edit4.Text);
    Zinssatz:=Strtofloat(Edit5.Text)/100;
    Annuitaet:=Strtoint(Edit6.Text);
    if Annuitaet<Kredit*(Zinssatz+0.01)
      then MessageDlg ('Die jährliche Rückzahlung reicht für eine '+
                        'Abzahlung des Kredits nicht aus.', mtInformation,[mbOk],0)
      else
       begin
         i:=1;
         with stringgrid2 do
           repeat
             if i>5 then rowcount :=i+1;
             Cells[0,i]:=inttostr(i);
             Cells[1,i]:=floattostrf(Kredit,fffixed,10,2);
             Zinsen:=Kredit*Zinssatz;
             Cells[2,i]:=floattostrf(Zinsen,fffixed,10,2);
             Ende:=Kredit+Zinsen-Annuitaet;
             Cells[3,i]:=floattostrf(Annuitaet-Zinsen,fffixed,10,2);
             Cells[4,i]:=floattostrf(Ende,fffixed,10,2);
             Kredit:=Ende;
             i:=i+1;
        until Kredit*(1+Zinssatz)<Annuitaet;
      Edit7.Text:=inttostr(i);
      Edit8.Text:=floattostrf(Kredit*(1+Zinssatz),fffixed,10,2);
      end;
end;

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
 form4.show;
end;

procedure TForm1.Edit4Click(Sender: TObject);
begin
 Edit4.selectall;
 BitBtn1.Default := False;
 BitBtn5.Default := True;
end;

procedure TForm1.Edit5Click(Sender: TObject);
begin
 Edit5.selectall;
 BitBtn1.Default := False;
 BitBtn5.Default := True;
end;

procedure TForm1.Edit6Click(Sender: TObject);
begin
 Edit6.selectall;
 BitBtn1.Default := False;
 BitBtn5.Default := True;
end;

procedure TForm1.Edit1Click(Sender: TObject);
begin
 Edit1.selectall;
 BitBtn1.Default := True;
 BitBtn5.Default := False;

end;

procedure TForm1.Edit2Click(Sender: TObject);
begin
 Edit2.selectall;
 BitBtn1.Default := True;
 BitBtn5.Default := False;
end;

procedure TForm1.Edit3Click(Sender: TObject);
begin
 Edit3.selectall;
 BitBtn1.Default := True;
 BitBtn5.Default := False;
end;

procedure TForm1.BitBtn7Click(Sender: TObject);
var j:integer;

begin
for j:=1 to max do
with form1.stringgrid2 do
 begin cells[0,j]:='';
       cells[1,j]:='';
       cells[2,j]:='';
       cells[3,j]:='';
       cells[4,j]:='';
 end;

for j:=1 to max do
 with form1.stringgrid1 do
  begin cells[0,j]:='';
        cells[1,j]:='';
        cells[2,j]:='';
        cells[3,j]:='';
        cells[4,j]:='';
end;

 edit1.clear;
 edit2.clear;
 edit3.clear;
 edit4.clear;
 edit5.clear;
 edit6.clear;
 edit7.clear;
end;


//Methode im OnDrawCell aufrufen
procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

  var j:integer;
begin
 { //Text linksbündig ohne Zeilenumbruch in der ersten Zeile
  if ARow = 0 then
    StringGridAlignment(StringGrid2, Rect, ACol, ARow, taLeftJustify, False); }

  //Text zentriert mit Zeilenumbruch in der zweiten Zeile
 if ARow >= 0 then
    StringGridAlignment(StringGrid2, Rect, ACol, ARow, taCenter, True);
   
  {//Text rechtsbündig ohne Zeilenumbruch restliche Zeilen
  if ARow > 1 then
    StringGridAlignment(StringGrid2, Rect, ACol, ARow, taRightJustify, False); }
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
   var j:integer;
begin

 if ARow >= 0 then
    StringGridAlignment(StringGrid1, Rect, ACol, ARow, taCenter, True);

end;

procedure TForm1.Datei2Click(Sender: TObject);
begin
if opendialog1.execute then begin
assignfile(datei,opendialog1.filename);
reset(datei);
read(datei,dateifeld);
closefile(datei);
savedialog1.filename:=opendialog1.filename;
form1.caption:=opendialog1.filename;
zurueck;
end;
end;

procedure TForm1.DateiSpeichern1Click(Sender: TObject);
begin
if savedialog1.filename<>'' then begin
dateifeldlesen;
assignfile(datei,savedialog1.filename);
rewrite(datei);
write(datei,dateifeld);
closefile(datei);
end
else DateiSpeichernunter1Click(Sender);
end;

procedure TForm1.DateiSpeichernunter1Click(Sender: TObject);
begin
 if savedialog1.Execute then begin
dateifeldlesen;
assignfile(datei,savedialog1.filename);
rewrite(datei);
write(datei,dateifeld);
closefile(datei);
form1.caption:=savedialog1.filename;
end;
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin

 close;
 
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var i,Laufzeit:integer;
    Anfang, Ende, Zinsen, Zinssatz:Real;
begin
 Anfang:=Strtofloat(Edit1.text);
 Zinssatz:=Strtofloat(edit3.text)/100;
 Laufzeit:=Strtoint(Edit2.text);


 {if Edit1.text <> ''
      then MessageDlg ('Die jährliche Rückzahlung reicht für eine '+
                        'Abzahlung des Kredits nicht aus.', mtInformation,[mbOk],0)
 else
 begin                           }


 Stringgrid1.rowcount:=Laufzeit+1;
 for i:=1 to Laufzeit do
 with stringgrid1 do



 begin  
  Cells[0,i]:=inttostr(i);
  Cells[1,i]:=floattostrf(Anfang,fffixed,10,2);
  Zinsen:=Anfang*Zinssatz;
  Cells[2,i]:=floattostrf(Zinsen,fffixed,10,2);
  Ende:=Anfang+Zinsen;
  Cells[3,i]:=floattostrf(ende,fffixed,10,2);
  Anfang:=Ende;
  end;
end;


end.















var Value: double;
begin

   result:=false;

   if (Eingabefeld.Text = '') then
   begin
      ShowMessage('Das Eingabefeld ist leer.');
      exit;
   end;


   try
   Value:=StrtoFloat (Eingabefeld.Text);
   except
        ShowMessage('Die Eingabe konnte nicht in eine Zahl konvertiert werden.');
      exit;
  end;

   if (Value<=0.0) then
   begin
      ShowMessage('Wert darf nicht negativ sein.');
      exit;
   end;

   result:=true;
   Wert:=Value;
end;
:?: :lol:

[edit=SirThornberry]"HILFE!" aus Titel entfernt - Mfg, SirThornberry[/edit]

fkerber 23. Feb 2009 13:51

Re: Diagramm aus Stringgrid Tabelle zeichnen. HILFE!
 
Hi!

Herzlich Willkommen in der DP!

Was ist jetzt deine konkrete Frage? (Irgendwie konnte ich das aus dem Thread nicht herauslesen)

Was die Sache mit den ungültigen Eingaben angeht, solltest du über die Suche einiges finden (solltest du dazu dann noch Fragen haben, mache bitte einen neuen Thread auf, damit es hier nicht durcheinander geht).


Ciao, Frederic

otto06 23. Feb 2009 15:27

Re: Diagramm aus Stringgrid Tabelle zeichnen. HILFE!
 
Also das Problem ist:

Ich habe ein Programm erstellt um eine Abzahlung zu simulieren. Es gibt nun das Problem, dass aus den erzeugten Stringgridwerten ein Diagramm erzeugt werden soll. Dieses soll die Stringgridwerte nutzen und außerdem dynamisch sein also je nach Kreditbetrag die Achseneinteilung variabel anpassen. Zum Einsatz soll eine Image-Komponente kommen (hier soll es hinein gezeichnet werden).

Das Digramm soll die Entwicklung der Restschuld und Zinsumme in einem Diagramm darstellen können.

Leider habe ich soetwas noch nie gemacht und weiß deshalb auch nicht wie man in eine Image-Komponente etwas reinzeichnet.

Deshalb würde ich gerne einen Beispiel Quelltext haben oder am besten man würde mein Programm gleich vervollständigen. Würde es dem jenigen dann persönlich schicken um es weiter zu verbessern.

Vielen Dank. :-D


Ich weiß sehr umfangreich aber vielleicht hat jemand eine Idee dazu.
Nochmals Danke.

fkerber 23. Feb 2009 15:29

Re: Diagramm aus Stringgrid Tabelle zeichnen. HILFE!
 
Hi!

Also du willst quasi von Hand eine Chart-Komponente realisieren?
Gibt es einen Grund, warum du keine fertige verwendest? (z.B. TChart gibt es, aber du findest sicher noch ein paar mehr, falls es für dich in Frage kommt)


Ciao, Frederic

DeddyH 23. Feb 2009 15:32

Re: Diagramm aus Stringgrid Tabelle zeichnen. HILFE!
 
Das klingt mir doch sehr nach Hausaufgabe mit entsprechender Vorgabe.

otto06 23. Feb 2009 15:37

Re: Diagramm aus Stringgrid Tabelle zeichnen. HILFE!
 
Die aufgabe habe ich mir selber gesetzt, weil ich eigentlich Delphi und das Programmieren lernen und verstehen will.

Achso noch was: Es soll schon in einer Timage-Komponente realisiert werden.

fkerber 23. Feb 2009 15:40

Re: Diagramm aus Stringgrid Tabelle zeichnen. HILFE!
 
Hi!

Warum möchtest du an der TImage-Komponente festhalten?
Die ist für sowas an sich nicht gedacht, sondern dient (wie der Name sagt) zum Anzeigen eines Bildes. Wenn schon selber zeichnen, wäre eine TPaintBox sicher angebrachter...


Ciao, Frederic

DeddyH 23. Feb 2009 15:43

Re: Diagramm aus Stringgrid Tabelle zeichnen. HILFE!
 
Zitat:

Zitat von otto06
Die aufgabe habe ich mir selber gesetzt, weil ich eigentlich Delphi und das Programmieren lernen und verstehen will.

Dann macht es in meinen Augen aber keinen Sinn, nach fertigem Quelltext zu fragen. Aber um zumindest die eine Frage zu beantworten: versuch mal, die Texte in den Edit-Feldern mit TryStrToInt bzw. TryStrToFloat in ganze bzw. Fließkommazahlen umzuwandeln.

mkinzler 23. Feb 2009 15:45

Re: Diagramm aus Stringgrid Tabelle zeichnen. HILFE!
 
http://www.datamaster2003.com/

sirius 23. Feb 2009 15:46

Re: Diagramm aus Stringgrid Tabelle zeichnen. HILFE!
 
Zitat:

Zitat von otto06
Die aufgabe habe ich mir selber gesetzt, weil ich eigentlich Delphi und das Programmieren lernen und verstehen will.

Also ich habe mich nie so eingeschränkt:
Zitat:

die Achseneinteilung variabel anpassen. Zum Einsatz soll eine Image-Komponente kommen
:gruebel:

btw: CP

(Edit: Wow, der rote Kasten ist wohl noch im Wochenende...)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr.
Seite 1 von 2  1 2      

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