Закрыть все excel delphi

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 закрыть все эксель
  2. Delphi закрыть все эксель
  3. Клёвый код
  4. Решаем задачи Абрамян на C. Matrix78
  5. Решаем задачи Абрамян на C. Matrix77
  6. Решаем задачи Абрамян на C. Matrix76
  7. Решаем задачи Абрамян на C. Matrix75
  8. Решаем задачи Абрамян на C. Matrix74
  9. Решаем задачи Абрамян на C. Matrix73
  10. Решаем задачи Абрамян на C. Matrix72
  11. Решаем задачи Абрамян на C. Matrix71
  12. Решаем задачи Абрамян на C. Matrix70
  13. Решаем задачи Абрамян на C. Matrix69
  14. Delphi закрыть все эксель

Delphi закрыть все эксель

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

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
. (продолжение следует) .
Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки — бан.
Мат в разделе — бан на три месяца.
Полезные ссылки:
MSDN Library FAQ раздела Поиск по разделу Как правильно задавать вопросы

Выразить свое отношение к модераторам раздела можно здесь: Rouse_, Krid

Источник

Delphi закрыть все эксель

У меня форма запускает через 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 перетаскивании данных из одного обьекта
в ексель, а сним при потере фокуса в контейнере нифига не сделаешь.

Источник

Клёвый код

Скриптописание и кодинг

Решаем задачи Абрамян на C. Matrix78

Matrix78. Дана матрица размера $$M times N$$. Упорядочить ее строки так, чтобы их минимальные элементы образовывали убывающую последовательность.

Решаем задачи Абрамян на C. Matrix77

Matrix77. Дана матрица размера $$M times N$$. Упорядочить ее столбцы так, чтобы их последние элементы образовывали убывающую последовательность.

Решаем задачи Абрамян на C. Matrix76

Matrix76. Дана матрица размера $$M times N$$. Упорядочить ее строки так, чтобы их первые элементы образовывали возрастающую последовательность.

Решаем задачи Абрамян на C. Matrix75

Matrix75. Дана матрица размера $$M times N$$. Элемент матрицы называется ее локальным максимумом, если он больше всех окружающих его элементов. Поменять знак всех локальных максимумов данной матрицы на противоположный. При решении допускается использовать вспомогательную матрицу.

Решаем задачи Абрамян на C. Matrix74

Matrix74. Дана матрица размера $$M times N$$. Элемент матрицы называется ее локальным минимумом, если он меньше всех окружающих его элементов. Заменить все локальные минимумы данной матрицы на нули. При решении допускается использовать вспомогательную матрицу.

Решаем задачи Абрамян на C. Matrix73

Matrix73. Дана матрица размера $$M times N$$. После последнего столбца, содержащего только отрицательные элементы, вставить столбец из нулей. Если требуемых столбцов нет, то вывести матрицу без изменений.

Решаем задачи Абрамян на C. Matrix72

Matrix72. Дана матрица размера $$M times N$$. Перед первым столбцом, содержащим только положительные элементы, вставить столбец из единиц. Если требуемых столбцов нет, то вывести матрицу без изменений.

Решаем задачи Абрамян на C. Matrix71

Matrix71. Дана матрица размера $$M times N$$. Продублировать столбец матрицы, содержащий ее минимальный элемент.

Решаем задачи Абрамян на C. Matrix70

Matrix70. Дана матрица размера $$M times N$$. Продублировать строку матрицы, содержащую ее максимальный элемент.

Решаем задачи Абрамян на C. Matrix69

Matrix69. Дана матрица размера $$M times N$$ и целое число $$K$$ $$(1 le K le $$N$$)$$. После столбца матрицы с номером $$K$$ вставить столбец из единиц.

Источник

Delphi закрыть все эксель

Проблема такая:
Запускаю 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.

Источник

Would someone assist with what I’m sure is a basic error on my part please.

