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

Вниз

Коллеги! Как программно   Найти похожие ветки 

 
CPPBuilderDev ©   (2003-02-04 10:40) [0]

Кто-нибудь "искал" в *.rtf или *.doc файле подстроку программно?
Если да, то не подскажите как сие делается???
Сами понимаете, поиск в объекте автоматизации - дело слишком долгое. А если надо найти документы из целой их кучи по признаку принадлежноси этой самой подстроки - как тут быть - не знаю, не раскапывать же формат файла.???
какие могут быть советы??


 
Palladin ©   (2003-02-04 11:13) [1]

Если doc не unicode то искать просто...
читаешь файл как бинарник и ищешь в прочитаном определенную последовательность символов (искомая строка).
Если же doc все таки unicode, то придется адаптировать искомую строку в unicode... добавив к каждому байту символа в начале еще один байт (значение 4 помоему для кириллицы, ИМХО), дальше как для не unicode...


 
Anatoly Podgoretsky ©   (2003-02-04 11:23) [2]

Palladin © (04.02.03 11:13)
Ты уверен, что так просто?
Пример КраснЧернКрасн - это слово раскрашено в соотвествии с названием.


 
Palladin ©   (2003-02-04 11:30) [3]

Anatoly Podgoretsky ©
Да уверен.
Только что воспроизвел в Word2000. И посмотрел в файле.
Про rtf я ничего не говорил.


 
Palladin ©   (2003-02-04 11:34) [4]

в rtf будет немного сложнее... при поиске строки придется игнорировать символы форматирования текста... а так в принципе механизм тотже...

да и по моему формат файла открытый...


 
asmith   (2003-02-04 12:50) [5]

В *.doc можно так:

uses ComObj, ActiveX, AxCtrls, SysUtils, Classes;

function FindTextInFile(const FileName, TextToFind: WideString): boolean;
var Root: IStorage;
EnumStat: IEnumStatStg;
Stat: TStatStg;
iStm: IStream;
Stream: TOleStream;
DocTextString: WideString;
begin
Result:=False;

if not FileExists(FileName) then Exit;

// Check to see if it"s a structured storage file
if StgIsStorageFile(PWideChar(FileName)) <> S_OK then Exit;

// Open the file
OleCheck(StgOpenStorage(PWideChar(FileName), nil,
STGM_READ or STGM_SHARE_EXCLUSIVE, nil, 0, Root));

// Enumerate the storage and stream objects contained within this file
OleCheck(Root.EnumElements(0, nil, 0, EnumStat));

// Check all objects in the storage
while EnumStat.Next(1, Stat, nil) = S_OK do

// Is it a stream with Word data
if Stat.pwcsName = "WordDocument" then

// Try to get the stream "WordDocument"
if Succeeded(Root.OpenStream(Stat.pwcsName, nil,
STGM_READ or STGM_SHARE_EXCLUSIVE, 0, iStm)) then
begin
Stream:=TOleStream.Create(iStm);
try
if Stream.Size > 0 then
begin
// Move text data to string variable
SetLength(DocTextString, Stream.Size);
Stream.Position:=0;
Stream.Read(pChar(DocTextString)^, Stream.Size);

// Find a necessary text
Result:=(Pos(TextToFind, DocTextString) > 0);
end;
finally
Stream.Free;
end;
Exit;
end;
end;



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

Текущий архив: 2003.02.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
14-38513
Anatoly Podgoretsky
2003-01-28 07:35
2003.02.13
Именинники 28 января


3-38047
Tabu13
2003-01-29 11:40
2003.02.13
ADOQuery не хочет закрываться


1-38307
Nemas
2003-02-05 03:37
2003.02.13
Ничего не понимаю :(


1-38367
Anton
2003-02-04 10:23
2003.02.13
Как можно русифицировать ошибки, есть ли у них номер


6-38432
Alexo Kalinovski
2002-12-13 16:16
2003.02.13
Запуск команды на Linux-сервере из Delphi