Главная страница
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.042 c
14-1103273600
Cosinus
2004-12-17 11:53
2005.01.09
Написать базу данных БЕЗ использования баз данных :)))


1-1103647618
Илья
2004-12-21 19:46
2005.01.09
IOResult = 103


14-1103370738
Hypercube
2004-12-18 14:52
2005.01.09
Перевод C++ > Delphi


4-1101031337
InfMag
2004-11-21 13:02
2005.01.09
Как убрать из окна, которое слево от трея мою прогу?


14-1103568792
Profi
2004-12-20 21:53
2005.01.09
Возможно ли сделать на Pascal е