AGB  ·  Datenschutz  ·  Impressum  







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

AV bei Records laden

Ein Thema von Neutral General · begonnen am 27. Jun 2006 · letzter Beitrag vom 27. Jun 2006
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AV bei Records laden

  Alt 27. Jun 2006, 17:30
Hi,

Also erst mal meine Records:
Delphi-Quellcode:
rZinsen = packed record
 Start : TDateTime;
 Intervall: Zinsintervall;
 Kind : Zinsart;
 Value : Word;
end;

rSchulden = packed record
 Bei : String;
 Anlass : String;
 Betrag : Single;
 Zinsen : rZinsen;
 Gezahlt: Boolean;
end;
dann hab ich ne Klasse die die Schulden verwaltet:

Delphi-Quellcode:
TSchuldenliste = class
   private
    FStringgrid: TStringgrid;
    FItems: Array of rSchulden;
    FCount: Word;
    function GetItem(Index: Integer): rSchulden;
    procedure SetItem(Index: Integer; const Value: rSchulden);
   public
    constructor Create(Stringgrid: TStringgrid);
    procedure Add(Schulden: rSchulden);
    property Items[Index: Integer]: rSchulden read GetItem write SetItem;
    property Count: Word read FCount write FCount;
    procedure SaveToFile(Filename: String);
    procedure LoadFromFile(Filename: String);
  end;
und beim Laden von den Records gibts jetzt irgendwie beim zweiten Record einen Fehler.. das erste wird fehlerlos geladen (was heißt das es eigentlich nicht am speichern liegen kann.. weshalb ich die Speichern Procedure jetzt aus Platzgründen erst mal nicht poste).

Delphi-Quellcode:
procedure TSchuldenliste.LoadFromFile(Filename: String);
var MS: TMemoryStream;
    i, len: Integer;
begin
  MS := TMemoryStream.Create;
  Ms.LoadFromFile(Filename);
  Ms.Position := 0;

  Ms.Read(FCount, SizeOf(Word));
  SetLength(FItems,FCount);

  for i:= 0 to FCount-1 do begin
   Ms.Read(Len, SizeOf(Integer));
   SetLength(FItems[i].Bei,len);
   Ms.Read(FItems[i].Bei[1], len);
   Ms.Read(Len, SizeOf(Integer));
   SetLength(FItems[i].Anlass,len);
   Ms.Read(FItems[i].Anlass[1], len);
   Ms.Read(FItems[i].Betrag, SizeOf(Single));
   Ms.Read(FItems[i].Zinsen.Start, SizeOf(Double));
   Ms.Read(FItems[i].Zinsen.Intervall, SizeOf(Zinsintervall));
   Ms.Read(FItems[i].Zinsen.Kind, SizeOf(Zinsart));
   Ms.Read(FItems[i].Zinsen.Value, SizeOf(Integer));
   Ms.Read(FItems[i].Gezahlt, SizeOf(Boolean));
  end;
  
  Ms.Free; // Mit try-except etc hab ichs nicht so :D
end;
Wo liegt das Problem ?
Das Array FItems ist auch groß genug nach SetLength.. Aber was läuft denn da falsch ?

PS: Ach ja der Debugger bleibt bei beim zweiten mal beim ersten SetLength stehn...

Gruß
Neutral General
Michael
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: AV bei Records laden

  Alt 27. Jun 2006, 18:05
folgendes ist ganz gefährlich:
FCount-1 Wenn FCount mal 0 ist ergibt "FCount - 1" einen Überlauf (oder nennt man das dann unterlauf?) und schon ist das Ergebnis recht groß und die Schleife wird zu oft ausgeführt.
Declariere FCount also lieber als Integer.

Die Speichernroutine würde fände ich doch recht nützlich. Ich hab das Gefühl das Speichern und laden übereinstimmen. Das erste laden kann klappen weil eventuell schon aus dem zweiten item gelesen wird. Beim zweiten Lesen liest du dann eventuell über den Stream hinaus.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: AV bei Records laden

  Alt 27. Jun 2006, 18:15
Mh ok.
Aber das bringt mich leider bei meinem Problem nicht weiter
Was mir auch aufgefallen ist bei der Speichern procedure (poste sie doch mal):

Delphi-Quellcode:
procedure TSchuldenliste.SaveToFile(Filename: String);
var MS : TMemoryStream;
    i, len : Integer;
begin
  MS := TMemoryStream.Create;
  // Anzahl der Einträge speichern
  Ms.Write(Count, SizeOf(Integer));

  for i:= 0 to Count-1 do begin
   len := Length(Items[i].Bei);
   Ms.Write(len, SizeOf(Integer));
   Ms.Write(Items[i].Bei[1], len);
   len := Length(Items[i].Anlass);
   Ms.Write(len, SizeOf(Integer));
   Ms.Write(FItems[i].Anlass[1], len);
   Ms.Write(FItems[i].Betrag, SizeOf(Single));
   Ms.Write(FItems[i].Zinsen.Start, SizeOf(Double));
   Ms.Write(FItems[i].Zinsen.Intervall, SizeOf(Zinsintervall));
   Ms.Write(FItems[i].Zinsen.Kind, SizeOf(Zinsart));
   Ms.Write(FItems[i].Zinsen.Value, SizeOf(Integer));
   Ms.Write(FItems[i].Gezahlt, SizeOf(Boolean));
  end;

  Ms.SaveToFile(Filename);
  Ms.Free;
end;
Wenn ich bei den Strings statt Items[i].Bei/Anlass FItems[i].Bei/Anlass benutze dann gibts schon beim speichern ne AV.. was ich irgendwie auch nicht verstehe.. bei allen anderen Variablen meckert der Compiler schon bei Items.Irgendwas weils kein var Parameter ist... Und bei den Strings klappts und man bekommst sogar Ärger wenn man FItems benutzt (AV)..

Gruß
Neutral General
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: AV bei Records laden

  Alt 27. Jun 2006, 18:17
Warum nimmst Du den einen Stream, wenn Du ein Record hast?
Da kannst Du den Record doch viel besser direkt speichern....

Frank
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: AV bei Records laden

  Alt 27. Jun 2006, 18:18
wie denn ?
Also ich hab im Forum geguckt und hab irgendwo gelesen das

Stream.WriteBuffer(Record, SizeOf(Recordtyp)); nicht funktioniert wenn im Record en String drin ist..
Michael
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: AV bei Records laden

  Alt 27. Jun 2006, 18:24
Zinsen.Value ist als Word deklariert, wird aber als Integer gelesen und gespeichert!

@SirThornberry
Ein Fehler tritt nur dann auf, wenn die Schleifenvariable eine vorzeichenlose Variable ist. Falls sie - wie im obigen Code geschehen - als vorzeichenbehaftete Variable deklariert wird, behandelt der Compiler auch die Grenzen als vorzeichenbehaftete Werte.

Vermeiden sollte man solche Konstruktionen trotzdem.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: AV bei Records laden

  Alt 27. Jun 2006, 18:27
[/delphi]
Zitat von Neutral General:
wie denn ?
Na so...:

Delphi-Quellcode:
{$A1}
var
  F : File of rSchulden;
Fd : file;
  S : rSchulden;
SA : array[0..9999] of rSchulden;
begin
  assignfile(f,'Mydat.dat');
  rewrite(f); // Reset

  for i:=0 to xyp do
   write(f,S);

  Closefile;
  // Oder
  assignfile(fd,'Mydat.dat');

  rewrite(fd,sizeof(RSchulden));
  Blockwrite(fd,SA[0],10000);
  Closefile(fd);

*Ungetestet nur getippt...

Frank
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: AV bei Records laden

  Alt 27. Jun 2006, 18:27
Oh das könnte das Problem sein! Mit Sicherheit ist das das Problem
Ich verbesser es mal.

EDIT: Hehe genau daran hats gelegen thx
Michael
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:32 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