Проблема Delphi + Word

  • Автор темы MaFon
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

MaFon

#1
Здравствуйте! Возник вот такой вопрос:
Вот, например, код:
-----------
Код:
Uses comObj;
Var W:variant;

Function TForm1.CreateWord:boolean;
begin
CreateWord:=true;
try
W:=CreateOleObject('Word.Application');
except
CreateWord:=false;
end;
End;

procedure TForm1.Button1Click(Sender: TObject);
var
filecount: integer;
begin
If CreateWord= true then
begin
 W.visible:=true;
 for filecount:=0 to Memo1.lines.Count do
 begin
  W.Documents.open(memo1.Lines[filecount]);
  W.Selection.Start:=0;
  W.Selection.End:=0;
  W.Selection.Find.Forward:=true;
  W.Selection.Find.Text:='трали-вали';
  if (W.Selection.Find.Execute)=true then Memo2.Lines.Add('найдено в '+memo1.Lines[filecount]);
  W.ActiveDocument.Close;
 end;
 W.Quit;
end;
end;
Вроде бы всё правильно. Но, если пользователь откроет другой документ во время работы цикла, произойдёт глюк. С тем документом невозможно будет работать. Что же делать?????
Заранее спасибо.
 
B

Barmutik

#2
Это стандартная проблема .. не используйте свойство ActiveDocument..

Сохраните Ваш документ в переменной и работайте непосредственно с ним а не постоянно спрашивая активный документ.
 
G

Guest

#3
Barmutik
Глюк не исчезнет. Ворд-то всё время будет открываться-закрываться.
 
D

_dimka_

#4
А вообще пробовали использовать не OLE а стандартные компоненты в Delphi:
TWordDocument
TWordApplication

Там обращаешься к своему документу через индекс, одновременно существующих документов.
И тем более можно сразу работать с несколькими доками.

Удобно, просто, надежно.
Посмотри примеры на www.delphikingdom.com
я от туда всю инфу брал :lol:
 
B

Barmutik

#5
Я конечно не полностью в курсе Вашей задачи.. нопо поим рассчётам всё должно исчезнуть..

И зачем вообще показывать Ворд в начале работы ?

С вордом у меня давнишняя работа ..можно сказать сотни отчётов в него были выкинуты .. и проблем никогда не было ... почти никогда :lol:

_dimka_
Эти компоненты просто враперы над тем что использует человек задавший вопрос...
 
M

MaFon

#6
Может я просто Вас недопонимаю. Если не сложно, поделитесь кусочком кода. А задача простая: поиск 1-го вхождения в куче файлов.
 
B

Barmutik

#7
Ок! Только отложим на среду... потому как под рукой сейчас нет...
 
D

_dimka_

#8
Barmutik
теперь понятно, ну всё равно же легче с ними работать.
Он же в Delphi работает, так зачем отвлекаться на открыть\закрыть апликейшн,
пусть за товарный вид отчёта парится :lol:
 
B
#9
Есди задача просто найти первое вхождение слова в пачке Word овских документов то почему не использовать при этом explorer который вернет имя файла а потом только открыть нужный файл ???
 
B

Barmutik

#10
А по-конкретней .. интересно как это реализовать?
 
B
#11
Код:
var
fs: TFileStream;
S: string;
FileName:string;
begin
try
fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
try
 SetLength(S, fs.Size);
 fs.ReadBuffer(S[1], fs.Size);
finally
 fs.Free;
end;
if Pos(find_string,s) > 0 Then
 ShowMessage('Ok')
 else
 ShowMessage('False')
except
 on E:Exception do
 Exception.Create(E.Message);
end;

end;
Приблизительно где-то так я когда то искал текстовый документ, но попробовал сам с Word - ом не канает :-( но Windows же ищет как то по вложению файла значит на WinApi есть какя то функция надо порытся в MSDN
 
Z
#12
MaFon
Но, если пользователь откроет другой документ во время работы цикла, произойдёт глюк. С тем документом невозможно будет работать.
Как вариант, чтобы этого не было, скопируйте обрабатываемый Word-овский файл в папку Temp и юзайте его там, после окончания обработки удалите его, а чтобы юзеру это было не заметно, делайте W.visible:=False
 
Z
#14
MaFon
Извините, мой предыдущий топик неправильный (неврубился в вопрос сразу). Если вопрос еще интересен, то вот вариант, пробовал, работает:
Код:
Uses comObj;
Var W, W1:variant;

Function TForm1.CreateWord:boolean;
begin
CreateWord:=true;
try
W:=CreateOleObject('Word.Application');
W1:=CreateOleObject('Word.Application');//чтобы обмануть Word
W1.visible:=True;
except
CreateWord:=false;
end;
End;

procedure TForm1.Button1Click(Sender: TObject);
var
filecount: integer;
begin
If CreateWord= true then
begin
W.visible:=false;
for filecount:=0 to Memo1.lines.Count-1 do
begin
W.Documents.open(memo1.Lines[filecount]);
W.Selection.Start:=0;
W.Selection.End:=0;
W.Selection.Find.Forward:=true;
W.Selection.Find.Text:='трали-вали';
if (W.Selection.Find.Execute)=true then Memo2.Lines.Add('найдено в '+memo1.Lines[filecount]);
W.Documents.Item(memo1.Lines[i]).Close;//закрывает не активный документ, а тот что юзали
end;
W.Quit;
end;
end;
 
B

Barmutik

#15
ByM
Предложенный Вами сопосб поиска работает правильно в 1 из 1000 случаев ... он абсолютно не корректен!
 
D

_dimka_

#16
Barmutik
он думал что всех напарит, но тут люди умные сидят
 
Статус
Закрыто для дальнейших ответов.