|
Вопрос # 1 950/ вопрос открыт / |
|
Здравствуйте, эксперты!
У меня в ходе создания программы, которая работает с XLS файлами, т.е. простейшие операции создания, чтения возник вопрос, решение которого не поддаётся сознанию, по крайней мере для меня.
Подскажите пожалуйста, есть простейшая программа на Delphi( начало опущу, оно стандартное):
Так вот если переменную типа variant задать как глобальную, то после выполнения кода кнопки и конкретно e.quit в процессах(Alt+Ctrl+Del) остаётся висеть Excel.exe, но если закрыть программу после этого Excel.exe пропадает из процессов.
Если же обьявить переменную типа variant как локальную, в обработчике кнопки, то после нажатия кнопки Excel.exe не остаётся в процессах.
Пожалуйста подскажите, что возможно происходит, или может нужно высвобождать память выделенную под переменную принудительно, и если так то каким образом.
Всем благодарен за ответы.
Приложение: Переключить в обычный режим- ...
- uses ...., ComObj;
- ...
- ...
- ...
- var
- Form1: TForm1;
- e:variant;
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- e:=CreateOleObject('Excel.Application');
- e.workbooks.Add;
- e.Visible:=true;
- e.Sheets.Add(after:=e.Sheets.Item[NamSheet]);
-
- e.Workbooks.Item[1].SaveAs('1.xls');
- e.Quit;
- end;
-
- end.
 |
Вопрос задал: 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 (статус: Посетитель), 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 (статус: Посетитель), 2 октября 2008, 20:40 [#5]:
Feniks, мысль насчёт отсутствующего офиса актуальна конечно, как только доработаю программу через Ole объекты, обязательно воспользуюсь компонентом.
Всем спасибо за ответы.
|
|
Arriba (статус: Посетитель), 2 октября 2008, 20:42 [#6]:
Игорь Шичко, предложенная вами строчка так же использовалась мной, но безуспешно.
|
|
Arriba (статус: Посетитель), 19 октября 2008, 22:43 [#7]:
Нашёл решение данного вопроса, оказалось всё очень просто.
Я в начале писал
e.UnAssigned;
e.Quit;
но это совершенно неправильно, надо было мне писать
e.Quit;
e.UnAssigned;
вот и всё....
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|