Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

Чтение из потока в разных форматах.   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.039 c
14-1103282454
TUser
2004-12-17 14:20
2005.01.09
Никому монитор не нужен?


14-1103586406
Алексей
2004-12-21 02:46
2005.01.09
запись на cd-r


14-1103470093
mrX
2004-12-19 18:28
2005.01.09
Вопрос по мат. анализу


14-1103187253
Prohodil Mimo
2004-12-16 11:54
2005.01.09
Где Думкин берёт инфу для "С днем рождения!"?


1-1102430073
Aser
2004-12-07 17:34
2005.01.09
Как включить WordWrap в TSynEdit? (Delphi-подобный RichEdit)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский