Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 950

/ вопрос открыт /

Здравствуйте, эксперты!
У меня в ходе создания программы, которая работает с XLS файлами, т.е. простейшие операции создания, чтения возник вопрос, решение которого не поддаётся сознанию, по крайней мере для меня.
Подскажите пожалуйста, есть простейшая программа на Delphi( начало опущу, оно стандартное):

Так вот если переменную типа variant задать как глобальную, то после выполнения кода кнопки и конкретно e.quit в процессах(Alt+Ctrl+Del) остаётся висеть Excel.exe, но если закрыть программу после этого Excel.exe пропадает из процессов.
Если же обьявить переменную типа variant как локальную, в обработчике кнопки, то после нажатия кнопки Excel.exe не остаётся в процессах.
Пожалуйста подскажите, что возможно происходит, или может нужно высвобождать память выделенную под переменную принудительно, и если так то каким образом.
Всем благодарен за ответы.

Приложение:
  1. ...
  2. uses ...., ComObj;
  3. ...
  4. ...
  5. ...
  6. var
  7. Form1: TForm1;
  8. e:variant;
  9. implementation
  10.  
  11. {$R *.dfm}
  12.  
  13. procedure TForm1.Button1Click(Sender: TObject);
  14. begin
  15. e:=CreateOleObject('Excel.Application');
  16. e.workbooks.Add;
  17. e.Visible:=true;
  18. e.Sheets.Add(after:=e.Sheets.Item[NamSheet]);
  19.  
  20. e.Workbooks.Item[1].SaveAs('1.xls');
  21. e.Quit;
  22. end;
  23.  
  24. end.


Arriba Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Arriba (статус: Посетитель)
Вопрос отправлен: 1 октября 2008, 23:02
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Arriba!
Попробуйте после e.Quit; написать e := nil;
А теперь, почему так происходит. Всё дело в подсчете ссылок. Когда ссылке присваевается nil, счётчик уменьшается на 1. Как только счетчик стает равным 0 - вызывается деструктор.
Когда переменная локальная Делфи делает это автоматически при выходе с процедуры. В случае глобальной - нет.
И вообще, глабальные переменные - плохо. Надо их использовать по минимуму.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 1 октября 2008, 23:23

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, Arriba!
Лучше, на мой взгляд, использовать сторонние библиотеки и компоненты для работы с Excel на прямую, без использования OLE объектов. Работа через OLE очень тормазнутая, особенно это ощутимо на больших таблицах, плюс использование форматирование ячеек. В добавок, обязывает обязательное наличие самого Office. Ведь если его нет, то и объектов нет, а значит ваша программа не сможет выполнить данные инструкции.
Попробуйте использовать компоненты с нашего сайта, я думаю вам понравится и вы ощутите разницу:
1. vtkExport - Библиотека, предназначенная для экспорта данных из Ваших программ в форматы Excel и HTML.
Формирование XLS файла происходит без использования DDE, OLE, т.е. для того, чтобы получить XLS-файл, не обязательно, чтобы на компьютере был установлен Excel.
Метод экспорта очень прост - Вы формируете объект TvteXLSWorkBook, который имеет свойства и методы схожие со свойствами и методами OLE сервера Excel и вызываете у него метод SaveAsXLSToFile или SaveAsHTMLToFile.
2. XLSReadWrite - мощный компонент для работы с файлами "*.xls".
Лично я пользовался первым и был очень доволен, т.к. приходилось экпортировать большие таблицы лет 5 назад. Тогда еще не было таких современных и мощных компьютеров, и экспорт таблиц через OLE занимал времени более 20 минут. Это приемлемо, если вы в течении дня одну, две таблицы обрабатываете. Но когда вам надо десятки таблиц в течении пару часов, то сами понимаете, какого это...
А vtkExport мне таблички кидал менее чем за 30-40 секунд.
Так что, пробуйте и делайте выводы.

P.S. Желаю удачи.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 2 октября 2008, 10:12


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 19 октября 2008, 22:43; участников в обсуждении: 4.
Arriba

Arriba (статус: Посетитель), 2 октября 2008, 00:12 [#1]:

После подставления строчки e:nil; вызывается ошибка несовместимости типов Incompatible types: 'Variant' and 'Pointer'
Николай Рубан

Николай Рубан (статус: 10-ый класс), 2 октября 2008, 00:39 [#2]:

А если такой вариант испытать: e:=Null; ?
Вадим К

Вадим К (статус: Академик), 2 октября 2008, 00:47 [#3]:

Да, для типа variant надо Null. Это тот же nil, просто нужно типа.
Галочка "подтверждения прочтения" - вселенское зло.
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 2 октября 2008, 08:35 [#4]:

Я добавляю всегда
e:= UnAssigned;
Arriba

Arriba (статус: Посетитель), 2 октября 2008, 20:40 [#5]:

Feniks, мысль насчёт отсутствующего офиса актуальна конечно, как только доработаю программу через Ole объекты, обязательно воспользуюсь компонентом.

Всем спасибо за ответы.
Arriba

Arriba (статус: Посетитель), 2 октября 2008, 20:42 [#6]:

Игорь Шичко, предложенная вами строчка так же использовалась мной, но безуспешно.
Arriba

Arriba (статус: Посетитель), 19 октября 2008, 22:43 [#7]:

Нашёл решение данного вопроса, оказалось всё очень просто.

Я в начале писал
e.UnAssigned;
e.Quit;

но это совершенно неправильно, надо было мне писать
e.Quit;
e.UnAssigned;

вот и всё....

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.02 сек.