TWriter vs TIniFile ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

TWriter vs TIniFile ?

Beitrag von pluto »

Hallo,
bei einem Projekt, wollte ich eine Karte die als 2D Array vorliegt in ein Binäre Datei schreiben per TWriter. Das ging je doch nicht. Wenn ich jetzt am Rand Objekte Plaziert haben fehlten immer die Letzten in der Rechten unteren Ecke. Dann habe ich es mit TIniFile Probiert und siehe da, da geht es. Die beiden Speicher Funktionen sehen so aus:

Code: Alles auswählen

procedure TPLGameLevel.SaveToFile(const aFileName: String);
var
  x,y,id:Integer;
  fs:TFileStream;
  fsW:TWriter;
  str:String;
begin
  y:=0; x:=0;
  if FileExists(aFileName) then
    DeleteFile(aFileName);
  fs:=TFileStream.Create(aFileName,fmCreate);
  fs.Position:=0;
  fsW:=TWriter.Create(fs,120);
  fsW.WriteInteger(Length(map)); // Höhe, Breite
  fsW.WriteInteger(Length(map[0]));
  for x:=0 to Length(Map)-1 do begin
    for y:=0 to Length(Map[x])-1 do begin
      if Assigned(Map[x,y]) then begin
        fsW.WriteInteger(x); fsW.WriteInteger(y);
        fsW.WriteInteger(map[x,y].id);
        writeln(x,'\',y,'\',map[x,y].id);
      end;
    end; // for x
  end; // for y
  FreeAndNil(fsW); FreeAndNil(fs);
end; // TPLGameLevel.SaveToFile 
 
procedure TPLGameLevel.SaveToIniFile(const aFileName: String);
var
  x,y:Integer;
  IniFile:TIniFile;
  str:string;
begin
  y:=0; x:=0;
  IniFile:=TIniFile.Create(aFileName);
  str:=IntToStr(Length(map)) + ',' + IntToStr(Length(map[0]));
  IniFile.WriteString('Data','Size',str);
  for x:=0 to Length(Map)-1 do begin
    for y:=0 to Length(Map[x])-1 do begin
      if Assigned(map[x,y]) then begin
        str:=IntToStr(x) + '|' + IntToStr(y) + '|' + IntToStr(map[x,y].id);
        IniFile.WriteString('Data','Item'+IntToStr(x)+','+IntToStr(y),str);
      end;
    end; // for y
  end; // for x
  IniFile.Free;
end; // TPLGameLevel.SaveToIniFile
Ich vermute bei der ersten Methode gibt es Probleme mit dem Buffer. Denn TWriter nutzt einen Buffer. In Delphi gibt es die Methode FlushBuffer, auf die habe ich in Lazarus jedoch kein zugrieff.
Also was mache ich Falsch ?
MFG
Michael Springwald

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: TWriter vs TIniFile ?

Beitrag von hendy »

Die procedure TPLGameLevel.SaveToIniFile(const aFileName: String);
dürfte eigentlich nicht funktionieren, da
hier: writeln(x,'',y,'\',map[x,y].id);
ein anführungszeichen fehlt
Dankt monta !!

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TWriter vs TIniFile ?

Beitrag von pluto »

Nein ! Der FPC meckert an dieser Stelle nicht bzw er gibt gar keine Fehler aus. Ich kann auch keinen Erkennen. Warum das hier Falsch da gestellt wird weiß ich nicht. Aber daran liegt es nicht. Weil die Ini Methoden habe ich erst später hinzugefügt.

edit01:

Code: Alles auswählen

writeln(x,'',y,'\',map[x,y].id);
Wo meinst du fehlt hier ein ' ?
MFG
Michael Springwald

Antworten