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

Вниз

TFileStream.Create или еще чего?   Найти похожие ветки 

 
Pavelkq   (2004-12-27 09:18) [0]

Пытаюсь открывать вордовский файл. Чтение, как обычный текстовый файл не прокатывает. Пробую следующее:
procedure TForm1.Button1Click(Sender: TObject);
var name: string;
   S: TFileStream;
   Reader: TReader;
begin
 Memo1.Lines.Clear;
 if Form1.OpenDialog1.Execute then
   name := OpenDialog1.FileName;
 if name="" then exit;

 S:=TFileStream.Create(name,fmOpenRead);
 Reader := TReader.Create (S, 1024);
 Reader.ReadListBegin;
 while not Reader.EndOfList do
   Memo1.Lines.Add (Reader.ReadString);

 Reader.ReadListEnd;
 Reader.Destroy;
 S.Destroy;
end;

 Все компилируется, но при выполнении (когда уже выбран файл) вылетает ошибка с сообщением Invalid property value.
 Предполагаю, что тут объект TReader плохо подходит. А что делать? Мне нужно просто считать в строковую переменную весь набор символов для дальнейшего анализа (можно за несколько циклов, т.е. кусками).


 
Рамиль ©   (2004-12-27 09:27) [1]

Если тебе нужен текст, то читай через Word.


 
Pavelkq   (2004-12-27 09:35) [2]

Знаешь сколько времени ворд открывается? А если файлов 1500? А мне нужно вынуть всего лишь свойства.
 В общем, мне нужен любой метод чтения набора символов (или их кодов) можно даже по одному.


 
Рамиль ©   (2004-12-27 09:58) [3]

Pavelkq   (27.12.04 9:35) [2]
А зачем Word для каждого файла открывать?

А зачем тебе TReader понадобился? Он здесь совсем не к месту.
Используй TFileStream.Read


 
Pavelkq   (2004-12-27 10:01) [4]

Попробовал из справки пример:
procedure TForm1.Button1Click(Sender: TObject);
var
 H: Integer;
 iFileLength: Integer;
 iBytesRead: Integer;
 Buffer: PChar;
 i: Integer;
begin
 if OpenDialog1.Execute then
 begin
   try
     H := FileOpen(OpenDialog1.FileName, fmOpenRead);
     iFileLength := FileSeek(H,0,2);
     FileSeek(H,0,0);
     Buffer := PChar(AllocMem(iFileLength + 1));
     iBytesRead := FileRead(H, Buffer, iFileLength);
     FileClose(H);

     for i := 0 to iBytesRead-1 do
     begin
       Memo1.Lines.Add(String(Buffer[i]));
       Memo1.Lines.Add(IntToStr(Integer(Buffer[i])));
     end;
   finally
     FreeMem(Buffer);
   end;
 end;
end;


 На строке передачи в мемо все вылетает.

TFileStream.Read пробовал, но тоже не пойму до конца, как его юзать. Вот бы кусок живого кода!


 
Рамиль ©   (2004-12-27 10:19) [5]

Pavelkq   (27.12.04 10:01) [4]
Вот бы кусок живого кода!

Пожалуйста:)

var
 F: TFileStream;
 s: string;

 F := TFileStream.Create("C:\1.doc", fmOpenRead);
 SetLength(s, F.Size);
 F.Read(s[1], F.Size);

Но только ответственность за интерпретацию полностью на тебе.


 
Pavelkq   (2004-12-27 10:30) [6]

Сработало без ошибок, но после выполнения переменная S оказалась пустой. Очевидно, то, что попало из файла в память содержит #0, то интерпретируется, как конец. А вот до метода Read там были пустые данные. А без PCharа нельзя? Или как обойти этот #0?


 
Плохиш ©   (2004-12-27 10:41) [7]

array of byte


 
Рамиль ©   (2004-12-27 10:45) [8]

s[i] считает, потеряется до #0 если копировать присвоением в другую строку.
Или как
Плохиш ©   (27.12.04 10:41) [7]


 
Pavelkq   (2004-12-27 12:14) [9]

Ура, получилось и то и другое! Просто если просить вывести переменную S, как string, она выводит пустоту, т.к. не успев начаться заканчивается. А если в цикле выводить по одному символу, то там все на месте!
 Кстати, с байтом тоже все проходит на ура!
 Спасибо!



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.038 c
3-1103005982
Mefodiy
2004-12-14 09:33
2005.01.16
Пустой DBGrid при подключении к Oracle через dbExpress


14-1104389406
SLP
2004-12-30 09:50
2005.01.16
Аббревиатура в конференциях


3-1103097540
Denmin
2004-12-15 10:59
2005.01.16
Как передать значение вычисляемого поля в простое?


1-1104395389
pomashok
2004-12-30 11:29
2005.01.16
Текст на экране


14-1104314999
ОпенОфис
2004-12-29 13:09
2005.01.16
Стиль OpenOffice и др.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский