Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Inhalt wird nicht gespeichert? (https://www.delphipraxis.net/115844-inhalt-wird-nicht-gespeichert.html)

mo_greene 18. Jun 2008 20:51


Inhalt wird nicht gespeichert?
 
Hallo,

wie ihr sicherlich schon mitbekommen habt, bin ich gerade ziemlich intensiv am Programmieren.

Leider habe ich mal wieder ein Problem: Ich speicher diverse Inhalte in einem Filestream und lese die auch wieder aus.

Der Inhalt des folgenden Edit-Feldes wird leider nicht gespeichert und ich weiß irgendwie nicht warum nicht? :(

Delphi-Quellcode:
GesMengeEdt.Text := IntToStr(sum);
Hier wird der Inhalt des Edit-Feldes in eine Variable geschrieben:

Delphi-Quellcode:
cock.SetGesMenge(GesMengeEdt.Text);

Delphi-Quellcode:
procedure cock.SetGesMenge (n : string);
begin
  GesMenge := n;
end;

Hier wird der Inhalt (neben vielen anderen Sachen) gespeichert:

Delphi-Quellcode:
  FS.Write(GesMenge,sizeOF(GesMenge));

Leider erscheint in der .dat Datei nichts. Alles andere, was ich so abspeicher, steht in der .dat Datei drin. Jedoch der Inhalt des o.g. Edit-Feldes nicht.

Woran kann das liegen? :(

mkinzler 18. Jun 2008 20:52

Re: Inhalt wird nicht gespeichert?
 
Zeig mal das komplette Codefragment

mo_greene 18. Jun 2008 20:53

Re: Inhalt wird nicht gespeichert?
 
Codefragment von?

mkinzler 18. Jun 2008 20:55

Re: Inhalt wird nicht gespeichert?
 
Des ganzen Vorgangs der Speicherung ( von der Erzeugung des Streams bis zum Schliessen desgleichen)

mo_greene 18. Jun 2008 20:57

Re: Inhalt wird nicht gespeichert?
 
Zitat:

Zitat von mkinzler
Des ganzen Vorgangs der Speicherung ( von der Erzeugung des Streams bis zum Schliessen desgleichen)

Ich denke, dass dies nicht nötig ist, da die Speicherung der restlichen Elemente funktioniert.

Delphi-Quellcode:

procedure TAuto.InDateiSchreiben (var Fs : TFilestream);
(* -------------------------------------------------------------------- *)
var
  i : integer;
begin
  FS.Write(Name, sizeOF(Name));
  FS.Write(Kennzeichen, sizeOF(Kennzeichen));
  FS.Write(GeschGer, sizeOF(GeschGer));
  FS.Write(Farbe, sizeOF(Farbe));
  FS.Write(Preis, sizeOF(Preis));
  FS.Write(DX, sizeOF(DX));
  FS.Write(GesMenge,sizeOF(GesMenge)); //wird, wie gesagt nicht gespeichert :(
Delphi-Quellcode:
procedure TListe.Store(Dateiname : string);
(* -------------------------------------------------------------------- *)
var Elem : TElement;
    Fs   : TFilestream;

begin
  DeleteFile(Dateiname);
  Fs := TFilestream.Create(Dateiname, fmCreate);

  if not IsEmpty
  then begin
         Fs.Write(Lilaenge, SizeOf(Lilaenge));
         First;
         while NOT EoList do
         begin
           Elem := GetElement;
           Elem.InDateiSchreiben (Fs);
           inc(AktuellePos);
         end;
       end;
  Fs.Free;
end;

mkinzler 18. Jun 2008 21:01

Re: Inhalt wird nicht gespeichert?
 
Dieser Klassenmethgodenaufruf wird nicht funktionieren:
Delphi-Quellcode:
cock.SetGesMenge(GesMengeEdt.Text);

mo_greene 18. Jun 2008 21:02

Re: Inhalt wird nicht gespeichert?
 
Warum nicht?

Ich habe ihn soeben geändert:

Delphi-Quellcode:
Auto.SetGesMenge(GesMengeEdt.Text);

FAlter 18. Jun 2008 21:02

Re: Inhalt wird nicht gespeichert?
 
Hi,

das übliche Problem: Ein String ist ein Zeiger. Den speicherst du, nicht den Inhalt des Strings.

Mfg
FAlter

mo_greene 18. Jun 2008 21:03

Re: Inhalt wird nicht gespeichert?
 
Zitat:

Zitat von FAlter
Hi,

das übliche Problem: Ein String ist ein Zeiger. Den speicherst du, nicht den Inhalt des Strings.

Mfg
FAlter

Und was heißt das? Ich mach es doch nicht anders, als mit den anderen Inhalten?? :cry:

mkinzler 18. Jun 2008 21:05

Re: Inhalt wird nicht gespeichert?
 
Delphi-Quellcode:
Warum nicht?
Dem Code nach heißt die Klasse cock

mo_greene 18. Jun 2008 21:07

Re: Inhalt wird nicht gespeichert?
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
Warum nicht?
Dem Code nach heißt die Klasse cock

Ja, wie gesagt, dass war nur eine Sache die ich hier im Forum geändert hatte. Im Programm ist dieser Aufruf richtig.


Selbst wenn das Programm hier ist:

Delphi-Quellcode:
  FS.Write(GesMenge,sizeOF(GesMenge));
Befindet sich in der Variable GesMenge der richtige Wert :?

@ FAlter, Könntest du mir das genauer erläutern, was du geschrieben hast?

Die Muhkuh 18. Jun 2008 21:09

Re: Inhalt wird nicht gespeichert?
 
Hi,

um Strings in einen Stream zu schreiben, hab ich folgenden Classhelper:

Delphi-Quellcode:
unit uclasshelpers;

interface

uses
  Classes;

type
  // Klassenhelfer für den TStream um Strings komfortabel lesen und schreiben zu können
  TStreamHelper = class helper for TStream
  public
    procedure WriteString(const aString: string);
    function ReadString: string;
  end;

implementation

{ TStreamStringWriter }

// Liest einen String aus und gibt ihn zurück
function TStreamHelper.ReadString: string;
var
  len: Integer;
begin
  ReadBuffer(len, SizeOf(Integer));
  SetString(Result, PChar(nil), len);
  ReadBuffer(Pointer(Result)^, len);
end;

// Schreibt einen String in den Stream
procedure TStreamHelper.WriteString(const aString: string);
var
  len: Integer;
begin
  len := Length(aString);
  WriteBuffer(len, SizeOf(Integer));
  WriteBuffer(PChar(aString)^, len);
end;

end.

mo_greene 18. Jun 2008 21:11

Re: Inhalt wird nicht gespeichert?
 
Ja nur ich versteh ich nicht wo mein Fehler liegt, wenn es sonst mit den anderen Elementen funktioniert? In der dat Datei steht alles richtig drin, nur dieser eine Wert des einen Edit-Feldes fehlt!?

Beim lesen findet er dann diesen Wert nicht mehr:

Delphi-Quellcode:
FS.Read(GesMenge, sizeOF(GesMenge));

mkinzler 18. Jun 2008 21:12

Re: Inhalt wird nicht gespeichert?
 
Ist GesMenge eine Eigenschaft der Klasse? Typ?
Zitat:

@ FAlter, Könntest du mir das genauer erläutern, was du geschrieben hast?
sizeOf() eines Zeigers ergibt immer 4. Dürfte bei einem String dank compiler magic nicht passieren.
Beim lesen findet er den Wert nicht mehr:
Delphi-Quellcode:
FS.Read(GesMenge, sizeOF(GesMenge));
Ist ja auch logisch. Vor dem Lesen ist der String auch leer. Du musst die Länge mit in den Stream speichern. Zudem würde ich bei Strings die Länge und nicht sizeOf nehmen.

mo_greene 18. Jun 2008 21:13

Re: Inhalt wird nicht gespeichert?
 
GesMenge ist in der selben Klasse in der auch die Speicher-Prozedur aufgerufen wird.

mo_greene 18. Jun 2008 21:22

Re: Inhalt wird nicht gespeichert?
 
Zitat:

Zitat von mkinzler
Ist ja auch logisch. Vor dem Lesen ist der String auch leer. Du musst die Länge mit in den Stream speichern. Zudem würde ich bei Strings die Länge und nicht sizeOf nehmen.

Ja ok, aber warum funktioniert es mit allen, außer mit dem einen?

Delphi-Quellcode:
procedure TAuto.InDateiSchreiben (var Fs : TFilestream);
(* -------------------------------------------------------------------- *)
var
  i : integer;
begin
  FS.Write(Name, sizeOF(Name));
  FS.Write(Kennzeichen, sizeOF(Kennzeichen));
  FS.Write(GeschGer, sizeOF(GeschGer));
  FS.Write(Farbe, sizeOF(Farbe));
  FS.Write(Preis, sizeOF(Preis));
  FS.Write(DX, sizeOF(DX));
  FS.Write(GesMenge,sizeOF(GesMenge)); //wird, wie gesagt nicht gespeichert :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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