Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Фильтр сообщений выдал диагностику о занятости приложения


ВладОшин ©   (26.07.19 10:30

Доброго!

Спрошу так.. ситуация, значит, такая - в папку валятся файлы excel, их надо парсить и перекладывать в другую папку. Все ok было, пока не стали приходить какие-то файлы, которые сам Excel открывает нормально, иногда даже нормально открывает через OLE, но бывает, что ошибка сабжа.

На кнопку повесил код и несколько раз нажал на одном таком "плохом" файле


var
 i: integer;
 EA, WB: Variant;
 ExcelFile: string;
begin
//https://docs.microsoft.com/en-us/office/vba/api/excel.application
//...Worksheets("Sheet1").Activate
//...Application.DoubleClick
//.This example uses the SendKeys method to quit Microsoft Excel.
//.Application.SendKeys("%fx")

 ExcelFile := 'C:\Users\oshin\Desktop\test.XLSX';
 EA := CreateOleObject('Excel.Application');
 Print(EA.Value);  //Microsoft Excel  // Print=memo.lines.add
 try
   try
     EA.EnableEvents := False;
     EA.DisplayAlerts  := False;
     EA.FileValidation := 1;     //Do not validate the file.
     EA.AutomationSecurity := 3; // Disables all macros in all files opened programmatically without showing any security alerts.
//      EA.ErrorCheckingOptions.BackgroundChecking := False;
//      EA.ErrorCheckingOptions.EvaluateToError := False;
//      EA.ErrorCheckingOptions.InconsistentFormula := False;
//      EA.ErrorCheckingOptions.ListDataValidation := False;
//      EA.ErrorCheckingOptions.NumberAsText := False;
//      EA.ErrorCheckingOptions.OmittedCells := False;
//      EA.ErrorCheckingOptions.TextDate  := False;
//      EA.ErrorCheckingOptions.UnlockedFormulaCells := False;
     EA.IgnoreRemoteRequests := True;

     EA.Interactive := False;
     EA.ScreenUpdating := False;
     EA.UserControl := False;
     EA.Visible := false;
     EA.WarnOnFunctionNameConflict := false;

     Print('before  EA.WorkBooks.Open');
 //    WB := EA.WorkBooks.Open(ExcelFile);   // без разницы
     WB := EA.Workbooks.Open(                // без разницы
                         ExcelFile, //FileName
                         false, //UpdateLinks
                         true,  //ReadOnly
                         EmptyParam,  //Format
                         EmptyParam,  //Password
                         EmptyParam,  //WriteResPassword
                         true,        //IgnoreReadOnlyRecommended
                         EmptyParam,  //Origin
                         EmptyParam,  //Delimiter
                         EmptyParam,  //Editable
                         EmptyParam,  //Notify
                         EmptyParam,  //Converter
                         EmptyParam,  //AddToMru
                         EmptyParam,  //Local
                         false);       //CorruptLoad

     Print('after  EA.WorkBooks.Open');

     //Фильтр сообщений выдал диагностику о занятости приложения
     //  цикл добавил просто так, уже не знаю что надо. Показалось, что помогает даже, меньше стало ошибок вроде, но это просто файлы были хорошие

     for i := 0 to 99 do
     begin
       Sleep(0);
       Application.ProcessMessages;
     end;
     Print('after  Sleep');

     for i := 1 to WB.WorkSheets.Count do
     begin
       Print(WB.WorkSheets[i].Name);
     end;

   finally
     //HardCloseExcel(EA);
     Print('..finally');
     EA.Quit;
     EA := Unassigned;
   end;
 except
   on E:Exception do
   begin
     Print('..except');
     Print(E.Message);
     if not VarIsEmpty(EA) then
     try
       HardCloseExcel(EA);  //HardCloseExcel = по EA.hwnd вычисляется процесс и грохается как процесс
     except
       on EE:Exception do Print (EE.Message);
     end;
   end;
 end;


вывод

Microsoft Excel
before  EA.WorkBooks.Open
after  EA.WorkBooks.Open
after  Sleep
..finally
..except
Фильтр сообщений выдал диагностику о занятости приложения

Microsoft Excel
before  EA.WorkBooks.Open
after  EA.WorkBooks.Open
after  Sleep
данные
отчёт
..finally

Microsoft Excel
before  EA.WorkBooks.Open
after  EA.WorkBooks.Open
after  Sleep
..finally
..except
Фильтр сообщений выдал диагностику о занятости приложения

Microsoft Excel
before  EA.WorkBooks.Open
after  EA.WorkBooks.Open
after  Sleep
данные
отчёт
..finally

Microsoft Excel
before  EA.WorkBooks.Open
after  EA.WorkBooks.Open
after  Sleep
данные
отчёт
..finally

-----

Чем оно, приложение, так занято то? Как его освободить?


ВладОшин ©   (26.07.19 10:52[1]

обернул в цикл, на 10 раз
только что 10 раз подряд нормально прошел

а до этого 7+ 3-

не понимаю от чего зависит..


ВладОшин ©   (26.07.19 11:22[2]

Запустил еще на 3х компах. На одном без ошибок, на двух других 1 раз из 10 ошибка.


ВладОшин ©   (27.07.19 12:08[3]

Можно, конечно смеяться..
но до 999 в цикле на 30 итераций отработал несколько раз без ошибок

    //  цикл добавил просто так, уже не знаю что надо. Показалось, что помогает даже, меньше стало ошибок вроде, но это просто файлы были хорошие
    for i := 0 to 999  do //99 do
    begin
      Sleep(0);
      Application.ProcessMessages;
    end;
    Print('after  Sleep');


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо