Советы по Delphi




FileReaderWriter-поток


Я скомпоновал небольшой модуль, облегчающий чтение и запись в поток объектов-не-компонентов. За основу взят базовый класс (TStreamable), имеющий пустые процедуры Load и Store, перекрываемые в потомках для выполнения специфических задач, плюс некоторые расширения классов TReader и TWriter, автоматизирующие работу с системными регистрами. Вы увидите это в нижней части этого совета. Надеюсь, вы найдете это полезным.

Процедуры Load и Store класса TStreamable и его потомков содержат параметры, делающие возможным чтение и запись методами классов TReader и TWriter (смотри файл помощи Component Writer's Help). Сохраняемая сущность меняется от класса к классу, поэтому для себя вы должны решить с чем вы будете работать.

Все классы, с которыми вы собираетесь работать через поток, должны быть зарегистрированы вызовом RegisterClass. Лично я это делаю в секции инициализации модуля, в котором определен данный класс.

Если еще во время разработки приложения вы знаете, объект какого класса вы будете сохранять/загружать и все, что вам нужно сделать, это инициализировать поток, filer и экземпляр объекта (только загрузка), то для этого можно использовать метод Load/Store.

Пример: (сохранение, FKnowObject - поле в TTest)

procedure TTest.StoreKnownObject(Filename: string);
var
S: TFileStream;W: TEnhWriter;begin
S := TFileStream.Create(Filename, fmOpenWrite);W := TEnhWriter.Create(S, 1024);FKnownObject.Store(W);W.Free;S.Free;end;

(загрузка объекта, сохраненного выше, предполагает, что до этого момента был осуществлен вызов FKnowObject.Create)

procedure TTest.LoadKnownObject(Filename: string);
var
S: TFileStream;R: TEnhReader;begin
S := TFileStream.Create(Filename, fmOpenRead;R := TEnhReader.Create(S, 1024);FKnownObject.Load(R); {перезаписываем все предыдущие данные объекта}R.Free;S.Free;end;

Имея список объектов, проще всего работать с ними в цикле.

Пример: (сохранение, список TKnownObjects)

procedure TTest.StoreKnownList(Filename: string; List: TList);
var
S: TFileStream;W: TEnhWriter;I: Integer;begin
S := TFileStream.Create(Filename, fmOpenWrite;W := TEnhWriter.Create(S, 1024);W.WriteListBegin;with List dofor I := 0 to Count -1 doTKnownObject(Items[I]).Store(W);W.WriteListEnd;W.Free;S.Free;end;
<


Содержание  Назад  Вперед