Надо сделать коллекцию объектов, которые умеют вычитывать такие штуки (ну и писать, конечно). Читать, писать надо будет через TStream.
Набросок вот:
Код:
type
// Базовые классы.
TBase = class
public
procedure Read(AStream : TStream); virtual; abstract;
procedure Write(AStream : TStream); virtual; abstract;
end;
TBaseList = class(TBase)
private
FItems : TObjectList;
public
procedure Clear;
procedure Add(ABase : TBase); virtual; abstract;
procedure Remove(ABase : TBase); virtual; abstract;
procedure Delete(Index : Integer); virtual; abstract;
property Count : Integer read GetCount;
end;
// Параметр
TParam = class(TBase)
private
FValue : PChar;
FSize : Integer;
public
property Value : PChar read FValue write SetValue;
end;
// Оъект. Имя TObject уже зарезервированно, так что...
TFileObject = class(TBaseList)
public
procedure Add(ABase : TBase); override;
procedure Remove(ABase : TBase); override;
procedure Delete(Index : Integer); override;
property Items[Index : Integer] : TParam read GetItem;
end;
// Группа объектов
TGroup = class(TBase)
public
procedure Read(AStream : TStream); override;
procedure Write(AStream : TStream); override;
property Items[Index : Integer] : TFileClass read GetItem;
end;
// Ридер/райтер файла
TBinFile = class
private
FItems : TObjects;
public
procedure LoadFromFile(AFileName : String);
procedure SaveToFile(AFileName : String);
property Items[Index : Integer] : TGroup read GetItem;
property Count : Integer read GetCount;
end;
imlementation
procedure TBinFile.LoadFromFile(AFileName : String);
var
AStream : TFileStream;
ASig : Integer; // Маркер
ASize : Integer; // Размер
AEndBlock : Int64;
AGroup : TGroup;
begin
AStream := TFileStream.Create(AFileName,fmOpenRead);
Try
While AStream.Position <> AStream.Size Do
Begin
AStream.ReadBuffer(ASig,SizeOf(Integer));
AStream.ReadBuffer(ASize,SizeOf(Integer));
If ASig = 12345 Then // Если это группа объектов
Begin
AEndBlock := AStream.Position + ASize;
While AStream.Position <> AEndBlock Do
Begin
AGroup := TGroup.Create;
AGroup.Read(AStream);
FItems.Add(AGroup);
End;
End;
End;
Finally
AStream.Free;
End;
end;
Как-то так...
Естественно, все это условно и нужна более точная инфо о структуре файла. Ну и если есть желание получить готовый результат, то велкам в раздел "Работа".