[Delphi] Zapis rekordów do pliku oraz szybkość

0

Witam, potrzebuję stworzyć małą bazę danych z której układ prezentuje się następująco:

-baza
	-poziomA
		-poziomA1
		-poziomB2
	-poziomB
		-poziomB[1]
			-poziomB1
			-poziomB2
		-poziomB[2]
			-poziomB1
			-poziomB2
		-poziomB[3]
			-poziomB1
			-poziomB2
		- (...)

Poziom A ma zawsze 2 pod poziomy, natomiast poziom B ma mieć zmienną ilość i tutaj jest mój problem, gdyż Delphi przy zapisie/odczycie takich danych chce mieć od razu podaną długość tej tablicy.
Takie mam zadeklarowane typy w Delphi:

type
  TPoziomA = Packed Record
    PoziomA1: string[100];
    PoziomA2: string[100];
  end;

  TPoziomB = Packed Record
    PoziomB1: String[100];
    PoziomB2: String[100];
  end;

  TBaza = Packed Record
    PoziomA: TPoziomA;
    PoziomB: array[0..2] of TPoziomB; // Tutaj Delphi wymaga podania ilości
  end;

Kolejnym problemem jest też, ze chciałbym mieć zmienną długość pola np. PoziomB1, a nie z góry ustaloną String[100].

A to mój kod do zapisu:

var
  Plik: File of TBaza;
  i: Integer;
begin

  AssignFile(Plik, 'F:\PlikBazy.dat');
  Rewrite(Plik);
  try
    Write (Plik, Poziom);
  finally
   CloseFile(Plik);
  end;

Jak mu usunę informacjie o wielkości tablicy to wyrzuca błąd:
E2155 Type 'TBaza' needs finalization - not allowed in file type
Normalnie wszystko działa, jednak zależy mi na tym, aby Poziom B miał zmienną długość tablicy, tylko nie mam pomysłu jak rozwiązać ten problem.

Tutaj takie pytanie trochę odbiegające od tematu co jest bardziej wydajnie używać plików .INI, .XML czy takie jak próbuję stworzyć?

Z góry dziękuję za pomoc.
Pozdrawiam noxwow

0

Poczytaj o BlockWrite oraz BlockRead (zapis/odczyt).
Tylko zapis za pomocą tego sposobu jest dosyć trudny...

0
var
  Plik: File of TBaza;

takiego czegoś nie da się zrobić w postaci file of cośtam. Plik typowany sprawdza się tylko dla całkowicie powtarzalnych rekordów.

Musisz użyć file of byte albo file a potem blockwrite/blockread, albo integer a potem filewrite. To drugie API (fileopen/fileread/filewrite/fileclose) operuje na uchwytach typu integer i jest wygodniejsze, bo mniej bałaganiarskie.

0
Azarien napisał(a)
var
  Plik: File of TBaza;

takiego czegoś nie da się zrobić w postaci file of cośtam. Plik typowany sprawdza się tylko dla całkowicie powtarzalnych rekordów.

Musisz użyć file of byte albo file a potem blockwrite/blockread, albo integer a potem filewrite. To drugie API (fileopen/fileread/filewrite/fileclose) operuje na uchwytach typu integer i jest wygodniejsze, bo mniej bałaganiarskie.

Z takimi plikami straci się całą strukturę danych i kontrola nad nimi będzie bardzo trudna. Najlepiej jest zamiast plików użyć bazy danych. One mają wbudowany typ łańcuchowy o zmiennej długości VARCHAR.

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