На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Delphi убивает WinWord!!! Клич о помощи , При работе с MS Word иногда умирает сам Ворд. HELP
    Перейдем сразу к сабжу. Моя программа для перевода .doc в .htm (не в стиле той, что из FAQ, а гораздо сложнее -- с исправлением, дописыванием итд) почти готова. Но! После отработки программы в памяти остается процесс WINWORD.exe . Причем иногда после второго/третьего запуска программы он дублируется, иногда нет. А самое главное, что вроде бы я закрываю все правильно... с виду. Посему это будет первый вопрос -- как завершить работу с Word _правильно_, не отлавливая оставшихся процессов :blink: и не добавляя использованную пямть в кучу руками :D :blink: ? Ах да, еще. При попытке работать с документом повторно, не перезапуская программу(мою), выдается сообщение об ошибке "Сервер RPC недоступен". Как бороться с этим?

    Но главной проблемой является другое. Иногда Ворд просто перестает нормально работать! Причем в результате работы программы :o То есть Ворд запускается, документ в нем открывается... и ВСЁ. Более ничего с ним следать невозможно. Все опции меню, тулбаров и пр. серые. Доступна только команда "Открыть"... Лечится исключительно удалением и установкой заново офиса. Причем сам документ в полном порядке, после восстановления офиса его можно опять открыть -- все будет нормально. Вопрос: из-за чего такое может случаться?

    Ах да, я использую раннее связывание. Переходить на позднее сейчас уже нереально, да и скорее всего решение есть более простое.

    ExpandedWrap disabled
      type
          WordApplication: TWordApplication;
          WordDocument: TWordDocument;
       
      procedure TForm1.btnConvertClick(Sender: TObject);
      var
        fwname, fwReadonly:OleVariant;
        i, max_pars, pColor, redflag:Integer;
        paragraph_current:Paragraph;
      BEGIN
        fwname:=pathDoc.text;
        try
          begin
            WordApplication.Connect;
            fwReadonly:=True;
            WordApplication.Documents.Open(fwname,EmptyParam,
              fwReadonly, EmptyParam, EmptyParam, EmptyParam,
              EmptyParam, EmptyParam, EmptyParam, EmptyParam,
              EmptyParam, EmptyParam, EmptyParam, EmptyParam,
              EmptyParam);                                
            WordDocument.ConnectTo(WordApplication.ActiveDocument);
            WordApplication.Visible := False;
              
      (Обработка текста документа; записей в документ и вообще каких-либо изменений в нем не делается)
       
            WordDocument.Close;
            WordDocument.Disconnect;
            WordApplication.Quit;            
            WordApplication.Disconnect;
          end;
       
          except
            on E: Exception do begin
              ShowMessage(E.Message+IntToStr(E.HelpContext));
              WordDocument.Close;
              WordApplication.Quit;            
            end;


    Спасибо.
    Вик.
    Сообщение отредактировано: Shadowy -
      Shadowy, меня насторожили вот эти строки
      ExpandedWrap disabled
        WordApplication.Documents.Open(fwname,EmptyParam,
                fwReadonly, EmptyParam, EmptyParam, EmptyParam,
                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                EmptyParam);                                
              WordDocument.ConnectTo(WordApplication.ActiveDocument);
        Цитата tomsksmile @
        Shadowy, меня насторожили вот эти строки
        ExpandedWrap disabled
          WordApplication.Documents.Open(fwname,EmptyParam,
                  fwReadonly, EmptyParam, EmptyParam, EmptyParam,
                  EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                  EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                  EmptyParam);                                
                WordDocument.ConnectTo(WordApplication.ActiveDocument);

        А чем именно они настораживают?
          Обычно Word остается в памяти и перестает открываться, если в процессе отладки произошло ненормальное завершение. Надо убить его менеджером задач, и при новом запуске программы и все будет ОК.
            Попробуй так (или проверь, как у тебя). Вместо этого:
            Цитата Shadowy @

            WordDocument.Close;
            WordDocument.Disconnect;
            WordApplication.Quit;
            WordApplication.Disconnect;

            напиши
            ExpandedWrap disabled
              var f: OleVariant;
              .........
                   f := false;
                   WordDocument1.Close(f, EmptyParam,EmptyParam);
                   WordApplication.Disconnect;

            и в ИО для WordApplication:
            AutoConnect = false
            AutoQuit = True
            ConnectKind = ckNewInstance

            для WordDocument:
            AutoConnect = false
            ConnectKind = ckAttachToInterface

            У меня именно так работает, до этого тоже ловил
            Цитата
            "Сервер RPC недоступен".
              Крайне рекомендуется все com-объектам (WordApplication, WordDocument) присваивать nil по выходу. Оные присваивания вместе с Close, Quit, Disconnect лучше размещать в блоке finally. Тогда не будет необходимости дублировать их при нормальном выполнении и catch.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0263 ]   [ 16 queries used ]   [ Generated: 18.06.25, 03:45 GMT ]