Показать сообщение отдельно
  #4  
Старый 02.08.2010, 20:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,090
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Надо сделать коллекцию объектов, которые умеют вычитывать такие штуки (ну и писать, конечно). Читать, писать надо будет через 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;

Как-то так...
Естественно, все это условно и нужна более точная инфо о структуре файла. Ну и если есть желание получить готовый результат, то велкам в раздел "Работа".
Ответить с цитированием