tlist items mit blockwrite / blockread problem [SOLVED]

Rund um die LCL und andere Komponenten
Antworten
zerobyte
Beiträge: 2
Registriert: Di 3. Sep 2013, 15:54

tlist items mit blockwrite / blockread problem [SOLVED]

Beitrag von zerobyte »

ich bin gerade dabei, meine alten delphi 5 projekte auf lazarus zu portieren.
ich habe eine selbstgeschriebene graph-komponente, die den inhalt einer tlist mit hilfe von blockwrite und blockread schreibt und liest. in lazarus funktioniert das nicht mehr. ich hab schon x verschiedene varianten durchprobiert, aber irgendwie steh ich auf dem schlauch.

Code: Alles auswählen

type
  pmypoint = ^tmypoint;
  tmypoint = record
   XValue:double;
   YValue:double;
  end;
...
implementation
...
list:=tlist.create;
...
 
procedure TFastGraph.Savetofile(afilename:string);
var f:file;
    I,j,k:integer;
begin
 Assignfile(f,afilename);
 rewrite(f,1);
...
 for j:=0 to List.Count-1 Do blockwrite(f,list.Items[j]^,sizeof(list.Items[j]^));    // <- ???
...
 Closefile(f);
end;
 
procedure TFastGraph.Loadfromfile(afilename:string);
var f:   file;
    I,j,k: Integer;
    p:pmypoint;
begin
 Assignfile(f,afilename);
 reset(f,1);
...
  for j:=0 to tmp[i]-1 Do begin
   new(p);
   blockread(f,p^,sizeof(p^));                                     // <- ???
   List.Add(p);
  end;
...
 Closefile(f);
end;
 
vielleicht findet einer von euch ja den fehler...? :)

Danke, 00h
Zuletzt geändert von zerobyte am Mi 4. Sep 2013, 08:45, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 5177
Registriert: Fr 8. Apr 2011, 09:01

Re: tlist items mit blockwrite / blockread problem

Beitrag von wp_xyz »

Was ist tmp in "LoadFromFile"? Offenbar die Anzahl der Einträge. Aber woher weiß dein Programm, wieviele Einträge in der Datei stehen? Ich würde stattdessen solange lesen, bis das Ende der Datei erreicht wird:

Code: Alles auswählen

 
 Assignfile(f,afilename);
 reset(f,1);
 while not Eof(f) do begin
   new(p);
   blockread(f,p^,sizeof(p^));         
   List.Add(p);
 end;
 Closefile(f);
 
Oder du must im "SaveToFile" zuerst die Anzahl der Elemente in die Datei schreiben, und im "ReadFromFile" zuerst auslesen.

Beim "SaveToFile" musst du wahrscheinlich einen Typecast zu pmypoint machen, weil list.Items[] nur pointer sind, die du so nicht dereferenzieren kannst:

Code: Alles auswählen

 
 for j:=0 to List.Count-1 Do blockwrite(f,pmypoint(list.Items[j])^,sizeof(pmypoint(list.Items[j])^));    
 

zerobyte
Beiträge: 2
Registriert: Di 3. Sep 2013, 15:54

Re: tlist items mit blockwrite / blockread problem

Beitrag von zerobyte »

danke, der typecast mit pmypoint()^ war die richtige variante.

die tatsaechlichen prozeduren sind um einiges laenger. ich wollte nur den post nicht sinnlos vollmuellen. mal schauen, wenn ich das ding vollstaendig auf lazarus zum laufen gebracht habe, wollte ich komponente der allgemeinheit zur verfuegung stellen. aber da muss ich erst noch den quelltext etwas ausmuellen und kommentieren.

gruesse, 00h

Antworten