Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для useruser
166 / 90 / 38
Регистрация: 29.06.2015
Сообщений: 1,100

Excel закрывается не сразу

29.02.2016, 13:59. Показов 2476. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При работе с Excel, Excel закрывается не сразу, а только через 10 секунд после окончания работы программы.
Код программы состоит из потока и функции. Функция вызывается в потоке. Функция не обращается к визуальным элементам.

Происходит следущее:
Программа запускается, вызывает функцию (работаем с excel).
Работа с excel завершена, должно выполниться Ap.Application.Quit;. Но excel открыт.
Excel открыт (процесс в диспетчере задач) - программа уже не работает с excel, а выполняет другие действия.
Проходит минута и программа завершает все свои действия. Работа программы завершена (дошли до конца программы).
Excel всё ещё открыт.

Проходит 10 секунд и Excel закрывается.
А если не подождать эти 10 секунд, а закрыть программу (работа то завершена и верный результат получен), то процесс останется висеть в памяти. Закрыть его можно только завершив процесс.

В чем может быть проблемма?

Код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//Функция проверки необходимых полей в файле 
function check_D(input_file_path:string):integer;
var
i,j,handbook_correct:integer;
begin
handbook_correct:=0; //По умолчанию справочник не корректен
CoInitialize(Nil);//Вызов для работы с excel файлом
//ПРОВЕРКА И ПОИСК НЕОБХОДИМЫХ НАМ ПОЛЕЙ
Ap:=CreateOleObject('Excel.Application'); //Создаем объект
Ap.Workbooks.Open(input_file_path,0,True); //Открываем файл для чтения
Ap.DisplayAlerts:=False; //Отключаем любые сообщения excel
 
//Узнаем количество заполненных строк и столбцов
excel_rows:=Ap.ActiveSheet.UsedRange.Rows.Count;
excel_columns:=Ap.ActiveSheet.UsedRange.Columns.Count;
 
for i:=1 to 20 do
begin
for j:=1 to excel_columns do
begin
current_string:=Ap.Cells[i,j];
//Поле
if ((current_string='Признак') and (column_6_found=0)) then begin column_6_found:=1; column_6:=j; data_begin_row:=i+2; end;
end;
end;
Ap.Application.Quit;  //Закрываем excel файл
 
//Проверяем все ли поля найдены - если нет то выводим сообщение и завершаем программу
if (column_6_found=1) then handbook_correct:=1;
Result:=handbook_correct;
//КОНЕЦ ПРОВЕРКИ И ПОИСКА НЕОБХОДИМЫХ НАМ ПОЛЕЙ
end;
 
 
 
procedure TMyThread.Execute;
 
begin
//Код в потоке
FreeOnTerminate:=True;//Уничтожаем экземпляры TMyThread
CoInitialize(Nil);//Вызов для работы с excel файлом
 
 
 
//Проверка массива DRMP_TABLE
if (check_D('test.xls')<>1) then
begin
output_message:='Ошибка. В файле - не были найдены необходимые поля.'; Synchronize(Show_Message);
end;
 
//ВОТ ТУТ EXCEL ФАЙЛ ДОЛЖЕН БЫТЬ ЗАКРЫТ 
//Но он будет закрыт только после окончания работы программы (конец кода), через 10 секунд "простоя" программы (нужно ждать).
 
//Далее остальной код
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.02.2016, 13:59
Ответы с готовыми решениями:

Программа при запуске сразу закрывается
при запуске программа сразу закрывается, помогите найти ошибку Поставленная задача: Составить программу, рассчитывающую заработную...

Программа после запуска сразу же закрывается

Консоль закрывается сразу же после выполнения, хотя ReadLn на месте
Помогите понять, почему так, пожалуйста :-program Project4; {$APPTYPE CONSOLE} uses SysUtils, Math; const e:...

5
5976 / 4551 / 1095
Регистрация: 29.08.2013
Сообщений: 28,172
Записей в блоге: 3
29.02.2016, 14:40
Цитата Сообщение от useruser Посмотреть сообщение
то процесс останется висеть в памяти.
уже обсуждали эту проблему - переменная не освобождается и поэтому процесс висит
и тут и на sql.ru решение есть

