Проблема Delphi + Word

Тема в разделе "Delphi - СОМ", создана пользователем MaFon, 8 май 2005.

Статус темы:
Закрыта.
  1. MaFon

    MaFon Гость

    Здравствуйте! Возник вот такой вопрос:
    Вот, например, код:
    -----------
    Код (Text):
    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;
    Вроде бы всё правильно. Но, если пользователь откроет другой документ во время работы цикла, произойдёт глюк. С тем документом невозможно будет работать. Что же делать?????
    Заранее спасибо.
     
  2. Barmutik

    Barmutik Гость

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

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

    Guest Гость

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

    _dimka_ Гость

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

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

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

    Barmutik Гость

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

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

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

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

    MaFon Гость

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

    Barmutik Гость

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

    _dimka_ Гость

    Barmutik
    теперь понятно, ну всё равно же легче с ними работать.
    Он же в Delphi работает, так зачем отвлекаться на открыть\закрыть апликейшн,
    пусть за товарный вид отчёта парится :lol:
     
  9. ByM

    ByM Гость

    Есди задача просто найти первое вхождение слова в пачке Word овских документов то почему не использовать при этом explorer который вернет имя файла а потом только открыть нужный файл ???
     
  10. Barmutik

    Barmutik Гость

    А по-конкретней .. интересно как это реализовать?
     
  11. ByM

    ByM Гость

    Код (Text):
    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
     
  12. zubr

    zubr Гость

    MaFon
    Как вариант, чтобы этого не было, скопируйте обрабатываемый Word-овский файл в папку Temp и юзайте его там, после окончания обработки удалите его, а чтобы юзеру это было не заметно, делайте W.visible:=False
     
  13. MaFon

    MaFon Гость

    Тема закрыта. Всем спасибо за ответы.
     
  14. zubr

    zubr Гость

    MaFon
    Извините, мой предыдущий топик неправильный (неврубился в вопрос сразу). Если вопрос еще интересен, то вот вариант, пробовал, работает:
    Код (Text):
    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;
     
  15. Barmutik

    Barmutik Гость

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

    _dimka_ Гость

    Barmutik
    он думал что всех напарит, но тут люди умные сидят
     
Загрузка...
Похожие Темы - Проблема Delphi Word
  1. agapoviv
    Ответов:
    1
    Просмотров:
    2.958
  2. c0de3r
    Ответов:
    5
    Просмотров:
    119
  3. DobermannTT
    Ответов:
    10
    Просмотров:
    134
  4. SoulPaladin
    Ответов:
    4
    Просмотров:
    128
  5. Artael
    Ответов:
    1
    Просмотров:
    109
Статус темы:
Закрыта.

Поделиться этой страницей