Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi wie fügt man in ein zwedimensionales array werte ein (https://www.delphipraxis.net/92282-wie-fuegt-man-ein-zwedimensionales-array-werte-ein.html)

felix1806 17. Mai 2007 12:33


wie fügt man in ein zwedimensionales array werte ein
 
hallo ich habe bis jetzt folgendes geschrieben
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.
ich will jetzt das ganze so umändern dass ich die daten nicht mehr direkt in ein stringgrid sondern erst in ein array einspeise(weil ich dann noch die werte für einen graphen brauche), das will ich mit der procedure Einspeichern tun, allerdings weiß ich jetzt nicht wie ich das mit den globalen variablen und dem 2D-array
machensoll: Meine Probleme sind: -Erzeugung des Arrays mit den globalen variablen
-Erzeugung des Arrays mit i vielen Cells
Ich habe leider so gut wie keine Erfahrung mit Arrays und hatte schon mal nachgefragt wie man die Arrays erstellt(http://www.delphipraxis.net/internal...t.php?t=110225, konnte das auch nachvollziehen kann das aber nicht auf meinen Fall anwenden.
Vielen Dank für Eure Hilfe
Gruß Felix

Apollonius 17. Mai 2007 12:37

Re: wie fügt man in ein zwedimensionales array werte ein
 
Ist die Anzahl an Zellen im gesamten Programm fest (->statisches Array) oder ändert sie sich (->dynamisches Array)?

felix1806 17. Mai 2007 12:43

Re: wie fügt man in ein zwedimensionales array werte ein
 
also eigentlich ändert sie sich je nach eingabe in das edit feld EdMindestlaufzeit weil dann das Kapital um die Anzahl der Jahre verzinst wird, das array muss sich also um die anzahl der jahre erweitern... ich weiß nicht wie...
vielen dank für dein interesse

Apollonius 17. Mai 2007 12:46

Re: wie fügt man in ein zwedimensionales array werte ein
 
Sind beide Dimensionen dynamisch oder nur eine?

felix1806 17. Mai 2007 12:51

Re: wie fügt man in ein zwedimensionales array werte ein
 
nur die zweite dimension "nach unten" die erste ist fix ([0,0]jahr[1,0]anfang[2,0]zinsen[3,0]ende)

Apollonius 17. Mai 2007 12:55

Re: wie fügt man in ein zwedimensionales array werte ein
 
Das ist sehr praktisch. Dann definierst du dein Array einfach mit
Delphi-Quellcode:
var meinArray: array[0..3] of array of double;
Wenn dann die tatsächliche Anzahl an Zeilen feststeht, führst du einfach ein setlength(meinArray, anzahlzeilen) durch.

felix1806 17. Mai 2007 12:57

Re: wie fügt man in ein zwedimensionales array werte ein
 
ja mein problem is jetzt nur das in den quelltext oben einzubinden, mit den globalen variablen...

Apollonius 17. Mai 2007 13:01

Re: wie fügt man in ein zwedimensionales array werte ein
 
Entweder du definierst es als globale Variable oder als Feld von TForm1.
In BitBtn1Click führst du dann das selbe mit dem Array durch, was du zur Zeit mit dem Stringgrid machst (natürlich ohne die Konvertierungen zu strings).

Jelly 17. Mai 2007 13:14

Re: wie fügt man in ein zwedimensionales array werte ein
 
Ich glaube, 2-dimensionale Arrays bieten sich für dein Fall überhaupt nicht an. Das, was du versuchst im Speicher abzubilden, nennt sich eine Datenliste.

Delphi-Quellcode:
Cells[0,0]:='Jahr';
Cells[1,0]:='Anfang';
Cells[2,0]:='Zinsen';
Cells[3,0]:='Ende';
Deine Anzahl der Spalten ist fest, die der Zeilen variabel.

Stell dir vor, du hast 30 Spalten zu verwalten, oder es kommt einfach morgen eine dazu. Weisst Du dann noch genau, dass Spalte 2 die Zinsen beinhaltet. Was, wenn du eine Spalte hast, die kein Float ist, sondern z.B. einen String beinhaltet, oder ein Boolean, oder auf irgendein anderes Objekt verweist.

Erstell dir eine Klasse (oder von mir auch gern ein Record, wenns keine Funktionalität braucht):

Delphi-Quellcode:
TZinsen = class
public
   Anfang, Ende : TDateTime ;
   Zinsen : double ;
end ;
Dazu eine TObjectList (irgendwie ist die heut bei mir sehr beliebt), die du in deiner Form im public Teil definierst:

Delphi-Quellcode:
TForm1 = class (TForm)
...
public
   ZinsenList : TObjectList ;
end ;
Kommt eine Zinsenzeile dazu, dann geht das so:

Delphi-Quellcode:
procedure TForm1.NeuerZinssatz ;
var
  Zinsen : TZinsen ;
begin
    Zinsen := TZinsen.Create ;
    Zinsen.Anfange := now ;
    Zinsen.Ende := EncodeDate (2007,12,31) ;
    Zinsen.Zinsen := 8.15 ;
    ZinsenListe.Add (Zinsen) ;
end ;
Die Klasse hat übrigens den Vorteil gegenüber einem einfachen Record, dass du auch direkt innerhalb der Klasse Berechnungen ausführen kannst, die nur das aktuelle Objekt betreffen.

ObjectListen sind einfach zu durchlaufen, zu zählen, und auch nachher wieder freizugeben, denn die enthaltenen Objekte von TZinsen werden gleich mit freigegeben.

felix1806 17. Mai 2007 13:21

Re: wie fügt man in ein zwedimensionales array werte ein
 
na ja ich probiers jetzt erst mal mit nem array weil ich das alles überschaubar halte es wird einkleines programm und in record und listen muss ich mich dann erst mal einarbeiten und ich ahbe leider nicht so viel zeit...

wie mach ich das dann an der stelle
Delphi-Quellcode:
StringGrid1.RowCount:=Mindestlaufzeit+1;
weil
Delphi-Quellcode:
meinArray.RowCount:=Mindestlaufzeit+1;
funktioniert nicht...

Jelly 17. Mai 2007 13:28

Re: wie fügt man in ein zwedimensionales array werte ein
 
Mit Listen hast du das rowcount Problem nicht.
Dein 2D Array musst du mit SetLength dynamisch vergrössern. Aber vertue dich nicht, sonst knallen dir Exceptions um die Ohren.

Nimm eine Liste. Es ist doch schon alles erklärt. Warum plagst du dich mit unflexiblen Array rum, wenn du eine dynamische Struktur verwalten musst. Die Liste nimmt dir doch all die Aufgaben ab.

felix1806 17. Mai 2007 13:48

Re: wie fügt man in ein zwedimensionales array werte ein
 
irgenwie steh ich gerade auf dem schlauch denn ich versteh nicht an welcher stellen man die einzlenen quellcodeteile einfügen muss und wie man sie in andere procedures einfügt (ich bin absoluter neuling auf diesem gebiet), viellicht könntest du die gerade in meinen quellcode oben einfügen damit ich das prinzip verstehe ansonsten bringt mir die beste liste nichts
danke
gruß felix

Apollonius 17. Mai 2007 13:56

Re: wie fügt man in ein zwedimensionales array werte ein
 
Benutzt du jetzt Arrays oder Listen?

felix1806 17. Mai 2007 14:21

Re: wie fügt man in ein zwedimensionales array werte ein
 
listen

Jelly 17. Mai 2007 14:23

Re: wie fügt man in ein zwedimensionales array werte ein
 
Zitat:

Zitat von felix1806
listen

Ich bereit mal was vor... Aber uch nur weil heut Feiertag ist :-)

felix1806 17. Mai 2007 14:32

Re: wie fügt man in ein zwedimensionales array werte ein
 
danke weil ich hab gerade net die peilung

Jelly 17. Mai 2007 14:52

Re: wie fügt man in ein zwedimensionales array werte ein
 
Hier der Unitcode:

3 Sachen, die für dich interessant sein dürften:
  • Die Klasse Zinsen enhält die Informationen zu einem Jahr. Bemerke die Eigenschaft Ende in der Klasse, die beim Lesen einfach dem Aufruf einer internen Funktion entspricht, denn Ende kannst du immer sehr leicht aus Anfang un Zinsen berechnen. Also gibt es keinen Grund, Ende als Parameter zu speichern.
  • Die Darstellung im StringGrid wurde von der Berechnung getrennt. Als Parameter gibts in ShowListe einen List : TObjectList. Hier musst du also ein Objekt von TObjectlist übergeben, das dann, insofern dort nur TZinsen Objekte enthalten sind, dargestellt
    wird.
  • Da eine TObjectList beliebige Objekte aufnehmen kann, musst du beim Auslesen prüfen ob es sich um ein TZinsen Element handelt. Wenn ja, so kannst du das Element als TZinsen casten, so wie ich es z.B. in ShowListe zeige

Delphi-Quellcode:
unit Unit24;

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.

felix1806 17. Mai 2007 15:05

Re: wie fügt man in ein zwedimensionales array werte ein
 
:-D VIELEN DANK FÜR DIE MÜHE!!!!!!!!!!!!!!!!! Ich schauhe es mir jetzt mal in Ruhe an (bin keiner der einfach den kramm einfügt ohne die sachen zu verstehen, sonst gibts später nur probleme) und melde mich dann, aber vielen Dank noch mal echt super denn so langsam versteh ichs vielleicht.... ;)

felix1806 17. Mai 2007 16:34

Re: wie fügt man in ein zwedimensionales array werte ein
 
Zitat:

Exception EClassNotFound in Modul Project1.exe bei 000182AE. Klasse TImage nicht gefunden
kommt als Fehlermeldung wenn ich die Unit über den Debugger staten will. Weiß jemand warum??? Danke

Jelly 17. Mai 2007 16:37

Re: wie fügt man in ein zwedimensionales array werte ein
 
Wo bitte schön kommt im Code ein TImage vor :gruebel:

felix1806 17. Mai 2007 16:46

Re: wie fügt man in ein zwedimensionales array werte ein
 
Problem gelöst: jetzt weiß ich nur nicht warum mir das Programm keine Werte im StringGrid1 anzeigt sofern ich welche in den Editfeldern angebe??? :?:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 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