Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record laden (https://www.delphipraxis.net/89075-record-laden.html)

grader 25. Mär 2007 19:22


Record laden
 
Guten Abend!

Habe ein Record, welches aus Strings besteht und dieses schreibe ich in eine .Dat Datei. Hier die write Prozedur:

Delphi-Quellcode:
procedure TForm1.saverec;
var
  Stream: TStream;
  I: integer;
  Len: Longint;
begin
  Stream := TFileStream.Create('c:\TMData.dat', fmCreate);
  try
    Len := Length(T);
    Stream.Write(Len, SizeOf(Len));
    for I := 0 to Length(T) - 1 do
    begin
      Len := Length(T[I].B);
      Stream.Write(Len, SizeOf(Len));
      Stream.Write(PChar(T[I].B)^, Len);
    end;
  finally
    Stream.Free;
  end;
end;
Das laden funktioniert auch nur beim ausgeben habe ich ein Problem! Dazu brauche ich die Anzahl der Datensätze, welche ich dann einer Variable n zuordne!

Also wenn ich 5 Termine gespeichert habe steht n auf 5.. Wenn ich jetzt das Programm schließe und das Record wieder lade soll er jetzt n wieder auf 5 setzen!

Habt ihr ne Idee?

Habs so probiert, aber dann sagt er für n immer '1'!

n:=Length(T);

Brauche im Endeffekt nur die Anzahl der Einträge im Record! Muss das Programm leider morgen in Informatik abgeben und sitze schon das ganze WE an diversen Problemen hoffe ihr könnt mir da nochmal helfen :zwinker:

[edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt und Quelltext eingerückt - Mfg, SirThornberry[/edit]

MrKnogge 25. Mär 2007 19:26

Re: Record laden
 
Die Größe deiner Datei durch SizeOf(DeinRecord) teilen.

Gruß

himitsu 25. Mär 2007 19:32

Re: Record laden
 
Oder die Datei bis zum Dateiende (EndOfFile) abarbeiten und jeweils den grad gelesenen Eintrag anhängen,

aber du hast doch die Anzahl in der Datei abgespeichert?
Also brauchst du die doch einfach nur auszulesen. :gruebel:

Delphi-Quellcode:
Stream.Read(Len, SizeOf(Len));
SetLength(T, Len);
for I := 0 to Length(T) - 1 do
begin
  Stream.Read(Len, SizeOf(Len));
  SetLength(T[I].B, Len);
  Stream.Read(PChar(T[I].B), Len);
end;

grader 25. Mär 2007 19:39

Re: Record laden
 
Und wie lese ich die jetzt genau aus? Sorry, bin entweder zu blöd oder überhaupt nicht mehr aufnahmefähig heute :wall:

edit:

habe jetzt so gemacht:

Delphi-Quellcode:
Stream.Read(Len, SizeOf(Len));
SetLength(T, Len);
n:=Length(T);
jetzt kommt aber immer ne Exception!! help please :zwinker:

edit2:

das war jetzt glaube ich noch größerer Blödsinn :spin2:

verstehe aber nicht warum es mit
Delphi-Quellcode:
n:=Length(T);
nicht geht??

grader 25. Mär 2007 20:27

Re: Record laden
 
Bitte bräuchte wirklich noch nen Tipp, da das Programm ohne das sinnlos wäre :roll:

Will doch nur die Anzahl der Datensätze des Records in eine Variable stecken!

bitsetter 25. Mär 2007 21:26

Re: Record laden
 
Hallo,

normalerweise müsste es funktionieren. Hast du beim Laden der Datei auch mit fmOpenRead gearbeitet?
Delphi-Quellcode:
Stream := TFileStream.Create('c:\TMData.dat', fmOpenRead);
Ansonsten zeige uns mal den Rest deines Codes.

EDIT:
Zitat:

Zitat von MrKnogge
Die Größe deiner Datei durch SizeOf(DeinRecord) teilen.

Gruß

Delphi-Quellcode:
Len := stream.Size div SizeOf(T);

Luckie 25. Mär 2007 21:39

Re: Record laden
 
Zitat:

Zitat von grader
Habe ein Record, welches aus Strings besteht

AnsiStrings in einem Record kann man nicht so einfach in eine Datei schreiben. Zeig mal deinen Record und deine Speicher-Routine.

himitsu 25. Mär 2007 22:22

Re: Record laden
 
Delphi-Quellcode:
    Len := Length(T);
    Stream.Write(Len, SizeOf(Len));
    for I := 0 to Length(T) - 1 do
    begin
      Len := Length(T[I].B);
      Stream.Write(Len, SizeOf(Len));
      Stream.Write(PChar(T[I].B), Len);
sieht eigentlich OK aus, wenn B der String ist

er speichert die Arraylänge und dann jeweils die Länge von B, sowie dessen Inhalt?

[edit]
getäucht ... ein ^ zuviel

TStringlist 25. Mär 2007 22:24

Re: Record laden
 
hallo grader,

der erste Parameter der Stream.Write- und Stream.Read-Funktionen muss immer die Adressen der Variablen sein, welche man damit auslesen bzw. beladen will, also ungefähr so:

Delphi-Quellcode:
Stream.Write(Addr(Len)^, SizeOf(Len));

bzw.

Stream.Read(Addr(Len)^, SizeOf(Len));

edit: wenn das der Compiler nicht schon automatisch macht :mrgreen:

himitsu 26. Mär 2007 00:56

Re: Record laden
 
Nein, Read/Write nimmt verwendet Var/Const-Parameter (D7) und demnach nichts mit Addr und Co.

Weßhalb auch die Dereferenzierung im Ausgangspost falsch wäre.
Code:
Stream.Write(PChar(T[I].B)[color=#ff0000][b]^[/b][/color], Len);
dat Rote muß weg, denn sonst kann es mit dem Auslesen nicht klappen ... da ja schon was Falsches in der Datei stünde.

PS: hattest du eigentlich mal in die Datei geschaut, also ob da überhaupt was richtig Aussehendes drin ist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:19 Uhr.
Seite 1 von 3  1 23      

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