My goal is to open an Excel spreadsheet (invisibly), populate it, attach it to an email, send and close everything.

It is close to complete, except that Excel remains open — in the Task Manager — after the process is complete.

The block of code is:

procedure TFMain.SendEmail;
var
  i, j, r: Integer;
  vBody, vSaveVer: string;
  vAttach: TIdAttachment;
  vMftQty: array [1 .. 2] of Integer;
  vQtyTot: array [1 .. 12] of Integer;
  vNetTot: array [1 .. 12] of Real;
  oXL, oWB, oSheet: Variant;
begin
  IdMessage1.From.Address := 'sage@valid-email.co.uk';
  IdMessage1.From.Domain := 'valid-email.co.uk';
  IdMessage1.From.Text := 'Sage <sage@valid-email.co.uk>';
  IdMessage1.Subject := 'Sage';
  try
    SQLQuery1.Close;
    SQLQuery1.SQL.Clear;
    SQLQuery1.SQL.Add('SELECT comp,dept,e_addr FROM acc_email WHERE dept="' +
      EMailQuery.FieldByName('Dept').Text + '"');
    SQLQuery1.Open;
    while not SQLQuery1.Eof do
    begin
      IdMessage1.Recipients.EMailAddresses :=
        EMailQuery.FieldByName('E_Addr').Text;
      SQLQuery2.Close;
      SQLQuery2.SQL.Clear;
      SQLQuery2.SQL.Add('SELECT * FROM invoice WHERE global_dept_number="' +
        EMailQuery.FieldByName('Dept').Text +
        '" ORDER BY account_ref, stock_code');
      SQLQuery2.Open;

      oXL := CreateOleObject('Excel.Application');
      oXL.DisplayAlerts := False;
      oWB := oXL.Workbooks.Add;
      while not SQLQuery2.Eof do
      begin
        oXL.Cells[r, 1].Value := 'Code';
        oXL.Cells[r, 2].Value := 'Description';
        oXL.Cells[r, j * 2 + 1].Value := 'Qty';
        oXL.Cells[r, j * 2 + 2].Value := 'Value';
        Inc(r);
        oWB.Worksheets.Add(After := oWB.Worksheets[oWB.Worksheets.Count]);
        oSheet := oWB.ActiveSheet;
        oSheet.Name := SQLQuery2.FieldByName('account_ref').Text;
        oXL.Cells[1, j * 2 + 1].Value := 'Month';
        r := 2;
        SQLQuery2.Next;
      end;
      if oWB.Worksheets.Count > 1 then
        oWB.Worksheets.Item['Sheet1'].Delete;
      oWB.Worksheets[1].Select;
      oWB.SaveAs(vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx');
      SQLQuery1.Next;
    end;
    try
      if IdMessage1.Recipients.EMailAddresses <> '' then
      begin
        vAttach := TIdAttachmentFile.Create(IdMessage1.MessageParts,
          vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx');
        IdSMTP1.Connect;
        IdSMTP1.Send(IdMessage1);
        IdMessage1.Recipients.EMailAddresses := '';
        IdMessage1.Body.Text := '';
      end;
    finally
      if IdSMTP1.Connected then
        IdSMTP1.Disconnect;
    end;
  finally
    vAttach.Free;
    oSheet := Unassigned;
    oWB := Unassigned;
    oXL.Quit;
    oXL := Unassigned;
  end;
end;

Yet Excel remains in the Task Manager and as the process runs a few times over the day, they build up in the background.

Could someone direct me to either the solution or how to troubleshoot the problem?

    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,0372 ]   [ 18 queries used ]   [ Generated: 15.04.23, 10:31 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...

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

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

                    Понравилась статья? Поделить с друзьями:
                  • Закрыто редактирование в excel
                  • Закрытия документа word 2007
                  • Закрытие word при печати
                  • Закрылся несохраненный документ word
                  • Закрылся word как восстановить файл