Здравствуйте, yuriyr, Вы писали: Y>Здравствуйте, akasoft, Вы писали:
A>>Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это...
Y>Попробовал и так. Изменений нет Y>OLE error 'Вызов был отклонен' Y>Использую ExcelXP Y>Help! Please
Таки да, есть такая бодяга. Проходили.Вылечилось так:
EA.SendKeys('{ESC}',0,LOCALE_USER_DEFAULT);
Где EA — ExcelApplication.
Этим мы вырубаем режим редактирования ячейки. Дальше он принимает все OLE вызовы.
Здравствуйте, yuriyr, Вы писали:
Y> xlap.Quit; Y>Так вот если в екселе не редактируется ячейка все проходит на ура Y>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.
а сама всплывает поверх его (из нее я перетаскиваю в ячейки всякую шнягу)
она держит application екселя до своего закрытия,
а при закрытии этой формы я все сохраняю и закрываю ексель
Так вот если в екселе не редактируется ячейка все проходит на ура
а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
Вопрос: Как бы его вывести из состояния редактирования ячейки?
YuriyR
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, yuriyr, Вы писали:
Y>> xlap.Quit; Y>>Так вот если в екселе не редактируется ячейка все проходит на ура Y>>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
S>Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.
Нет первая команда xlap.DisplayAlerts := False;
Она отменяет все вопросы Excel на счет подтверждения сохранения
Но и она — самая первая — не выполняется exeption выдает каманда игнорирована
Здравствуйте, yuriyr, Вы писали:
Y>Нет первая команда xlap.DisplayAlerts := False; Y>Она отменяет все вопросы Excel на счет подтверждения сохранения
Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это...
Здравствуйте, akasoft, Вы писали:
A>Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это...
Попробовал и так. Изменений нет
OLE error 'Вызов был отклонен'
Использую ExcelXP
Help! Please
Логично
Интересно, а нормальное решение есть? Без имитации клавиатурного ввода?
Ведь такая имитация плоха уже тем, что при этом отменяются внесенные юзверем в ячейку изменения. Сравните это с поведением самого Excel: если мы пытаемся его закрыть в момент редактирования, внесенные в ячейку изменения считаются подтвержденными.
Кстати, напомню, что в ряде случаев такая блокировка со стороны Excel очень логична (если, например, юзверь сидит в диалоговом окне).
Во многих случаях может подойти открытие данных как внедренного OLE-объекта. При этом как только пользователь переключится на другой элемент нашего окна, automation закроет эксель (в т.ч. если эксель был в режиме редактирования — но не в диалоговом окне). Правда, есть и досадный глюк (по кр. мере, в D6): если в design-time открыть (open, а не edit) объект в OLEContainer, а потом закрыть только книгу (но не эксель), будет закрыта и эксель тоже. А вот если то же проделать в рантайме — эксель останется открыта. Подробно не смотрел — может, как-то это регулируется. Ну сопровождение этого глюка — если один раз объект открыли в режиме open и закрыли, потом с ним можно делать что угодно — но в режиме просмотра в контейнере он при этом будет заштрихован серым (как если в данный момент редактируется в режиме open).
На выбор еще три варианта, не полностью, но решающих проблему: 1) ждем, пока Excel не согласна будет выполнить нашу команду (юзер покинет диалог или выйдет из режима редактирования), 2) блокируем пользовательский интерфейс Excel, 3) открываем данные в режиме "только для чтения" (проблема с диалогами остается).
Кстати, а зачем понадобилось показывать юзеру эксель и разрешать редактирование? И почему убивать Excel мы пытаемся из нашего приложения? Раз уж юзеру дали возможность полазить по таблице, так может, он сам определится, когда ему выходить?
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Логично SM>Интересно, а нормальное решение есть? Без имитации клавиатурного ввода?
IMHO, нет. Я не нашел, спрашивал об этом на Королевстве Дельфи — мне так и сказали. Так же мне сказали, что сплошная безнадега пытаться узнать позицию курсора при редактировании ячейки. SM>Ведь такая имитация плоха уже тем, что при этом отменяются внесенные юзверем в ячейку изменения.
Мне это подходило, ибо я все равно затираю содержимое ячейки. В ЭТОМ случае. В другом — ставлю в позицию редактирования. Нашел способ. SM> Сравните это с поведением самого Excel: если мы пытаемся его закрыть в момент редактирования, внесенные в ячейку изменения считаются подтвержденными.
О, Excel это такая загадочная вещь! SM>Во многих случаях может подойти открытие данных как внедренного OLE-объекта. При этом как только
Я его так и использую. Мне нужно было достроить меню своими фишками, и, чтобы не мучиться с Add-in-ами, сделал в OleContainer.
SM>Кстати, а зачем понадобилось показывать юзеру эксель и разрешать редактирование? И почему убивать Excel мы пытаемся из нашего приложения? Раз уж юзеру дали возможность полазить по таблице, так может, он сам определится, когда ему выходить?
Не всегда это подходит. У меня это делается в диалоговом окне. Т.е., юзер, сам решает, когда ему прекратить редактирование. Но убиваем Excel из нашего приложения. Ксати, есть способ убить процесс Excel, если прогу "срубили", например из TaskMan?
Денис
ГД>Ксати, есть способ убить процесс Excel, если прогу "срубили", например из TaskMan?
Это вряд ли хорошо — в экселе могут быть открыты чьи-то еще документы, кроме подсунутых Вами
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Сделал так
Не могу использовать OleContainer так как суть работы заключается в OLE перетаскивании данных из одного обьекта
в ексель, а сним при потере фокуса в контейнере нифига не сделаешь.
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 сильно нужны или нет ? У меня вроде и так все работает.