Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите побороть ошибку (EOleSysError) в MS Word, ошибка EOleSysError MS Word 
:(
    Опции темы
alexpotemkin
  Дата 14.10.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



 smile 
задача перебор текста по словам и сбор синонимов к словам
код в принципе стабилен, но вот нарисовался баг в обработке определенного текста при работе в Win XP и MS Office 2007
уже и пинял на новый формат док, ради этого и появилось открытие файла и сохранение его как текста (в коде видно)
Ошибка (EOleSysError ошибка на сервере) появляется в разных местах, что немного меня вгоняет в ступор, может кто с подобным сталкивался?
вот код
Код

var MSWord: Variant;
    apppath: OleVariant;
    SynonymInfo, TS: OleVariant;
    i,j,s: Longint;
    word,str_: String;
    list: TStringList;
begin
  if (Length(Q_ReplaceStr(FilenameEdit.Text,'"',''))<>0) and (FileExists(Q_ReplaceStr(FilenameEdit.Text,'"',''))) then begin
    try
      Screen.Cursor := crHourGlass;
      MsWord := CreateOleObject('Word.Application');
      apppath := Q_ReplaceStr(FilenameEdit.Text,'"','');
      MsWord.Visible := False;
      MsWord.Documents.Add(apppath, EmptyParam);
      MsWord.ActiveDocument.SaveAs(FileName:=IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'temp.txt',FileFormat:=wdFormatText);
      MsWord.Documents.Close;
      apppath := IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'temp.txt';
      MsWord.Visible := False;
      MsWord.Documents.Add(apppath, EmptyParam);
      if MsWord.ActiveDocument.Words.Count <> 0 then begin
        ProgressBar.Min := 1;
        ProgressBar.Max := MsWord.ActiveDocument.Words.Count;
        for i := 1 to MsWord.ActiveDocument.Words.Count do begin
          str_ := '';
          word := VarToStr(MsWord.ActiveDocument.Words.Item(i));
          Q_StrLower(word);
          Q_TrimInPlace(word);
          if (Length(word) > 3) and (Q_PosStr(word+'::',SynEdit.Text,1)=0) then begin
            SynonymInfo := MsWord.ActiveDocument.Words.Item(i).SynonymInfo;
            for j := 1 to SynonymInfo.MeaningCount do begin
              TS := SynonymInfo.SynonymList[j];
              for s := VarArrayLowBound(TS, 1) to VarArrayHighBound(TS, 1) do begin
                if Length(str_) = 0 then str_ := str_ + TS[s]
                else str_ := str_ + '**' + TS[s];
              end; //for s
            end; //for j
            SynonymInfo := EmptyParam;
            if Length(str_)<>0 then SynEdit.Lines.Add(word + '::' + str_);
          end;
          Application.ProcessMessages;
          StatusBar.Panels[5].Text := IntToStr(SynEdit.Lines.Count);
          ProgressBar.Position := i;
        end; //for i
      end;
      MsWord.Displayalerts := False;
      MsWord.Documents.Close;
      MsWord.Quit;
      ProgressBar.Position := 0;
      //
      list := TStringList.Create;
      list.Sorted := True;
      list.Duplicates := dupIgnore;
      list.Assign(SynEdit.Lines);
      SynEdit.Clear;
      SynEdit.Lines.Assign(list);
      list.Free;
      DeleteFile(IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'temp.txt');
      //
      StatusBar.Panels[5].Text := IntToStr(SynEdit.Lines.Count);
      Screen.Cursor := crDefault;
      ShowMessage('Обработка файла успешно закончена! В словаре - ' + IntToStr(SynEdit.Lines.Count) + ' строк');
    except
      on E:Exception do begin
        MsWord.Displayalerts := False;
        MsWord.Documents.Close;
        MsWord.Quit;
        Screen.Cursor := crDefault;
        ShowMessage(E.Message + #10#13 + E.ClassName);
      end;
    end; //try
  end;
end;


текст могу предоставить
PM MAIL   Вверх
Albinos_x
Дата 15.10.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(alexpotemkin @  14.10.2008,  19:30 Найти цитируемый пост)
Ошибка (EOleSysError ошибка на сервере) появляется в разных местах

разных местах текста или кода?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
alexpotemkin
  Дата 16.10.2008, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



ту Альбинос_Икс - ошибка возникала в разных местах обрабатываемого текста 

ошибку вроде как устранил (по крайней мере на тестах сбоев не было на всех проблемных текстах), слегка подправив исходный код

далее вопрос smile Какими способами увеличивать скорость обработки, последовательность работы видно. Чего подскажите господа?
PM MAIL   Вверх
Albinos_x
Дата 16.10.2008, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



читать весь текст одним махом


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
alexpotemkin
  Дата 19.10.2008, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



это как?
PM MAIL   Вверх
Albinos_x
Дата 19.10.2008, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



WordDocument1.Content.Text


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
alexpotemkin
  Дата 20.10.2008, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



а смысл читать его одним махом? что это даст? если мне все равно нужно получить каждое слово, а затем в тезаурусе выбрать для него синонимы.

Еще вопрос по следующей ошибке - Ошибка тезауруса. Текущий сеанс поиска синонимов завершен. EOleException

Запарил этот тезаурус. Нид хэлп товарищи.

Это сообщение отредактировал(а) alexpotemkin - 20.10.2008, 13:46
PM MAIL   Вверх
Albinos_x
Дата 21.10.2008, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(alexpotemkin @  20.10.2008,  07:13 Найти цитируемый пост)
а смысл читать его одним махом? что это даст? если мне все равно нужно получить каждое слово, а затем в тезаурусе выбрать для него синонимы.

уменьшение количества обращений к серверу, а следовательно и скорость обработки. А получить каждое слово можно и из переменной типа String
Цитата(alexpotemkin @  20.10.2008,  07:13 Найти цитируемый пост)
Еще вопрос по следующей ошибке - Ошибка тезауруса. Текущий сеанс поиска синонимов завершен. EOleException

код в студию


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
alexpotemkin
  Дата 23.10.2008, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



вот код, могу пример скинуть проблемных кусков текста (впринципе достаточно создать вордовский файл вот с таким текстом - смотрим смысла сначала улучш улучшения уля улучш улучшения уменьшают), облом (Ошибка тезауруса. Текущий сеанс поиска синонимов завершен. EOleException) наступает уже на слове "смысла", почему так не могу понять пока, пока не могу.
в используется функции библиотеки QStrings

Код

procedure TFormMain.TBStartClick(Sender: TObject);
var MSWord, apppath, SynonymInfo, TS: OleVariant;
    i,j,s,k: Longint;
    word,str,text: String;
    list: TStringList;
    in_word: Boolean;
begin
  if (Length(Q_ReplaceStr(FilenameEdit.Text,'"',''))<>0) and (FileExists(Q_ReplaceStr(FilenameEdit.Text,'"',''))) then begin
    try
      Screen.Cursor := crHourGlass;
      list := TStringList.Create;
      list.Sorted := True;
      list.Duplicates := dupIgnore;
      MsWord := CreateOleObject('Word.Application');
      apppath := Q_ReplaceStr(FilenameEdit.Text,'"','');
      MsWord.Displayalerts := False;
      MsWord.Visible := False;
      MsWord.Documents.Add(apppath, EmptyParam);
      //
      text := MsWord.ActiveDocument.Content.Text;
      in_word := False;
      j := Length(text);
      word := '';
      for i := 1 to j do begin
        if in_word then begin
          if (Ord(text[i])>=$C0) or (Ord(text[i])=$A8) or (Ord(text[i])=$B8) then begin
            word := word + AnsiLowerCase(text[i]);
          end
          else begin
            in_word := False;
            if Length(word)>=5 then list.Add(Trim(word));
            word := '';
          end;
        end
        else begin
          if (Ord(text[i])>=$C0) or (Ord(text[i])=$A8) or (Ord(text[i])=$B8) then begin
            in_word := true;
            word := AnsiLowerCase(text[i]);
          end
        end;
      end;
      //
      ProgressBar.Min := 0;
      ProgressBar.Max := list.Count - 1;
      ProgressBar.Position := 0;
      for i := 0 to list.Count - 1 do begin
        str := '';
        word := list.Strings[i];
        if (Length(word) > 3) and (MsWord.CheckSpelling(word)) then begin
          VarClear(SynonymInfo);
          SynonymInfo := MsWord.SynonymInfo[word, wdRussian]; //// !!!!!!!!!!! Вывалеваемся вот в этом месте
          if (not VarIsEmpty(SynonymInfo)) and (not VarIsNull(SynonymInfo)) and (SynonymInfo.Found) then begin
              str := '';
              k := SynonymInfo.MeaningCount;
              if k >= 2 then begin
              for j := 1 to k do begin
                TS := SynonymInfo.SynonymList[j];
                for s := VarArrayLowBound(TS, 1) to VarArrayHighBound(TS, 1) do begin
                  if Length(str) = 0 then str := str + TS[s]
                  else str := str + '**' + TS[s];
                end; //for s
              end; //for j
              if Length(str)<>0 then SynEdit.Lines.Add(word + '::' + str);
              end;
          end;
        end;
        if Q_CopyRight(IntToStr(i),1)='5' then Application.ProcessMessages;
        StatusBar.Panels[5].Text := IntToStr(SynEdit.Lines.Count);
        ProgressBar.Position := i;
      end; //for
      //
      MsWord.ActiveDocument.Close;
      MsWord.Quit;
      ProgressBar.Position := 0;
      StatusBar.Panels[5].Text := IntToStr(SynEdit.Lines.Count);
      Screen.Cursor := crDefault;
      ShowMessage('Обработка файла успешно закончена! В словаре - ' + IntToStr(SynEdit.Lines.Count) + ' строк');
    except
      on E:Exception do begin
        MsWord.Displayalerts := False;
        MsWord.ActiveDocument.Close;
        MsWord.Quit;
        Screen.Cursor := crDefault;
        ShowMessage(E.Message + #10#13 + E.ClassName);
        ShowMessage(tmp);
        Exit;
      end;
    end; //try
  end;
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1278 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.