Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
useruser
61 / 62 / 29
Регистрация: 29.06.2015
Сообщений: 648
#1

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

29.02.2016, 13:59. Просмотров 562. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.02.2016, 13:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Excel закрывается не сразу (Delphi):

Нужно, чтобы данные из БД в TDBGrid открывались сразу в файле excel?
Подскажите, плиз, как сделать, чтобы данные из БД которые должны идти в...

Программа при запуске сразу закрывается
при запуске программа сразу закрывается, помогите найти ошибку Поставленная...

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

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

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

Нужно чтобы из строк Edit значения попадали сразу в таблицу Excel
Ребята, нужна помощь. Нужно чтобы из строк Edit значения попадали сразу в...

5
qwertehok
2195 / 2185 / 597
Регистрация: 29.08.2013
Сообщений: 14,593
29.02.2016, 14:40 #2
Цитата Сообщение от useruser Посмотреть сообщение
то процесс останется висеть в памяти.
уже обсуждали эту проблему - переменная не освобождается и поэтому процесс висит
и тут и на sql.ru решение есть

ЗЫ посоветую вместо CreateOleObject('Excel.Application'); использовать zexmlss
0
FaTaL-CS
69 / 69 / 23
Регистрация: 14.10.2013
Сообщений: 527
29.02.2016, 21:13 #3
Ap:=nil;
0
useruser
61 / 62 / 29
Регистрация: 29.06.2015
Сообщений: 648
01.03.2016, 07:57  [ТС] #4
Цитата Сообщение от 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
qwertehok
2195 / 2185 / 597
Регистрация: 29.08.2013
Сообщений: 14,593
01.03.2016, 08:50 #5
тут нельзя выкладывать ссылки
напишите в лс - отправлю
0
Rasomaha
55 / 55 / 37
Регистрация: 11.05.2015
Сообщений: 196
01.03.2016, 10:55 #6
хм... интересно, всегда использовал такую конструкцию, никогда ничего не висело:
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
01.03.2016, 10:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2016, 10:55
Привет! Вот еще темы с решениями:

Приложение закрывается
Есть код такого вида: procedure TForm1.Timer1Timer(Sender: TObject); begin...

Не закрывается Form2
Здравствуйте! У меня возникла ошибка в программе. Мне нужно создать программу...

Консоль сразу закрывается
подскажите чайнику. В консольном режиме пишу программу, которая находят...

Консоль закрывается сразу
package test2; import java.io.IOException; public static void...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru