Delphi excel не закрывать

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 секунд
В общем все понятно ))

Содержание

  1. Delphi excel не закрывать
  2. Delphi excel не закрывать
  3. 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); // Закрыть без сохранения.


    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Правильно закрыть Excel

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    30.11.10, 17:06

      Full Member

      ***

      Рейтинг (т): 10

      Ребят, всем привет. Использую для работы с Excel следующую конструкцию. По её завершению в процессах остается все равно висеть злосчастный EXCEL.EXE. Как его оттуда убрать?

      ExpandedWrap disabled

        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



      Сообщ.
      #2

      ,
      30.11.10, 17:33

        Цитата seska @ 30.11.10, 17:06

        По её завершению в процессах остается все равно висеть злосчастный EXCEL.EXE

        Так ты его и не закрываешь, закрываешь только одну вкладку. Вероятно, надо вызывать что-то вроде Excel.Quit


        seska



        Сообщ.
        #3

        ,
        30.11.10, 17:45

          Full Member

          ***

          Рейтинг (т): 10

          Excel.Quit тоже не работает. Вероятно нужно что-то вроде этого, а что конкретно я к сожалению не могу найти ;(


          VahaC



          Сообщ.
          #4

          ,
          30.11.10, 18:39

            в DRKB -> ActiveX, COM и Другие технологии -> Работа с приложениями Microsoft Office -> Работа с Microsoft Excel -> Как зыкрыть Excel говорят что вот так

            ExpandedWrap disabled

              try  

                Ex1.Workbooks.Close(LOCALE_USER_DEFAULT);  

                Ex1.Disconnect;  

                Ex1.Quit;  

                Ex1:=nil;  

               except  

               end;


            andrew.virus



            Сообщ.
            #5

            ,
            30.11.10, 18:47

              seska, для получения результата нужно выполнить следующее:

              ExpandedWrap disabled

                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;

              з.ы.: во вложении пример с использованием данного кода …


              Прикреплённый файлПрикреплённый файлexcel_close.zip (1,79 Кбайт, скачиваний: 161)


              seska



              Сообщ.
              #6

              ,
              30.11.10, 19:14

                Full Member

                ***

                Рейтинг (т): 10

                Спасибо, VahaC! Вроде процесс удаляется теперь. Только код немного видоизменил, так он не компилируется.

                ExpandedWrap disabled

                    try

                      Excel.Workbooks.Close;

                    except

                    end;

                    Excel.Quit;

                    Excel := null;

                Добавлено 30.11.10, 19:16
                andrew.virus да, тут задача чтобы Excel была глобальной переменной. Если она локальная, как у тебя, то после выхода из процедуры процесс действительно исчезает


                Light13



                Сообщ.
                #7

                ,
                01.12.10, 09:31

                  Есть замечательная функция Excel := Unassigned. Перед присвоением не забыть сделать Quit.


                  Fr0sT



                  Сообщ.
                  #8

                  ,
                  01.12.10, 11:23

                    Excel := nil тоже вполне сработает

                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                    0 пользователей:

                    • Предыдущая тема
                    • Delphi: Общие вопросы
                    • Следующая тема

                    Рейтинг@Mail.ru

                    [ 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 сильно нужны или нет ? У меня вроде и так все работает.

                    Подождите ...

                    Wait...

                    • Переместить
                    • Удалить
                    • Выделить ветку

                    Пока на собственное сообщение не было ответов, его можно удалить.

                    Понравилась статья? Поделить с друзьями:
                  • Delphi excel название листа
                  • Delphi excel лист ячейка
                  • Delphi excel копирование листа
                  • Delete data in excel
                  • Delete columns in word