Текущий архив: 2005.01.09;
Скачать: CL | DM;
Вниз
Чтение из потока в разных форматах. Найти похожие ветки
← →
Unknown user © (2004-12-22 18:29) [0]Если объект, который умеет сохранять и считывать данные из потока в разных форматах, как лучше указывать какой тип данных в потоке? Правильно ли поступать так как это сделал я? Привожу код:
//типы данных используемых при чтении/записи в файл/поток
TDataType=(dtAUT,dtEDT,dtITM,dtRTF,dtTXT,dtTXT_WIN1251,dtTXT_KOI8,
dtTXT_DOS866,dtTXT_ISO28595,dtIMG,dtIMG_BMP,dtIMG_JPG,
dtIMG_WMF,dtIMG_EMF,dtIMG_ICO);
//dtAUT-попытка определить формат файла по его расширению и сигнатуре
//dtEDT-родной формат редактора
//dtITM-итем сохраненный в отдельном файле
//dtTXT-простой текст, кодировка которого определяется автоматически
//dtTXT_WIN1251,dtTXT_DOS866,dtTXT_KOI8,
//dtTXT_ISO28595-текст в заданных кодировках
//dtRTF-RTF формат
//dtIMG-изображение, формат которого определяется автоматически
//dtIMG_BMP,dtIMG_JPG,dtIMG_EMF,dtIMG_ICO-графические объекты
TItem=class(TPersistent)
TTextItem=class(TItem)
TCell=class(TTextItem)
//******************************************************************************
procedure TItem.LoadFromStream(Stream:TStream; DataType:TDataType);
begin
//в LoadFromStream нужно точно указывать тип данных
if DataType=dtAUT
then raise Exception.Create(SUnknownDataFormat);
//удаляем содержимое итема
Clear;
if DataType in [dtEDT,dtITM] then begin
//используя формат dtEDT(формат файла документа, где
//хранится список итемов), заголовок итема считывается
//TDocument и на его основе определяется тип и создается
//новый итем, который затем считывает себя из потока
//при использовании формата dtITM заголовок
//надо прочитать самостоятельно
if DataType=dtITM then begin
//считываем сигнатуру файла
SetString(Sign,nil,SizeOf(cItmSignature));
Stream.Read(Pointer(Sign)^,SizeOf(cItmSignature));
if Sign<>cItmSignature then
raise Exception.Create(SInvalidItemFormat);
Stream.Read(Hdr,SizeOf(Hdr));
//считываем сигнатуру итема и проверяем ее правильность
Stream.Read(Hdr,SizeOf(Hdr));
if ClassBySignature(Hdr)<>Self.ClassType
then raise Exception.Create(SInvalidItemFormat);
end;
...
//чтение из потока
...
end; {if}
end;
//******************************************************************************
procedure TTextItem.LoadFromStream(Stream:TStream; DataType:TDataType);
begin
inherited;
case DataType of
dtITM,dtEDT:begin
...
//чтение из потока
...
end;
dtTXT..dtTXT_ISO28595: ReadTXT(Stream,DataType);
end; {case}
end;
//******************************************************************************
procedure TCell.LoadFromStream(Stream:TStream; DataType:TDataType);
begin
inherited;
//итем-ячейку нельзя сохранить в отдельном файле
if DataType=dtITM
then raise Exception.Create(SErrorCellFormat)
else if DataType<>dtEDT then exit;
...
//чтение из потока
...
end;
← →
Unknown user © (2004-12-23 18:35) [1]Кто-то работал с потоками? Почему в VCL нет примеров чтения/записи в поток данных в разных форматах?
← →
Юрий Зотов © (2004-12-23 20:08) [2]В самом начале потока, перед собственно данными, можно записать, например, значение переменной типа TDataType. При чтении она позволит определить фактический формат данных в потоке и, соответственно, способ их чтения.
А вопрос "Почему в VCL нет примеров чтения/записи в поток данных в разных форматах?" - наверное, стоит перевести на английский язык и задать Borland"у.
← →
Unknown user © (2004-12-24 15:26) [3]2 Юрий Зотов. Спасибо.
Страницы: 1 вся ветка
Текущий архив: 2005.01.09;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.035 c