Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Кодировка что ли? [D6, Win2k]


Pavelkq ©   (2004-12-23 13:23:00) 

Пишу программу обработки большого количества вордовских файлов. Точнее все нужно вынуть их свойства. Сделал это через создание объекта word.application и потом уже нужные свойства выбираю. Но файлов 1500. Поэтому процедура открытия и закрытия файлов занимает очень много времени. Посмотрел вьювером и увидел, что свойства можно (наверное) получить прямо из файла, как текстогово.

procedure TForm1.Button1Click(Sender: TObject);
var name: string;
   F: textfile;
   s: string;
   i: integer;
begin
if Form1.OpenDialog1.Execute then
 name := OpenDialog1.FileName;
 AssignFile(F, name);
 Reset(F);
 while not eof(F) do
 begin
   Readln (F,s);
   for i:=1 to length(s) do
   if copy(s,i,8)='Тестовый' then
     Memo1.Lines.Add(s);
 end;
 CloseFile(f);
end;

Слово Тестовый- это название документа в свойствах. После выполнения в Меме1 чисто. Зато, если прошу просто вывести в Мему все подряд, то это слово там отображается в нормальной кодировке.
 Во вьювере вижу его, как ANSI.
 А написал эту процедуру для того, чтобы методом тыка, открыв несколько файлов, выявить закономерность, которая предшествует каждому свойству. Тогда, потом смогу испльзую эти последовательности находить нужные свойства во всех файлах.


К-101   (2004-12-24 16:30:00) [1]

function FindText(S,FileName:string; ): Boolean;
var
 MStream:  TMemoryStream;
 SubLen,I: Integer;
 PSubTxt:  PWideChar;
begin
 Result := False;
 MStream := TMemoryStream.Create;
 SubLen := Length(S);
 GetMem(PSubTxt,2 * SubLen + 1);
 try
   PSubTxt := StringToWideChar(S,PSubTxt,2 * SubLen);
   MStream.LoadFromFile(FileName);
   // FindTextInStream(var SubS,S: PWideChar) - самописная
   Result := FindTextInStream(PSubTxT,PWideChar(MStream.Memory))
 finally
   MSteram.Clear;
   MStream.Free
   FreeMem(PSubTxt);
 end;
end;


К-101   (2004-12-24 16:13:00) [2]

Загрузи файл *.doc в TMemoryStream
Заведи переменную типа PWideChar
Переведи искомый текст в Unicod через StringToWideChar()
Просматривая весь поток как массив сравнивай посимвольно.


Pavelkq   (2004-12-24 13:39:00) [3]

Скажите хоть, где почить об этом на русском?
 Или есть другие варианты вытаскивания свойств? Неужели никто еще не писал модуля для открытия вордовских файлов без самого ворда?


Pavelkq   (2004-12-24 10:00:00) [4]

Опа, я перешел на Дельфи с Бейсика и других методов не знаю. Подскажите, плиз.


ЮЮ   (2004-12-24 09:57:00) [5]

первое (и главное) - не использовать ReadLn - это только для по-настоящему текстовых файлов


Pavelkq   (2004-12-24 09:56:00) [6]

Это уже что-то, но очень неявно. Мне-то надо конкретно найти поля свойств и, при необходимости, изменить их.


ЮЮ   (2004-12-24 09:54:00) [7]

Caption := #0'aaa';
и заголовка нету, но
Caption := IntToStr(Pos('aaa', #0'aaa'));
 покажет, что строка-то не пустая


Pavelkq   (2004-12-24 09:52:00) [8]

Я как раз об этом догадался. И еще раз взываю к помощи, как корректно читать/писать подобные строки в Дельфи?


ЮЮ   (2004-12-24 09:49:00) [9]

>Если прошу вывести в мему строку 'Тестовый', выводит, а если #0+'Тестовый', ничего не выводит.

Так это не Дельфи виновата, string отлично "держит" эту комбинацию, а Windows, в API которой повсюду PChar, а #0 - по определению - интерпретируется как конец строки


Pavelkq   (2004-12-24 09:43:00) [10]

Вот еще одну штуку нашел прикольную. Оказывается
copy(s,i,1)не то же самое, что s[i].
И все же, как научить Дельфи понимать вордовские файлы?
Если прошу вывести в мему строку 'Тестовый', выводит, а если #0+'Тестовый', ничего не выводит.


Pavelkq   (2004-12-24 07:50:00) [11]

Читал о преобразовании String в PChar и вижу там фишку, что в конце переменной типа String добавляют знак #0 (это наверное конец) Но весь прикол в том, что весь мой string на 90% состоит из #0. Что делать?
... там в коде
s1:= AnsiStrPos(@s,'Тестовый');написано.


Pavelkq   (2004-12-24 07:46:00) [12]

Сделал

procedure TForm1.Button1Click(Sender: TObject);
var name: string;
   f: textFile;
   s,s1: string;
   i: integer;
begin
if Form1.OpenDialog1.Execute then
 name := OpenDialog1.FileName;
 AssignFile(F, name);
 Reset(F);
 while not eof(f) do
 begin
   Readln (F,s);
   s1:= AnsiStrPos(@s,'Òåñòîâûé');
   Memo1.lines.Add(s1);
 end;
 CloseFile(f);
end;

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


wild_arg   (2004-12-23 15:30:00) [13]

В .doc строки храняться в юникоде. Лучше искать с помощью ф-ции AnsiStrPos (не спрашивайте, почему у нее приставка Ansi, а предназначена она для многобайтных кодировок. Не я называл:)


Pavelkq   (2004-12-23 13:37:00) [14]

Фиг его знает. Мне хоть уникоды, как их понять в Дельфях? А вьювер от ДискоКомандира.


wild_arg   (2004-12-23 13:31:00) [15]

Мне кажется все строки в вордовских файлах хранятся в UNICODE. Что у тебя за вьювер? может он просто преобразовывает юникод в стандартный вид и все.


Наверх

Титульная страница Поиск, карта сайта Написать письмо