Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.08;
Скачать: CL | DM;

Вниз

Excel создал, а как убить?   Найти похожие ветки 

 
Juju   (2006-09-23 08:50) [0]

Создаю Excel процедурой:
procedure CreateExcel;
var
Excel:Variant;
begin
Excel := CreateOleObject("Excel.Application");
Excel.Visible := TRUE;
Excel.Workbooks.Add(-4167);
end;
А как закрыть (убить) его?
Спсибо.


 
Palladin ©   (2006-09-23 10:37) [1]

Excel.Quit;


 
Juju   (2006-09-23 12:23) [2]

Дело в том, что я так пробовал - выдает ошибку:
EVariantInvalidOpError with message Invalid Variant Operation


 
Palladin ©   (2006-09-23 12:28) [3]

ты не правильно пробовал

procedure CreateExcel;
var
Excel:Variant;
begin
Excel := CreateOleObject("Excel.Application");
Excel.Visible := TRUE;
Excel.Workbooks.Add(-4167);
Ecxel.Quit;
end;


 
Juju   (2006-09-23 13:19) [4]

Пробовал я так:
procedure CreateExcel(Mode:Integer);
var Excel:Variant;
begin
case Mode 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 13:51) [5]

гениально... в орешник


 
SergP ©   (2006-09-23 14:02) [6]

> [4] Juju   (23.09.06 13:19)


Супер!!!


 
YurikGL ©   (2006-09-23 17:47) [7]

попробуй Excel:=unassigned...
а то у тебя процесс excel в менджере процессов останется


 
SergP ©   (2006-09-23 18:59) [8]

> [4] Juju   (23.09.06 13:19)
>
> Т.е. при загрузке программы создаем Excel при помощи CreateExcel(0)
> ;


Ну создаем.. А зачем? Какой смысл в таком создании, если после создания ссылку сразу же теряем?


> А при закрытии программы уничтожаем - CreateExcel(1);


Чего уничтожаем? Ничего там у тебя не уничтожается, а делается хрен знает что с хрен знает чем.


 
default ©   (2006-09-23 19:11) [9]

орех бесспорный


 
Juju   (2006-09-23 20:36) [10]

Не знаю что такое орех и орешник... думаю, что затупил я конкретно.
А тебе SergP огромное спасибо за объяснение. Весь подтекст понят и код исправлен. Теперь работает вроде:
видимость varExcel:Variant; вынес в начало модуля
Получилось так:
...
var Excel:Variant;
...
procedure CreateExcel(Mode:Integer);
begin
case Mode of
 0:begin
     Excel := CreateOleObject("Excel.Application");
     Excel.Visible := TRUE;
     Excel.Workbooks.Add(-4167);
    end;
 1:Excel.Quit;
end;
end;
Ну ведь работает... или снова неправильно реализовано? Если "ОРЕХ" - то объясните что такое орех и почему...
Palladin-спасибо за оперативность и терпение
SergP-спасибо, за описание, которое мне помогло.


 
SergP ©   (2006-09-23 21:05) [11]


> Не знаю что такое орех и орешник...


Орешник - это здесь:
http://www.delphimaster.ru/nuts/nuts.html
и в нем собраны орехи


> Ну ведь работает... или снова неправильно реализовано? Если
> "ОРЕХ" - то объясните что такое орех и почему...


На этот раз работать должно. Это уже не орех, но я бы так не делал.
Во первых: Непонятно зачем делать Excel.Quit, если ты сделал Excel.Visible := TRUE;
ведь в этом случае пользователь сам может закрыть Excel, к тому же если он его закрыл вручную, то при выполнении Quit опять можешь получить исключение.

Во-вторых: Если ты один раз "создашь Excel" а потом не закрыв его сделаешь это повторно, то создашь "еще один Excel", а ссылку на первый потеряешь...


 
SergP ©   (2006-09-23 21:14) [12]

Я обычно если работаю с "видимым экселем", то не закрываю его, так как это может сделать сам пользователь.
А если приходится делать какие-то операции с невидимым экселем, после окончания которых делать эксель видимым (просто в таком случае работает намного быстрее), то делаю так:


procedure ...;
var
Excel:variant;
begin
Excel:=CreateOleObject("Excel.Application");
  try
    Excel.Workbooks.Add;
    ...
    // Выполняем нужные операции с "невидимым Экселем"
    ...
    Excel.visible:=true; // Делаем его "видимым"
  except
    // Если в процессе возникло исключение,
    // то чтобы эксель не торчал зря в процессах, закрываем его.
    Excel.Quit;
  end;
end;


 
default ©   (2006-09-23 23:51) [13]

Juju   (23.09.06 20:36) [10]
чтобы закрыть excel приложение и чтобы ничего после этого не висело в памяти нужно делать
Excel.Quit;
VarClear(Excel);
когда юзер закрывает excel крестиком это тоже что и Excel.Quit и поскольку
VarClear(Excel); не было будет в памяти висеть фигня всякая


 
Palladin ©   (2006-09-24 09:34) [14]

+ еще иногда очень пользно Excel.Interactive:=False


 
Juju   (2006-09-24 10:43) [15]

Ребята... а какой вариант создания отчетов более рациональный?:
1)
При старте программы создаем Excel.
При выходе из программы - убиваем Excel.

2)
При конкретной надобности. Например по кнопке "Создать отчет",
В начале этой процедуры создаем Excel.
Выполняем необходимые действия (из базы заполняем документ).
При выходе из процедуры убиваем Excel.


 
Palladin ©   (2006-09-24 10:55) [16]

а по этому поводу рекомендую скачать компонент на моей странице и разобраться в нем


 
Juju   (2006-09-24 11:09) [17]

SergP - спасибо за ссылку на орешник. Воскресное утро - проведено в слезах! Неужели мой код (тот что первый) всех тоже не слабо потешил?...
Palladin - спасибо, скачал, начинаю разбираться.


 
YurikGL ©   (2006-09-24 13:20) [18]


> Ребята... а какой вариант создания отчетов более рациональный?
> :
> 1)
> При старте программы создаем Excel.
> При выходе из программы - убиваем Excel.
>
> 2)
> При конкретной надобности. Например по кнопке "Создать отчет",
>
> В начале этой процедуры создаем Excel.
> Выполняем необходимые действия (из базы заполняем документ).
>
> При выходе из процедуры убиваем Excel.

Более приемлем - 2



Страницы: 1 вся ветка

Текущий архив: 2006.10.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.035 c
2-1159010403
Дмитрий В
2006-09-23 15:20
2006.10.08
Как записать байт в lpt порт


3-1154527729
Scorpio
2006-08-02 18:08
2006.10.08
Получение номера из БД в программу


2-1158848876
J_SABER
2006-09-21 18:27
2006.10.08
перевод курсора


1-1156336513
yel
2006-08-23 16:35
2006.10.08
DevExpress : ExpressFlowChart Suite


11-1133822851
NewApplet
2005-12-06 01:47
2006.10.08
Чем можно заменить Applet ?