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: Не могу закрыть Excel из Delphi
От: Softwarer http://softwarer.ru
Дата: 06.07.04 11:16
Оценка: +1
Здравствуйте, yuriyr, Вы писали:

Y> xlap.Quit;

Y>Так вот если в екселе не редактируется ячейка все проходит на ура
Y>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.

Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.
Не могу закрыть 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[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[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 сильно нужны или нет ? У меня вроде и так все работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.