Problem z zapisaniem tablicy do pliku.

0
type
  TDimentions = record
    Width : Integer;
    Height: Integer;
    Left : Integer;
    Top : Integer;
  end;
  TMyRecord = packed record
    D: array of TWallDimentions;
  end;
var F: File of TMyRecord;
     L: TLvlRecord;    
     I: Integer;
begin
  SetLength(L.D, Lst1.Items.Count);

  for I := 0 to lst1.Items.Count - 1 do
    begin
      L.D[I].Left := TShape(FindComponent(lst1.Items[I])).Left;
      L.D[I].Top := TShape(FindComponent(lst1.Items[I])).Top;
      L.D[I].Width := TShape(FindComponent(lst1.Items[I])).Width;
      L.D[I].Height := TShape(FindComponent(lst1.Items[I])).Height;
    end;
  AssignFile(F, ExtractFilePath(Application.ExeName) + edt4.Text);
  try
    try
      Rewrite(F);
      Write(F, L);
    finally
      CloseFile(F);
    end;
  except
    ShowMessage('nie dało się');
  end;
end;

W lst1 Mam listę komponentów typu TShape. Chce je (tzn. ich wymiary) zapisać do pliku, ale bezczelnie wywala mi błąd [Error] Unit1.pas(99): Type 'TMyRecord' needs finalization - not allowed in file type. Jak temu zaradzić?

0

Proszę moderatora żeby zmienił

  TMyRecord = packed record
    D: array of TWallDimentions;
  end;

na

  TMyRecord = packed record
    D: array of TDimentions;
  end;

i

var F: File of TMyRecord;
     L: TLvlRecord;

na

var F: File of TMyRecord;
     L: TMyRecord;
0

Nie wiem czy w ogóle można zapisywać arraye bezpośrednio tak na chama, więc daj tak:

TMyRecord=TDimentions;
[...]
for i:=0 to length(l)-1 do write(f,l[i]);

poza tym, zauważ że jeśli nie uda się rewritować pliku to mimo to go będzie usiłować zamknąć co oczywiście się nie uda.

EDIT:

ale bezczelnie wywala mi błąd

Linia 99? Tylko która to?!?!

0
var F: File of TMyRecord;
0

Jaką resztę rzeczy?

1

Jeżeli wywala Type 'TMyRecord' needs finalization - not allowed in file type, to polecałbym pobawić się z funkcją SizeOf oraz BlockWrite/BlockRead
Tak, czy siak i tak będziesz musiał kiedyś ich użyć...
BTW, a błąd wywala, ponieważ podczas zapisu Write/WriteLn WSZYSTKO musi mieć z góry ustalony rozmiar.

D: array of TWallDimentions;

Wg.funkcji Write jest to tablica nieskończona, więc jej zapisanie jest niemożliwe.
Musiałbyś zrobić coś takiego:

  TMyRecord = packed record
    D: array of TWallDimentions;
    Count: Integer; //Count to ilość rekordów (Count := High(D))
  end;

I pobawić się BlockWrite/BlockRead
Poszukaj, a znajdziesz masę gotowych kodów do takiego zapisu.

0
Patryk27 napisał(a)

Wg.funkcji Write jest to tablica nieskończona, więc jej zapisanie jest niemożliwe.
mylisz się, z "punktu widzenia funkcji" write jest to wskaźnik i taki też wskaźnik zostanie zapisany do pliku. po odczytaniu oczywiście będzie wskazywał na stare, aktualnie już nieprawidłowe, miejsce. taki problem wystąpi z każdą tablicą dynamiczną (w tym string), obiektami i jawnie zadeklarowanymi wskaźnikami. każdy element takiej tablicy/obiektu trzeba serializować osobno.

1 użytkowników online, w tym zalogowanych: 0, gości: 1