Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #4  
Старый 02.08.2010, 20:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,107
Версия 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;

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


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:03.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025