![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кодировка что ли? [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. Что у тебя за вьювер? может он просто преобразовывает юникод в стандартный вид и все.