ЗЫ посоветую вместо CreateOleObject('Excel.Application'); использовать zexmlss
0
 Аватар для FaTaL-CS
73 / 74 / 23
Регистрация: 14.10.2013
Сообщений: 549
29.02.2016, 21:13
Ap:=nil;
0
 Аватар для useruser
166 / 90 / 38
Регистрация: 29.06.2015
Сообщений: 1,100
01.03.2016, 07:57  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
уже обсуждали эту проблему - переменная не освобождается и поэтому процесс висит
и тут и на sql.ru решение есть
Не помогает. Никак.
Гуглил 2 часа, пробовал разные комбинации - бесполезно.
Delphi
1
2
3
4
5
Ap.Disconnect;
Ap.Free;
Ap.Close(SaveChanges:=false);
Ap.quit;
Ap := Unassigned;

Цитата Сообщение от FaTaL-CS Посмотреть сообщение
Ap:=nil;
Incompatible types OleVariant and Pointer.

Ещё раз - Exel создаю/открываю так
Delphi
1
2
3
4
5
6
7
8
//Открываем excel файл
Ap:=CreateOleObject('Excel.Application'); //Создаем объект
Ap.Workbooks.Open(input_file_path,0,True); //Открываем файл для чтения
Ap.DisplayAlerts:=False; //Отключаем любые сообщения excel
 
//тут работаем
 
Ap.Application.Quit;   //Закрываем excel файл - а процесс висит
0
5976 / 4551 / 1095
Регистрация: 29.08.2013
Сообщений: 28,172
Записей в блоге: 3
01.03.2016, 08:50
тут нельзя выкладывать ссылки
напишите в лс - отправлю
0
57 / 57 / 37
Регистрация: 11.05.2015
Сообщений: 196
01.03.2016, 10:55
хм... интересно, всегда использовал такую конструкцию, никогда ничего не висело:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
var E: Variant;
...
E:=CreateOLEObject('Excel.Application');
//При создании еще можно такую конструкция использовать, но при закрытии E.Application.Quit он закроет Excel'ку, которую использовал в своих корыстных целях
{
try E:=GetActiveOLEObject('Excel.Application');
except E:=CreateOLEObject('Excel.Application') end;
}
try
  ...
  E.ActiveWorkBook.Close;
  E.Application.Quit;
except
  ShowMessage('Error');
  E.ActiveWorkBook.Close;
  E.Application.Quit;
end;
...

Не по теме:


И еще такие вопросики: зачем ты вычисляешь кол-во Rows если ты все равно идешь For i:=1 to 20 do?
Ну и:

Delphi
1
2
//current_string:=Ap.Cells[i,j]; Вместо используй
current_string:=Ap.Cells[i,j].Value;
и еще
Цитата Сообщение от useruser Посмотреть сообщение
Функция не обращается к визуальным элементам.
тогда зачем:
Цитата Сообщение от useruser Посмотреть сообщение
Delphi
1
Ap.DisplayAlerts:=False; //Отключаем любые сообщения excel
тогда уж добавь
Delphi
1
Ap.Visible:=False;

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.03.2016, 10:55
Помогаю со студенческими работами здесь

не закрывается процесс excel.exe
добрый день столкнулся с проблемой в представленном ниже коде: не понятно по каким причинам не отрабатывается OpExcel.Quit. После...

Не закрывается сразу форма
у меня при закрытии формы выдается запрос на сохранение данных, но почему то после этого форма не закрывается... private void...

Консоль сразу же закрывается
Не могу понять как можно сделать так чтоб экран не исчезал работаю в делфи. Очень надо ваша помошь

Консоль сразу же закрывается
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace...

Программа сразу закрывается
начинаю изучать ассемблер (Borland TASM) из книжки взял исходник Hellow World откомпилировал, но когда запустил exe-шник он открылся и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru