Droider, а если книгу не нужно закрывать, а необходимо оставить ее для пользователя. В этом случае Excel := Unassigned; достаточно будет ?
Добавлено через 3 минуты
Mawrat исчерпывающе ответил
{Освобождение интерфейсов. Это делается через обнуление ссылок на эти интерфейсы.
Обнулить надо все ссылки на интерфейсы. Т. е., обнулить надо все соответствующие
переменные: exApp, exBooks, exBook, exSheets, exSheet. Если ссылки на интерфейсы
не обнулить, то объекты, связанные с этими интерфейсами, так и останутся в памяти.}
{Здесь следует обратить внимание на следующий момент.:
1. Если переменные exApp, exBooks, exBook, exSheets, exSheet объявлены на локальном
уровне, т. е., внутри подпрограммы — метода, процедуры или функции, то вручную можно
эти переменные не обнулять. Потому, что перед тем, как управление покинет тело
подпрограммы, такие переменные будут автоматически обнулены кодом завершения.
Такой код завершения добавляется компилятором во все подпрограммы.
2. Если переменные exApp, exBooks, exBook, exSheets, exSheet объявлены на глобальном
уровне, то такие переменные надо обнулить вручную. Обнуление следует выполнить
в момент, когда известно, что связанные объекты в программе больше не понадобятся.}
//Обнуление ссылок на интерфейсы.
VarClear(exApp); //Или так: exApp := Unassigned;
VarClear(exBooks); //Или так: exBooks := Unassigned;
VarClear(exBook); //Или так: exBook := Unassigned;
VarClear(exSheets); //Или так: exSheets := Unassigned;
VarClear(exSheet); //Или так: exSheet := Unassigned;
Добавлено через 28 секунд
В общем все понятно ))
Содержание
- Delphi excel не закрывать
- Delphi excel не закрывать
- Delphi excel не закрывать
Delphi excel не закрывать
У меня форма запускает через Ole Excel
а сама всплывает поверх его (из нее я перетаскиваю в ячейки всякую шнягу)
она держит application екселя до своего закрытия,
а при закрытии этой формы я все сохраняю и закрываю ексель
Так вот если в екселе не редактируется ячейка все проходит на ура
а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
Вопрос: Как бы его вывести из состояния редактирования ячейки?
YuriyR
От: | Softwarer | http://softwarer.ru | |
Дата: | 06.07.04 11:16 | ||
Оценка: | +1 |
Здравствуйте, yuriyr, Вы писали:
Y> xlap.Quit;
Y>Так вот если в екселе не редактируется ячейка все проходит на ура
Y>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.
От: | yuriyr | |
Дата: | 06.07.04 11:23 | |
Оценка: |
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, yuriyr, Вы писали:
Y>> xlap.Quit;
Y>>Так вот если в екселе не редактируется ячейка все проходит на ура
Y>>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
S>Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.
Нет первая команда xlap.DisplayAlerts := False;
Она отменяет все вопросы Excel на счет подтверждения сохранения
Но и она — самая первая — не выполняется exeption выдает каманда игнорирована
От: | Softwarer | http://softwarer.ru | |
Дата: | 06.07.04 11:28 | ||
Оценка: |
Здравствуйте, yuriyr, Вы писали:
Y>Нет первая команда xlap.DisplayAlerts := False;
Виноват, действительно прореагировал «на рефлексах». Прошу прощения.
От: | akasoft | |
Дата: | 06.07.04 13:36 | |
Оценка: |
Здравствуйте, yuriyr, Вы писали:
Y>Нет первая команда xlap.DisplayAlerts := False;
Y>Она отменяет все вопросы Excel на счет подтверждения сохранения
Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это.
От: | yuriyr | |
Дата: | 06.07.04 16:25 | |
Оценка: |
Здравствуйте, akasoft, Вы писали:
A>Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это.
Попробовал и так. Изменений нет
OLE error ‘Вызов был отклонен’
Использую ExcelXP
Help! Please
От: | Slicer [Mirkwood] | https://ru.linkedin.com/in/maksim-gumerov-039a701b | |
Дата: | 06.07.04 19:01 | ||
Оценка: |
Да не команду на закрытие он игнорирует, а любые OLE-вызовы
От: | Григоричев Денис | |
Дата: | 08.07.04 05:15 | |
Оценка: | 6 (1) |
От: | Slicer [Mirkwood] | https://ru.linkedin.com/in/maksim-gumerov-039a701b | |
Дата: | 08.07.04 09:04 | ||
Оценка: |
Логично
Интересно, а нормальное решение есть? Без имитации клавиатурного ввода?
Ведь такая имитация плоха уже тем, что при этом отменяются внесенные юзверем в ячейку изменения. Сравните это с поведением самого Excel: если мы пытаемся его закрыть в момент редактирования, внесенные в ячейку изменения считаются подтвержденными.
Кстати, напомню, что в ряде случаев такая блокировка со стороны Excel очень логична (если, например, юзверь сидит в диалоговом окне).
Во многих случаях может подойти открытие данных как внедренного OLE-объекта. При этом как только пользователь переключится на другой элемент нашего окна, automation закроет эксель (в т.ч. если эксель был в режиме редактирования — но не в диалоговом окне). Правда, есть и досадный глюк (по кр. мере, в D6): если в design-time открыть (open, а не edit) объект в OLEContainer, а потом закрыть только книгу (но не эксель), будет закрыта и эксель тоже. А вот если то же проделать в рантайме — эксель останется открыта. Подробно не смотрел — может, как-то это регулируется. Ну сопровождение этого глюка — если один раз объект открыли в режиме open и закрыли, потом с ним можно делать что угодно — но в режиме просмотра в контейнере он при этом будет заштрихован серым (как если в данный момент редактируется в режиме open).
На выбор еще три варианта, не полностью, но решающих проблему: 1) ждем, пока Excel не согласна будет выполнить нашу команду (юзер покинет диалог или выйдет из режима редактирования), 2) блокируем пользовательский интерфейс Excel, 3) открываем данные в режиме «только для чтения» (проблема с диалогами остается).
Кстати, а зачем понадобилось показывать юзеру эксель и разрешать редактирование? И почему убивать Excel мы пытаемся из нашего приложения? Раз уж юзеру дали возможность полазить по таблице, так может, он сам определится, когда ему выходить?
От: | Григоричев Денис | |
Дата: | 09.07.04 05:27 | |
Оценка: |
От: | Slicer [Mirkwood] | https://ru.linkedin.com/in/maksim-gumerov-039a701b | |
Дата: | 09.07.04 09:52 | ||
Оценка: |
ГД>Ксати, есть способ убить процесс Excel, если прогу «срубили», например из TaskMan?
Это вряд ли хорошо — в экселе могут быть открыты чьи-то еще документы, кроме подсунутых Вами
От: | yuriyr | |
Дата: | 09.07.04 11:21 | |
Оценка: |
Сделал так
Не могу использовать OleContainer так как суть работы заключается в OLE перетаскивании данных из одного обьекта
в ексель, а сним при потере фокуса в контейнере нифига не сделаешь.
Источник
Delphi excel не закрывать
Использую позднее связывание. Файл создавался в экселе более ранней версии и при закрытии эксель предлагает сохранить его в новом формате. Кнопку «отмена» руками жать все время не прикольно, так как все файлы такие и их будет не мало.
← →
ShiFT ( 2005-11-16 14:01 ) [1]
Excel.Application.DisplayAlerts := False;
Excel.Quit
← →
ANB © ( 2005-11-16 14:07 ) [2]
← →
Prohodil Mimo © ( 2005-11-16 23:03 ) [3]
А вот в конце не забудь вернуть опять в True, иначе если кто-то открыл свой документ, изменил в нём что-то, а после ты выставил DisplayAlerts := False; то при закрытии Excel даже не подумает спросить юзера о сохранении.
Excel.Quit — тоже жестоко по тем причинам, что в Excelе уже может быть открыт какой-то документ, открытый не твоей программой, а следовательно, не тебе его закрывать. Закрывать надо книгу, ну или проверять на ол-во открытых книг, если много — закрыть книгу, если одна — Excel.
← →
ShiFT ( 2005-11-17 06:08 ) [4]
Источник
Delphi excel не закрывать
Проблема такая:
Запускаю Excel (с помощбю стандартных компонент Delphi 5)
Работаю
Отсоединяюсь — Excel остаётся запущеным.
Как мне его закрыть?
вот код:
ExcelPage_Edit.Items.Clear;
try
//Запускаем Excel
Excel := TExcelApplication.Create(Application);
Excel.ConnectKind := ckNewInstance;
Excel.AutoQuit := true;
Excel.connect;
// Открываем файл
Workbook := Excel.Workbooks.Open(self.Price.FullName, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, true, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, false, xlLCID);
// Читаем название всех страниц и пишем
// в итемы для TComboBox (ExcelPage_Edit)
Worksheets := Workbook.Worksheets;
for i:=1 to Worksheets.Count do begin
WorkSheet := (Worksheets.Item[i] as ExcelWorkSheet);
ExcelPage_Edit.Items.Add(WorkSheet.Get_Name);
end;
// Закрываем файл
Workbook.Close(false, EmptyParam, EmptyParam, xlLCID);
Workbook := nil;
// Теперь закрываем Excel
// Excel.FreeNotification(Application);
// Excel.Disconnect;
Excel.Quit;
// Excel.RemoveFreeNotification(Application);
Не работает. — Не закрывается Excel
не Quit, не любой из закоментированных вариантов, не их комбинции.
Объясните в чём тут дело, и как переделать чтоб Excel закрылся.
← →
Наталия ( 2002-11-28 06:53 ) [1]
← →
tga ( 2002-11-28 07:02 ) [2]
Наталия © Спасибо за подсказку — но она НЕ РАБОТАЕТ. Вообще выдаётся ошибка при компиляции — неопределённый идентификатор «UnAssigned» :((((
← →
Наталия ( 2002-11-28 07:25 ) [3]
← →
Fantasist ( 2002-11-29 00:18 ) [4]
Ну добавь Excel.Free.Деструктор TOleControl много чего освобождает.
> Деструктор TOleControl много чего освобождает
В смысле TOleServer.
← →
AlexGreG ( 2002-12-02 08:14 ) [6]
x.Workbooks.Close(xlLCID);
x.Disconnect;
x.Quit;
хотя я даже не знаю, что за параметр такой
LCID, но у меня работает :
Если кто знает, что этот параметр значит, напишите пожалуйста.
← →
AlexGreG ( 2002-12-02 08:16 ) [7]
сам Excel, непонятно почему, выгружается из памяти при закрытии программы.
(я использую компоненту ExcelApplication с закладки Servers)
← →
AlexGreG ( 2002-12-02 08:40 ) [8]
Excel выгружается, когда компонент TExcelApplication освобождает память, т.е. при TExcelApplication.Free;
← →
OlDemon ( 2002-12-02 10:21 ) [9]
А я использую позднее связывание и просто делаю FExcel:= nil
что освобождает память и убивает процесс. Может и вам поможет 🙂
Как вариант — по крайней мере у меня эта проблема решена именно так.
E := CreateOleObject(«Excel.Application»);
.
E.Quit;
E := 0; // вот это ОНО
← →
Fantasist ( 2002-12-02 20:56 ) [11]
> Илайдж (02.12.02 10:42)
> Как вариант — по крайней мере у меня эта проблема решена
> именно так.
Это уже было выше:
> Наталия © (28.11.02 07:25)
> E:=CreateOleObject(«Excel.Application»);
> .
> E:=UnAssigned;
Но мы не любим позднее связывание. 🙂
> Excel выгружается, когда компонент TExcelApplication освобождает
> память, т.е. при TExcelApplication.Free;
И енто уже было:
← →
kse ( 2002-12-09 16:23 ) [12]
Мой ответ немного ( :))) ) запоздал, но тем не менее, мож кто читать будет.
У меня так
ea: TExcelApplication;
eb: TExcelWorkbook;
.
eb.Close;
eb.Disconnect;
ea.Quit;
ea.Disconnect;
Excel закрывается без вопросов и в процессах его нет. (Иль мож я чего не понимаю)
Delphi 6, Win2K, Excel2000.
Источник
← →
ANB ©
(2005-11-16 13:44)
[0]
Использую позднее связывание. Файл создавался в экселе более ранней версии и при закрытии эксель предлагает сохранить его в новом формате. Кнопку «отмена» руками жать все время не прикольно, так как все файлы такие и их будет не мало.
← →
ShiFT
(2005-11-16 14:01)
[1]
Excel.Application.DisplayAlerts := False;
Excel.Quit
← →
ANB ©
(2005-11-16 14:07)
[2]
> ShiFT (16.11.05 14:01) [1]
Спасибо ! Все работает.
← →
Prohodil Mimo ©
(2005-11-16 23:03)
[3]
А вот в конце не забудь вернуть опять в True, иначе если кто-то открыл свой документ, изменил в нём что-то, а после ты выставил DisplayAlerts := False; то при закрытии Excel даже не подумает спросить юзера о сохранении.
Excel.Quit — тоже жестоко по тем причинам, что в Excelе уже может быть открыт какой-то документ, открытый не твоей программой, а следовательно, не тебе его закрывать. Закрывать надо книгу, ну или проверять на ол-во открытых книг, если много — закрыть книгу, если одна — Excel.
← →
ShiFT
(2005-11-17 06:08)
[4]
try
Excel := GetActiveOleObject( "Excel.Application");
except
Excel := CreateOleObject( "Excel.Application");
end;
При такой конструкции. Да наверное Жестоко Закрывать через Excel.Quit.
а если использовать только Excel := CreateOleObject( "Excel.Application");
то создастся отдельное окно( процесс), которое можно закрывать.
по поводу закрытия, ещё можно использовать WBook.Close( SaveChanges := False); // Закрыть без сохранения.
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
… (продолжение следует) …
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Правильно закрыть Excel
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Full Member Рейтинг (т): 10 |
Ребят, всем привет. Использую для работы с Excel следующую конструкцию. По её завершению в процессах остается все равно висеть злосчастный EXCEL.EXE. Как его оттуда убрать?
var Excel : Variant; procedure TMainForm.LoadFromExcel(); begin //создаем объект Excel := CreateOleObject(‘Excel.Application’); //что то с ним делаем Excel.DisplayAlerts := False; //блокировка уведомлений о сохранении Excel.WorkBooks[1].SaveAs(ExcelFileName); try Excel.Workbooks.Close; except end; end; |
Fr0sT |
|
Цитата seska @ 30.11.10, 17:06 По её завершению в процессах остается все равно висеть злосчастный EXCEL.EXE Так ты его и не закрываешь, закрываешь только одну вкладку. Вероятно, надо вызывать что-то вроде Excel.Quit |
seska |
|
Full Member Рейтинг (т): 10 |
Excel.Quit тоже не работает. Вероятно нужно что-то вроде этого, а что конкретно я к сожалению не могу найти ;( |
VahaC |
|
в DRKB -> ActiveX, COM и Другие технологии -> Работа с приложениями Microsoft Office -> Работа с Microsoft Excel -> Как зыкрыть Excel говорят что вот так
try Ex1.Workbooks.Close(LOCALE_USER_DEFAULT); Ex1.Disconnect; Ex1.Quit; Ex1:=nil; except end; |
andrew.virus |
|
seska, для получения результата нужно выполнить следующее:
var tmpExcel: variant; begin // создаем объект tmpExcel:=CreateOleObject(‘Excel.Application’); // что то с ним делаем tmpExcel.Workbooks.Add; // добавляем один лист в книгу // сохраняем полученный результат tmpExcel.DisplayAlerts:=false; // блокируем уведомления о сохранении tmpExcel.ActiveWorkbook.SaveAs(extractfilepath(application.ExeName) + ‘1.xls’); tmpExcel.ActiveWorkbook.Close end; з.ы.: во вложении пример с использованием данного кода …
|
seska |
|
Full Member Рейтинг (т): 10 |
Спасибо, VahaC! Вроде процесс удаляется теперь. Только код немного видоизменил, так он не компилируется.
try Excel.Workbooks.Close; except end; Excel.Quit; Excel := null; Добавлено 30.11.10, 19:16 |
Light13 |
|
Есть замечательная функция Excel := Unassigned. Перед присвоением не забыть сделать Quit. |
Fr0sT |
|
Excel := nil тоже вполне сработает |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0308 ] [ 18 queries used ] [ Generated: 13.04.23, 22:37 GMT ]
Не могу закрыть Excel из Delphi
От: |
yuriyr |
||
Дата: | 06.07.04 11:06 | ||
Оценка: |
У меня форма запускает через Ole Excel
SaveName:=Name;
XLap := CreateOLEObject('Excel.Application');
Workbook := XLap.WorkBooks.Open(Name);
xlap.Visible := true;
xlap.DefaultFilePath:=ExtractFileDir(Name);
а сама всплывает поверх его (из нее я перетаскиваю в ячейки всякую шнягу)
она держит application екселя до своего закрытия,
а при закрытии этой формы я все сохраняю и закрываю ексель
xlap.DisplayAlerts := False;
Workbook.SaveAs(SaveNAme);
xlap.Quit;
Application.ProcessMessages;
Так вот если в екселе не редактируется ячейка все проходит на ура
а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
Вопрос: Как бы его вывести из состояния редактирования ячейки?
YuriyR
Re: Не могу закрыть Excel из Delphi
От: |
Softwarer |
http://softwarer.ru | |
Дата: | 06.07.04 11:16 | ||
Оценка: |
+1 |
Здравствуйте, yuriyr, Вы писали:
Y> xlap.Quit;
Y>Так вот если в екселе не редактируется ячейка все проходит на ура
Y>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.
Re[2]: Не могу закрыть Excel из Delphi
От: |
yuriyr |
||
Дата: | 06.07.04 11:23 | ||
Оценка: |
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, yuriyr, Вы писали:
Y>> xlap.Quit;
Y>>Так вот если в екселе не редактируется ячейка все проходит на ура
Y>>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
S>Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.
Нет первая команда xlap.DisplayAlerts := False;
Она отменяет все вопросы Excel на счет подтверждения сохранения
Но и она — самая первая — не выполняется exeption выдает каманда игнорирована
Re[3]: Не могу закрыть Excel из Delphi
От: |
Softwarer |
http://softwarer.ru | |
Дата: | 06.07.04 11:28 | ||
Оценка: |
Здравствуйте, yuriyr, Вы писали:
Y>Нет первая команда xlap.DisplayAlerts := False;
Виноват, действительно прореагировал «на рефлексах». Прошу прощения.
Re[3]: Не могу закрыть Excel из Delphi
От: |
akasoft
|
||
Дата: | 06.07.04 13:36 | ||
Оценка: |
Здравствуйте, yuriyr, Вы писали:
Y>Нет первая команда xlap.DisplayAlerts := False;
Y>Она отменяет все вопросы Excel на счет подтверждения сохранения
Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это…
… << RSDN@Home 1.1.4 beta 2 >>
Re[4]: Не могу закрыть Excel из Delphi
От: |
yuriyr |
||
Дата: | 06.07.04 16:25 | ||
Оценка: |
Здравствуйте, akasoft, Вы писали:
A>Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это…
Попробовал и так. Изменений нет
OLE error ‘Вызов был отклонен’
Использую ExcelXP
Help! Please
Re: Не могу закрыть Excel из Delphi
От: |
Slicer [Mirkwood]
|
https://ru.linkedin.com/in/maksim-gumerov-039a701b | |
Дата: | 06.07.04 19:01 | ||
Оценка: |
Да не команду на закрытие он игнорирует, а любые OLE-вызовы
Slicer
Специалист — это варвар, невежество которого не всесторонне
Re[5]: Не могу закрыть Excel из Delphi
От: |
Григоричев Денис |
||
Дата: | 08.07.04 05:15 | ||
Оценка: |
6 (1) |
Здравствуйте, yuriyr, Вы писали:
Y>Здравствуйте, akasoft, Вы писали:
A>>Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это…
Y>Попробовал и так. Изменений нет
Y>OLE error ‘Вызов был отклонен’
Y>Использую ExcelXP
Y>Help! Please
Таки да, есть такая бодяга. Проходили.Вылечилось так:
EA.SendKeys(‘{ESC}’,0,LOCALE_USER_DEFAULT);
Где EA — ExcelApplication.
Этим мы вырубаем режим редактирования ячейки. Дальше он принимает все OLE вызовы.
… << RSDN@Home 1.1.3 stable >>
Re[6]: Не могу закрыть Excel из Delphi
От: |
Slicer [Mirkwood]
|
https://ru.linkedin.com/in/maksim-gumerov-039a701b | |
Дата: | 08.07.04 09:04 | ||
Оценка: |
Логично
Интересно, а нормальное решение есть? Без имитации клавиатурного ввода?
Ведь такая имитация плоха уже тем, что при этом отменяются внесенные юзверем в ячейку изменения. Сравните это с поведением самого Excel: если мы пытаемся его закрыть в момент редактирования, внесенные в ячейку изменения считаются подтвержденными.
Кстати, напомню, что в ряде случаев такая блокировка со стороны Excel очень логична (если, например, юзверь сидит в диалоговом окне).
Во многих случаях может подойти открытие данных как внедренного OLE-объекта. При этом как только пользователь переключится на другой элемент нашего окна, automation закроет эксель (в т.ч. если эксель был в режиме редактирования — но не в диалоговом окне). Правда, есть и досадный глюк (по кр. мере, в D6): если в design-time открыть (open, а не edit) объект в OLEContainer, а потом закрыть только книгу (но не эксель), будет закрыта и эксель тоже. А вот если то же проделать в рантайме — эксель останется открыта. Подробно не смотрел — может, как-то это регулируется. Ну сопровождение этого глюка — если один раз объект открыли в режиме open и закрыли, потом с ним можно делать что угодно — но в режиме просмотра в контейнере он при этом будет заштрихован серым (как если в данный момент редактируется в режиме open).
На выбор еще три варианта, не полностью, но решающих проблему: 1) ждем, пока Excel не согласна будет выполнить нашу команду (юзер покинет диалог или выйдет из режима редактирования), 2) блокируем пользовательский интерфейс Excel, 3) открываем данные в режиме «только для чтения» (проблема с диалогами остается).
Кстати, а зачем понадобилось показывать юзеру эксель и разрешать редактирование? И почему убивать Excel мы пытаемся из нашего приложения? Раз уж юзеру дали возможность полазить по таблице, так может, он сам определится, когда ему выходить?
Slicer
Специалист — это варвар, невежество которого не всесторонне
Re[7]: Не могу закрыть Excel из Delphi
От: |
Григоричев Денис |
||
Дата: | 09.07.04 05:27 | ||
Оценка: |
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Логично
SM>Интересно, а нормальное решение есть? Без имитации клавиатурного ввода?
IMHO, нет. Я не нашел, спрашивал об этом на Королевстве Дельфи — мне так и сказали. Так же мне сказали, что сплошная безнадега пытаться узнать позицию курсора при редактировании ячейки.
SM>Ведь такая имитация плоха уже тем, что при этом отменяются внесенные юзверем в ячейку изменения.
Мне это подходило, ибо я все равно затираю содержимое ячейки. В ЭТОМ случае. В другом — ставлю в позицию редактирования. Нашел способ.
SM> Сравните это с поведением самого Excel: если мы пытаемся его закрыть в момент редактирования, внесенные в ячейку изменения считаются подтвержденными.
О, Excel это такая загадочная вещь!
SM>Во многих случаях может подойти открытие данных как внедренного OLE-объекта. При этом как только
Я его так и использую. Мне нужно было достроить меню своими фишками, и, чтобы не мучиться с Add-in-ами, сделал в OleContainer.
SM>Кстати, а зачем понадобилось показывать юзеру эксель и разрешать редактирование? И почему убивать Excel мы пытаемся из нашего приложения? Раз уж юзеру дали возможность полазить по таблице, так может, он сам определится, когда ему выходить?
Не всегда это подходит. У меня это делается в диалоговом окне. Т.е., юзер, сам решает, когда ему прекратить редактирование. Но убиваем Excel из нашего приложения. Ксати, есть способ убить процесс Excel, если прогу «срубили», например из TaskMan?
Денис
… << RSDN@Home 1.1.3 stable >>
Re[8]: Не могу закрыть Excel из Delphi
От: |
Slicer [Mirkwood]
|
https://ru.linkedin.com/in/maksim-gumerov-039a701b | |
Дата: | 09.07.04 09:52 | ||
Оценка: |
ГД>Ксати, есть способ убить процесс Excel, если прогу «срубили», например из TaskMan?
Это вряд ли хорошо — в экселе могут быть открыты чьи-то еще документы, кроме подсунутых Вами
Slicer
Специалист — это варвар, невежество которого не всесторонне
Re[9]: Не могу закрыть Excel из Delphi
От: |
yuriyr |
||
Дата: | 09.07.04 11:21 | ||
Оценка: |
Сделал так
Не могу использовать OleContainer так как суть работы заключается в OLE перетаскивании данных из одного обьекта
в ексель, а сним при потере фокуса в контейнере нифига не сделаешь.
procedure TDSBOXF.OpenTemplate(Name: string);
begin
try
SaveName := Name;
XLap := CreateOLEObject(‘Excel.Application’);
Workbook := XLap.WorkBooks.Open(Name);
xlap.Visible := true;
xlap.DefaultFilePath := ExtractFileDir(Name);
except
end;
Show;
end;
procedure TDSBOXF.FormClose(Sender: TObject; var Action: TCloseAction);
var
i: integer;
findapp: string;
begin
////////////////////////////////////////////////////////////////////////////////
// Save Workbook
////////////////////////////////////////////////////////////////////////////////
try
xlap.DisplayAlerts := False;
Workbook.SaveAs(SaveNAme);
Workbook.Close(False);
Application.ProcessMessages;
except
on E: Exception do
begin
// if (E.ClassName = ‘EOleSysError’) AND (EOleSysError(E).ErrorCode = -2147417848) then Exit; // Отключен клиент
if (E.ClassName = ‘EOleSysError’) and (EOleSysError(E).ErrorCode = -2147418111) then // Заблокирован Excel
begin
findapp := ‘Microsoft Excel — ‘ + ChangeFileExt(ExtractFileNAme(SaveNAme), »);
if not AppActivate(Pchar(findapp)) then
begin
findapp := ‘Microsoft Excel*’;
if not AppActivate(Pchar(findapp)) then Exit;
end;
begin
try
SendKeys(‘{TAB}’, True);
Application.ProcessMessages;
xlap.DisplayAlerts := False;
Workbook.SaveAs(SaveNAme);
Workbook.Close(False);
Application.ProcessMessages;
except
end;
end;
end;
end;
end;
Покритикуйте!
Посылаю TAB через Sendkey32 немного модифицированный.
Там еще пишут XLap := CreateOLEObject(‘Excel.Application 7.8.9… ‘);
Вот эти 7-8-9 сильно нужны или нет ? У меня вроде и так все работает.
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.