Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.129 c
1-1103564105
Roo
2004-12-20 20:35
2005.01.09
Косяк с высотой Edit-ов


1-1102758115
Kolan
2004-12-11 12:41
2005.01.09
Мне кажется так делать нельзя, подскажите как нодо.


14-1103399463
Nous Mellon_
2004-12-18 22:51
2005.01.09
Страсти по МПх


1-1103698035
WondeRu
2004-12-22 09:47
2005.01.09
Как поменять цвет текста в консоли?


3-1102414645
Dmitriy O.
2004-12-07 13:17
2005.01.09
DataSourse у Query