AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record laden

Ein Thema von grader · begonnen am 25. Mär 2007 · letzter Beitrag vom 28. Mär 2007
Antwort Antwort
Seite 1 von 3  1 23      
grader

Registriert seit: 5. Mär 2007
19 Beiträge
 
Delphi 2005 Personal
 
#1

Record laden

  Alt 25. Mär 2007, 19:22
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

[edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt und Quelltext eingerückt - Mfg, SirThornberry[/edit]
the grader
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Record laden

  Alt 25. Mär 2007, 19:26
Die Größe deiner Datei durch SizeOf(DeinRecord) teilen.

Gruß
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#3

Re: Record laden

  Alt 25. Mär 2007, 19:32
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.

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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
grader

Registriert seit: 5. Mär 2007
19 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Record laden

  Alt 25. Mär 2007, 19:39
Und wie lese ich die jetzt genau aus? Sorry, bin entweder zu blöd oder überhaupt nicht mehr aufnahmefähig heute

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

edit2:

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

verstehe aber nicht warum es mit n:=Length(T); nicht geht??
the grader
  Mit Zitat antworten Zitat
grader

Registriert seit: 5. Mär 2007
19 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Record laden

  Alt 25. Mär 2007, 20:27
Bitte bräuchte wirklich noch nen Tipp, da das Programm ohne das sinnlos wäre

Will doch nur die Anzahl der Datensätze des Records in eine Variable stecken!
the grader
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Record laden

  Alt 25. Mär 2007, 21:26
Hallo,

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

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

Gruß
Len := stream.Size div SizeOf(T);
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Record laden

  Alt 25. Mär 2007, 21:39
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#8

Re: Record laden

  Alt 25. Mär 2007, 22:22
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Record laden

  Alt 25. Mär 2007, 22:24
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
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#10

Re: Record laden

  Alt 26. Mär 2007, 00:56
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 00:54 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