Autor Beitrag
Dyon
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.04.09 16:49 
Hallo zusammen,
Habe hier eine Prozedur, die aus einer txt Datei Werte in ein Array einliest.
Hier erstmal der Code:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
//...
type
    TStunden = record
    Pnr: string[255];
    Auftragnr:string[100];
    {Pnr: string[4];
    Auftragnr: string[6];
    Positionnr: string[2];
    Stunden: string[4];
    DatumJahr: string[4];
    DatumMonat: string[2];
    DatumTag: string[2];}

  end;

  TForm1 = class(TForm)
    //...

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

var
    Form1: TForm1;
    RecordStunden: TStunden;
    ListStunden: array of TStunden;
    iStunden: integer;
    fStunden: file of TStunden;

implementation

uses Unit3, Unit4, Unit5;


{$R *.dfm}

procedure TForm1.StundenDateiLaden;
var
zeilenanzahl:integer;
begin
showmessage('1');
  assignfile(fStunden,ExtractFilePath(ParamStr(0)) +'dat/Stunden.dat');
  reset(fStunden);
  showmessage('2');
  zeilenanzahl:=2;
  if low(listStunden) <> -1
  then begin
     for iStunden:= 0 to zeilenanzahl-1
     do begin
        showmessage('3');
        Read(fStunden,ListStunden[iStunden]);
        showmessage('4');
     end;
  end;
  closefile(fStunden);
  showmessage('5');
end;


Wenn ich nun diese Prozedur ausführe, werden die Messageboxen bis einschließlich 3 aufgerufen.
Ich hab schon einiges zu arrays und records hier im Forum gefunden, aber noch nicht wirklich, wie man eine Textdatei in ein Array liest. Meine erste Frage ist, was ich an meinem Code bis jetzt falsch habe und wie ich die for-Schleife machen kann, dass sie bis zum Ende zählt?
Meine zweite Frage ist, wie ich verschiedene Werte auslesen kann, ändern und in dem array wieder speichern und wie ich nacher die Textdatei komplett mit dem Array wieder überschreiben kann.

Danke
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 14.04.09 17:08 
filesize(fStunden) / sizeof(tstunden) = anzahl
-> SetLength(ListStunden, x)

ansonsten

while not eof(fStunden) do...

schreiben geht dann:

for i := Low(ListStunden) to High(ListStunden)
write(FStunden, ListStunden[i]);

oder wenn du die nicht einzeln haben willst hilft dir auch seek(fStunden,x)

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Dyon
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.04.09 18:13 
Wie müsste die Prozedur in meinem Fall dann ausehen? Bei mir gibt es immer wenn ich die Prozedur aufrufe bei dem Read einen Fehler? Ich komm gerade wirklich nicht drauf...
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.04.09 18:36 
Bei typisierten Dateien kannst Du nach dem Reset mit FileSize die Anzahl der enthaltenen Records auslesen. Mit SetLength kannst Du also die Größe des Arrays dementsprechend anpassen. Nun noch einen Zähler und eine while Schleife oder alternativ in einer for-Schleife die Daten einlesen. Pseudo-Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Reset(Datei);
SetLength(DeinArray,FileSize(Datei));
Current := 0;
while not eof(Datei) do
  begin
    read(Datei,DeinArray[Current]);
    inc(Current);
  end;
CloseFile(Datei);

Getippt und nicht getestet.
Dyon
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.04.09 19:05 
Vielen Dank für die schnelle Hilfe.
Das Auslesen und so klappt jetzt alles.
Danke
So mit dem Speichern klappt das auch soweit.
Wie kann ich nun aber weitere Sachen in das Array speichern? Also wenn ich was über ein Editfeld eingebe, dass das dann z.b. für Auftragsnummer oder Personalnummer gespeichert wird.
Im Endeffekt, will ich die Daten aus der Datei in ein Array einlesen, da weitere Datensätze anfügen (später auch löschen) und dann wieder speichern.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.04.09 19:22 
Im Prinzip genauso: mit SetLength die Array-Größe anpassen und das einzelne Element befüllen. Die Lade- und Speicherroutinen sind ja im Idealfall dynamisch angelegt, so dass die tatsächliche Länge des Arrays dort keine Rolle spielt.
Dyon
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.04.09 19:41 
Also wenn ich eine Datei schon in das Array geschrieben habe, und ich dann eine neue "Zeile" an das Array anfügen will, was muss ich denn da genau in die Prozedur schreiben?
Ich steh bei den Arrays gerade wirklich auf dem Schlauch^^

Noch eine andere Frage:
Wenn ich ein Record so habe
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  TPnr = record
    Pnr: string[3];
    Pname: string[49];
    Rangnr: string[0];
  end;

Dann müsste ich doch in der Datei 4Stellen für die Pnr haben, dann 50Stellen für Pname und 1Stelle für Rangnr. Dann kann ich das ja auch einfach so in die Datei schreiben, oder muss ich da noch irgendwelche Zeichen dazwischen machen? Bei mir funktioniert das noch nicht ganz mit dem auslesen von Pname z.b.
Dyon
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 16.04.09 12:54 
Also es hat sich erledigt wie die Datei aussehen muss.
Aber bei mir werden, egal welchen eintrag ich aus dem array lese, immer genau 7 Zeichen angezeigt.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
PnrDateiLaden;
  i:=0;
  while i<=High(ListPnr) do
    begin
    CBPnr.Items.add(ListPnr[i].Pnr + ListPnr[i].Pname);
    ListBox1.Items.Add (ListPnr[i].Pname);
    ListBox1.Items.add(ListPnr[i].Rangnr);
    i:=i+1;
    end;


Weiß jemand woran das liegt?

Und noch die andere Frage mit dem Daten an das Array anfügen habe ich auch noch nicht hingekriegt.
Ich hab jetzt sowas
ausblenden Delphi-Quelltext
1:
2:
3:
SetLength(ListStunden,Length(ListStunden)+1);
  //write(ListStunden,ListStunden[High(ListStunden)]);
  ListStunden[Length(ListStunden) - 1] := ??;

Hab es da zuerst mit dem auskommentierten irgendwie versucht und dann mit dem anderen.
Ich glaube die Länge müsste ich so richtig angepasst haben. Fehlt eben nur noch das hineinschreiben. Ich hab dazu auch irgendwie noch nichts so richtig bei Google gefunden, was aber wahrscheinlich daran liegt dass ich nach dem falschen suche^^.


Vielen Dank