![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Excel создал, а как убить? [D7, XP]
Juju © (2006-09-23 08:50:00)Создаю Excel процедурой:
procedureCreateExcel;
var
Excel:Variant;
begin
Excel := CreateOleObject('Excel.Application');
Excel.Visible := TRUE;
Excel.Workbooks.Add(-4167);
end;
А как закрыть (убить) его?
Спсибо.
YurikGL (2006-09-24 13:20:00) [1]
> Ребята... а какой вариант создания отчетов более рациональный?
> :
> 1)
> При старте программы создаем Excel.
> При выходе из программы - убиваем Excel.
>
> 2)
> При конкретной надобности. Например по кнопке "Создать отчет",
>
> В начале этой процедуры создаем Excel.
> Выполняем необходимые действия (из базы заполняем документ).
>
> При выходе из процедуры убиваем Excel.
Более приемлем - 2
Juju (2006-09-24 11:09:00) [2]SergP- спасибо за ссылку на орешник. Воскресное утро - проведено в слезах! Неужели мой код (тот что первый) всех тоже не слабо потешил?...
Palladin- спасибо, скачал, начинаю разбираться.
Palladin (2006-09-24 10:55:00) [3]а по этому поводу рекомендую скачать компонент на моей странице и разобраться в нем
Juju (2006-09-24 10:43:00) [4]Ребята... а какой вариант создания отчетов более рациональный?:
1)
При старте программы создаем Excel.
При выходе из программы - убиваем Excel.
2)
При конкретной надобности. Например по кнопке "Создать отчет",
В начале этой процедуры создаем Excel.
Выполняем необходимые действия (из базы заполняем документ).
При выходе из процедуры убиваем Excel.
Palladin (2006-09-24 09:34:00) [5]+ еще иногда очень пользно Excel.Interactive:=False
default (2006-09-23 23:51:00) [6]Juju (23.09.06 20:36) [10]
чтобы закрыть excel приложение и чтобы ничего после этого не висело в памяти нужно делать
Excel.Quit;
VarClear(Excel);
когда юзер закрывает excel крестиком это тоже что и Excel.Quit и поскольку
VarClear(Excel); не было будет в памяти висеть фигня всякая
SergP (2006-09-23 21:14:00) [7]Я обычно если работаю с "видимым экселем", то не закрываю его, так как это может сделать сам пользователь.
А если приходится делать какие-то операции с невидимым экселем, после окончания которых делать эксель видимым (просто в таком случае работает намного быстрее), то делаю так:
procedure ...;
var
Excel:variant;
begin
Excel:=CreateOleObject('Excel.Application');
try
Excel.Workbooks.Add;
...
// Выполняем нужные операции с "невидимым Экселем"
...
Excel.visible:=true; // Делаем его "видимым"
except
// Если в процессе возникло исключение,
// то чтобы эксель не торчал зря в процессах, закрываем его.
Excel.Quit;
end;
end;
SergP (2006-09-23 21:05:00) [8]
> Не знаю что такое орех и орешник...
Орешник - это здесь:
http://www.delphimaster.ru/nuts/nuts.html
и в нем собраны орехи
> Ну ведь работает... или снова неправильно реализовано? Если
> "ОРЕХ" - то объясните что такое орех и почему...
На этот раз работать должно. Это уже не орех, но я бы так не делал.
Во первых: Непонятно зачем делать Excel.Quit, если ты сделал Excel.Visible := TRUE;
ведь в этом случае пользователь сам может закрыть Excel, к тому же если он его закрыл вручную, то при выполнении Quit опять можешь получить исключение.
Во-вторых: Если ты один раз "создашь Excel" а потом не закрыв его сделаешь это повторно, то создашь "еще один Excel", а ссылку на первый потеряешь...
Juju (2006-09-23 20:36:00) [9]Не знаю что такое орех и орешник... думаю, что затупил я конкретно.
А тебе SergPогромное спасибо за объяснение. Весь подтекст понят и код исправлен. Теперь работает вроде:
видимость varExcel:Variant; вынес в начало модуля
Получилось так:
...
varExcel:Variant;
...
procedureCreateExcel(Mode:Integer);
begin
caseMode of
0: begin
Excel := CreateOleObject('Excel.Application');
Excel.Visible := TRUE;
Excel.Workbooks.Add(-4167);
end;
1:Excel.Quit;
end;
end;
Ну ведь работает... или снова неправильно реализовано? Если "ОРЕХ" - то объясните что такое орех и почему...
Palladin-спасибо за оперативность и терпение
SergP-спасибо, за описание, которое мне помогло.
default (2006-09-23 19:11:00) [10]орех бесспорный
SergP (2006-09-23 18:59:00) [11]> [4] Juju (23.09.06 13:19)
>
> Т.е. при загрузке программы создаем Excel при помощи CreateExcel(0)
> ;
Ну создаем.. А зачем? Какой смысл в таком создании, если после создания ссылку сразу же теряем?
> А при закрытии программы уничтожаем - CreateExcel(1);
Чего уничтожаем? Ничего там у тебя не уничтожается, а делается хрен знает что с хрен знает чем.
YurikGL (2006-09-23 17:47:00) [12]попробуй Excel:=unassigned...
а то у тебя процесс excel в менджере процессов останется
SergP (2006-09-23 14:02:00) [13]> [4] Juju (23.09.06 13:19)
Супер!!!
Palladin (2006-09-23 13:51:00) [14]гениально... в орешник
Juju (2006-09-23 13:19:00) [15]Пробовал я так:
procedureCreateExcel(Mode:Integer);
varExcel:Variant;
begin
caseMode of
0: begin
Excel := CreateOleObject('Excel.Application');
Excel.Visible := TRUE;
Excel.Workbooks.Add(-4167);
end;
1:Excel.Quit;
end;
end;
Т.е. при загрузке программы создаем Excel при помощи CreateExcel(0);
А при закрытии программы уничтожаем - CreateExcel(1);
Palladin (2006-09-23 12:28:00) [16]ты не правильно пробовал
procedure CreateExcel;
var
Excel:Variant;
begin
Excel := CreateOleObject('Excel.Application');
Excel.Visible := TRUE;
Excel.Workbooks.Add(-4167);
Ecxel.Quit;
end;
Juju (2006-09-23 12:23:00) [17]Дело в том, что я так пробовал - выдает ошибку:
EVariantInvalidOpError with message Invalid Variant Operation
Palladin (2006-09-23 10:37:00) [18]Excel.Quit;