![]() |
![]() ![]() ![]() | |
|
Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|| Форумы Здесь вы можете задать свой вопрос и наверняка получите ответ |
ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
| ||
![]() | ||
|
Чтобы не потерять эту дискуссию, сделайте закладку
« предыдущая ветвь | форум | следующая ветвь »
Фильтр сообщений выдал диагностику о занятости приложения
ВладОшин © (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');
Разрешается использование тегов форматирования текста:
версия для печати
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)
|
![]() ![]() ![]() |