| 
| 
 | Вопрос # 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;
 
 вот и всё....
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |