Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
1-1104314800
grigory
2004-12-29 13:06
2005.01.16
Crystal reports в DELPHI!


9-1096010438
Warchief
2004-09-24 11:20
2005.01.16
Произвольные текстурные координаты кадра в PD3


1-1104402433
Cardinal
2004-12-30 13:27
2005.01.16
Массив как параметр функции


1-1103876185
whiteswan
2004-12-24 11:16
2005.01.16
не запускается прога в вин98. работаю в винХП,дельфи6.


3-1103140378
bartalby
2004-12-15 22:52
2005.01.16
Access! rs.FindFirst. Ошибки!