AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign FreePascal String aus TFileStream auslesen funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

String aus TFileStream auslesen funktioniert nicht

Ein Thema von hansklok · begonnen am 30. Dez 2010 · letzter Beitrag vom 31. Dez 2010
Antwort Antwort
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#1

String aus TFileStream auslesen funktioniert nicht

  Alt 30. Dez 2010, 14:10
Hallo,

seit 1h versuche ich krampfhaft den Fehler in einem Programmierversuch zu finden, aber ich entdecke ihn eben nicht.
Ich habe mehrere TPersons, die in einer Datei gespeichert werden. Zunächst nur das Geschlecht, Vor- & Nachname und eine Nummer. Das speichern funktioniert auch alles wunderbar, und das Laden scheinbar auch, allerdings bekomme ich keine String-Variablen (Vor- & Nachname) ausgelesen, warum??

Hier der Code:

uGenealogyProcedures.pas (Hilfs-Unit)
Delphi-Quellcode:
uses
  Classes;

  procedure StrToStream(AString: String; AStream: TFileStream);
  procedure StrFromStream(AString: String; AStream: TFileStream);

implementation

var
  Size: Integer;

procedure StrToStream(AString: String; AStream: TFileStream);
begin
  Size:= Length(AString);
  AStream.Write(Size, SizeOf(Integer));
  AStream.Write(AString[1], Size);
end;

procedure StrFromStream(AString: String; AStream: TFileStream);
begin
  AStream.Read(Size, SizeOf(Integer));
  if Size > -1 then begin
    SetLength(AString, Size);
    AStream.Read(AString[1], Size);
  end;
end;
uGenealogy.pas
Delphi-Quellcode:
uses
  Classes, Contnrs, SysUtils, uGenealogyProcedures;

type
  TSex = (sMale, sFemale, sUnknown);

  TGenealogyEntity = class(TPersistent)
    private
      fNumber: Integer;
    public
      property Number: Integer read fNumber write fNumber;

      procedure SaveToStream(AStream: TFileStream); virtual;
      procedure LoadFromStream(AStream: TFileStream); virtual;
  end;

  TPerson = class(TGenealogyEntity)
    private
      fSex: TSex;
      fFirstName,
      fLastName: String;
    public
      constructor Create(ASex: TSex; AFirstName, ALastName: String); overload;

      property Sex: TSex read fSex write fSex;
      property FirstName: String read fFirstName write fFirstName;
      property LastName: String read fLastName write fLastName;

      procedure SaveToStream(AStream: TFileStream); override;
      procedure LoadFromStream(AStream: TFileStream); override;

      function GetSex: String;
  end;

implementation

procedure TGenealogyEntity.SaveToStream(AStream: TFileStream);
begin
  AStream.Write(fNumber, SizeOf(Integer));
end;

procedure TGenealogyEntity.LoadFromStream(AStream: TFileStream);
begin
  AStream.Read(fNumber, SizeOf(Integer));
end;

constructor TPerson.Create(ASex: TSex; AFirstName, ALastName: String);
begin
  inherited Create;
  fSex:= ASex;
  fFirstName:= AFirstName;
  fLastName:= ALastName;
end;

procedure TPerson.SaveToStream(AStream: TFileStream);
begin
  AStream.Write(fSex, SizeOf(TSex));
  StrToStream(fFirstName, AStream);
  StrToStream(fLastName, AStream);
end;

procedure TPerson.LoadFromStream(AStream: TFileStream);
begin
  AStream.Read(fSex, SizeOf(TSex));
  StrFromStream(fFirstName, AStream);
  StrFromStream(fLastName, AStream);
end;

function TPerson.GetSex: String;
begin
  case fSex of
    sMale: Result:= 'Mann';
    sFemale: Result:= 'Frau';
    sUnknown: Result:= 'Unbekannt';
  end;
end;
uGenealogyFile.pas
Delphi-Quellcode:
uses
  Classes, Contnrs, SysUtils, uGenealogy;

type
  TGenealogyFile = class(TObject)
    private
      fFileName: String;
      fPersons: TObjectList;
    public
      constructor Create;

      property FileName: String read fFileName write fFileName;

      property Persons: TObjectList read fPersons write fPersons;

      procedure SaveToFile(AFileName: String);
      procedure LoadFromFile(AFileName: String);
  end;

implementation

var
  PersonCount, i: Integer;
  GenFile: TFileStream;

constructor TGenealogyFile.Create;
begin
  inherited Create;

  fPersons:= TObjectList.Create;
  fPersons.OwnsObjects:= True;
end;

procedure TGenealogyFile.SaveToFile(AFileName: String);
begin
  fFileName:= AFileName;
  GenFile:= TFileStream.Create(AFileName, fmCreate);

  GenFile.WriteBuffer(fPersons.Count, SizeOf(Integer));
  for i:= 0 to fPersons.Count - 1 do
    TPerson(fPersons.Items[i]).SaveToStream(GenFile);

  GenFile.Free;
end;

procedure TGenealogyFile.LoadFromFile(AFileName: String);
var
  Person: TPerson;
begin
  GenFile:= TFileStream.Create(AFileName, fmOpenRead);

  GenFile.ReadBuffer(PersonCount, SizeOf(Integer));
  for i:= 0 to PersonCount - 1 do
    begin
      Person:= TPerson.Create;
      Person.LoadFromStream(GenFile);
      fPersons.Add(Person);
    end;

  GenFile.Free;
end;
Und nun noch die Main-Unit.

uMain.pas
Delphi-Quellcode:
procedure TfMain.FormCreate(Sender: TObject);
begin
  Stammbaum:= TGenealogyFile.Create;
end;

procedure TfMain.bSavePersonClick(Sender: TObject);
var
  Person: TPerson;;
begin
  Person:= TPerson.Create(TSex(rgSex.ItemIndex), leFirstName.Text, leLastName.Text);
  Stammbaum.Persons.Add(Person);
end;

procedure TfMain.FormDestroy(Sender: TObject);
begin
  Stammbaum.Free;
end;

procedure TfMain.miOpenClick(Sender: TObject);
var
  i: Integer;
begin
  if OpenDialog1.Execute then
     begin
       Stammbaum.LoadFromFile(OpenDialog1.FileName);
       Stammbaum.FileName:= OpenDialog1.FileName;
       fMain.Caption:= IntToStr(Stammbaum.Persons.Count) + ' Personen'; // funktioniert
       for i:= 0 to Stammbaum.Persons.Count-1 do
         ListBox1.Items.Add(TPerson(Stammbaum.Persons[i]).LastName + ', ' + TPerson(Stammbaum.Persons[i]).FirstName +
         ' (' + TPerson(Stammbaum.Persons[i]).GetSex + ')'); // bis auf das Geschlecht werden keine Namen angezeigt
     end;
end;

procedure TfMain.miSaveAsClick(Sender: TObject);
begin
  if SaveDialog1.Execute then
     Stammbaum.SaveToFile(SaveDialog1.FileName);
end;

procedure TfMain.miSaveClick(Sender: TObject);
begin
  if Stammbaum.FileName <> 'then
     Stammbaum.SaveToFile(Stammbaum.FileName)
  else
    miSaveAs.Click;
end;
Vielleicht kann mir bitte einer von Euch helfen. Ich bin ganz irritiert, da ich sonst immer auf diesem simplen Gerüst meine Dateiarbeiten durchführe und bis jetzt nie Probleme damit hatte.

HG hansklok

Geändert von hansklok (30. Dez 2010 um 14:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

AW: Ich finde den Fehler nicht!

  Alt 30. Dez 2010, 14:14
Bitte gebe deinem Beitrag einen aussagekräftigen Titel.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: String aus TFileStream auslesen funktioniert nicht

  Alt 30. Dez 2010, 15:04
Du musst den String-Parameter in StrFromStream als var deklarieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#4

AW: String aus TFileStream auslesen funktioniert nicht

  Alt 30. Dez 2010, 15:20
Vielen lieben Dank. Das ist eigentlich voll peinlich, das hätte mir selbst auffallen müssen. Danke, manchmal liegt eben der Hund im Detail vergraben.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

AW: String aus TFileStream auslesen funktioniert nicht

  Alt 30. Dez 2010, 16:14
Zitat:
function TPerson.GetSex
Sollte das nicht eherfunction TPerson.GetGender heißen? Das klingt nicht so schlüpfrig
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: String aus TFileStream auslesen funktioniert nicht

  Alt 31. Dez 2010, 02:59
Zitat:
function TPerson.GetSex
Sollte das nicht eherfunction TPerson.GetGender heißen? Das klingt nicht so schlüpfrig
Mich wundert, dass das überhaupt geht.

Ich hätte gedacht daraus macht die IDE automatisch TPerson.GetPiep
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 02:34 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