Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо