Советы по Delphi


              

действительно начинают работать только тогда,


/p> (загрузка выше в пустой список)

procedure TTest.StoreKnownList(Filename: string; List: TList);
var
S: TFileStream;R: TEnhReader;K: TKnownObject;begin
S := TFileStream.Create(Filename, fmOpenRead;R := TEnhReader.Create(S, 1024);R.ReadListBegin;with List dowhile not EndOfList dobeginK.Create;K.Load(R);Add(K);end;R.ReadListEnd;end;
Методы, которые я добавил к TReader/TWriter, действительно начинают работать только тогда, когда вы имеете дело с объектами двух и более классов (предок и потомок, разные классы от одного родителя и т.п.).

function TEnhReader.ReadStreamable: TStreamable
Читает из потока имя класса, вызывает FindClass для получения класса и затем создает его экземпляр. Затем вызывает Load для чтения данных объекта. Вероятно вы захотите объявить указатель на возвращаемое значение, имеющее тип последнего общего из всех возможных предков, *не* инициализуруйте это заранее.

procedure TEnhReader.ReadListItems(List: TList);
Список TList должен быть инициализированным, но пустым (будет вызван метод TList.Clear). Читает маркер StartOfList, затем вызывает ReadStreamable до тех пор, пока не достигнет маркера EndOfList, добавляет возвращаемые объекты в список к текущей позиции. Затем читает маркер EndOfList.

procedure TEnhWriter.WriteStreamable(AObj: TStreamable);
Записывает имя класса объекта в поток, затем вызывает Store для записи данных.

procedure TEnhWriter.WriteListItems(List: TList);
Записывает маркер StartOfList, в цикле приводит элементы списка к типу TStreamable и вызывает WriteStreamable для их записи. И, наконец, записывает маркер в конец списка.

--Вырезано--

{Базовый класс и его расширения для работы с потоковыми объектами}

{Авторские права принадлежат Don Croyle}
unit Strmstuf;

interface

uses
Classes;

type
TEnhReader = class;TEnhWriter = class;
TStreamable = class(TPersistent)publicprocedure Load(R: TEnhReader); virtual;procedure Store(W: TEnhWriter); virtual;end;
TStreamableClass = class of TStreamable;
TEnhReader = class(TReader)publicprocedure ReadListItems(List: TList);function ReadStreamable: TStreamable;end;
TEnhWriter = class(TWriter)publicprocedure WriteListItems(List: TList);procedure WriteStreamable(AObj: TStreamable);end;
implementation

procedure
TStreamable.Load(R: TEnhReader);
begin
end
;

procedure TStreamable.Store(W: TEnhWriter);
begin
end
;

procedure TEnhReader.ReadListItems(List: TList);
begin
ReadListBegin;with List dobeginClear;while not EndOfList doAdd(ReadStreamable);end;ReadListEnd;end;

function TEnhReader.ReadStreamable: TStreamable;
begin
Result := TStreamableClass(FindClass(ReadString)).Create;if Result <> nil then Result.Load(Self);end;

procedure TEnhWriter.WriteListItems(List: TList);
var
I: Integer;begin
WriteListBegin;with List dofor I := 0 to Count -1 doWriteStreamable(TStreamable(Items[I]));WriteListEnd;end;

procedure TEnhWriter.WriteStreamable(AObj: TStreamable);
begin
WriteString(AObj.ClassName);AObj.Store(Self);end;

end.
--Вырезано-- [000576]


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





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий