|
|
|
Пожалуйста, выделяйте текст программы тегом [с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
Закрыть Excel без сохранения изменений
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Вот так подключаюсь
var Excel, WorkBook, Sheet: Variant; begin Excel := CreateOleObject(‘Excel.Application’); Excel.WorkBooks.Open(‘waranty.xls’,False); WorkBook := Excel.WorkBooks.Item[1]; Excel.Visible:=true; а так отключаюсь
if not VarIsEmpty(Excel) then begin Excel.Quit; Excel:=Unassigned; end; но если были сделаны какие либо изменения в документе то он выбрасывает диалог сохранения «да / нет / отмена». Сообщение отредактировано: VahaC — 24.02.08, 12:09 |
volvo877 |
|
if not VarIsEmpty(Excel) then begin Excel.DisplayAlerts := False; // <— Excel.Quit; Excel:=Unassigned; end; ? |
VahaC |
|
Сенкс помогло Добавлено 24.02.08, 12:45 |
volvo877 |
|
Положи на форму TOleContainer, и открой в нем свой файл, скажем, вот так:
OleContainer1.CreateObjectFromFile(xl_file_name, false); OleContainer1.DoVerb(ovShow); |
VahaC |
|
на ето говорит «Отказанов доступе к указаному устройству, пути или файлу» Добавлено 24.02.08, 14:09 А как тогда должен выглядеть такой вот код
Sheet := Workbook.Sheets.Item[1]; Excel.ActiveWindow.DisplayGridlines:=False; Sheet.Cells.Replace(‘<#number>’,’gdsghrdhgd’) Сообщение отредактировано: VahaC — 24.02.08, 14:17 |
volvo877 |
|
Цитата VahaC @ 24.02.08, 13:55 Удалили последнюю строку и заработало. Не знаю в чем дело, у меня и с DoVerb работает… А вот то, что написано ниже без DoVerb работать точно не будет:
OleContainer1.CreateObjectFromFile(‘G:test.xls’, false); OleContainer1.DoVerb(ovShow); try Excel := GetActiveOleObject(‘Excel.Application’); except ShowMessage(‘Что-то не так …’); Exit; end; Excel.ActiveWindow.DisplayGridlines := False; // Ну, и что там у тебя было еще … |
DEHisOK |
|
сори за оффтоп, облом новый топ создавать |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Система, Windows API
- Следующая тема
[ Script execution time: 0,0401 ] [ 16 queries used ] [ Generated: 13.04.23, 22:37 GMT ]
Содержание
- Delphi закрыть excel без сохранения файла
- Delphi закрыть excel без сохранения файла
- Delphi закрыть excel без сохранения файла
- Закрыть без сохранения
- 14 ответов
Delphi закрыть excel без сохранения файла
Подскажите плиз, как закрыть екселевское приложение без запроса на сохранение, пробовал
xls.quit;
xls.quit(2); — По аналогии с WORD — ругается, неизветсный параметр
← →
Scorpio © ( 2005-12-16 15:07 ) [1]
Мастера подскажите как мне всетаки закрыть ексель без сохранения, а то мозги уже кипят.
← →
Zz_ ( 2005-12-16 15:09 ) [2]
← →
Scorpio © ( 2005-12-16 15:16 ) [3]
xls := CreateOleObject(«Excel.Application»);
app := XLS.Workbooks.Open(«c:spravkaspravka»);
xls.worksheets[«Ëèñò1″].Cells[1,1].Cells:=»Ïðèâåò»;
XLS.ActiveWindow.SelectedSheets.PrintOut(Copies:=1,Collate:=True);
xls.DisplayAlerts;
xls.quit;
xls := unassigned;
app := Unassigned;
Я пробовал с xls.quit; и без, он мне выдает «Метод DisplayAlerts из класса Application завершен неверно».
← →
umbra © ( 2005-12-16 15:23 ) [4]
Можно его обмануть 🙂
← →
Scorpio © ( 2005-12-16 16:03 ) [6]
Всем спасибо, теперь у меня все работает.
Источник
Delphi закрыть excel без сохранения файла
Пожалуйста, выделяйте текст программы тегом [с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 закрыть 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]
Источник
Закрыть без сохранения
1) Хотелось бы узнать, как сделать так, чтобы при закрытии файла Excel программа не спрашивала пользователя «Сохранить изменения?», а сразу закрывала файл без сохранения?
2) Ещё было бы хорошо, чтобы пользователь при сохранении текущего файла не мог сохранить его под этим именем, а только под другим.
Суть в том, что есть файл Excel с макросами, содержание которого (файла) сохранять не нужно. Изменения могут производиться только в процессе работы с этим файлом, а сохранять их нельзя.
14 ответов
[QUOTE]Originally posted by Sergan
1) Хотелось бы узнать, как сделать так, чтобы при закрытии файла Excel программа не спрашивала пользователя «Сохранить изменения?», а сразу закрывала файл без сохранения?
Я поместил команду ActiveWorkbook.Close savechanges:=False в процедуру Workbook_BeforeClose. Теперь при закрытии файла программа не спрашивает «Сохранить изменения?» и закрывает без сохранения.
А как быть со вторым вопросом?
попробуй вот так. может получится
ActiveWorkbook.SaveAs Filename:=»Имя.xls»
ActiveWorkbook.Close savechanges:=True
Originally posted by Dimitry
попробуй вот так. может получится
ActiveWorkbook.SaveAs Filename:=»Имя.xls»
ActiveWorkbook.Close savechanges:=True
Дмитрий,по-моему,эти команды можно применить при выполнении какого-то макроса. Я же хочу, чтобы при нажатии пользователем кнопки или меню «Сохранить», программа предлагала сохранить этот файл под другим именем, а под этим не разрешала вообще.
Как это сделать?
Дмитрий,по-моему,эти команды можно применить при выполнении какого-то макроса. Я же хочу, чтобы при нажатии пользователем кнопки или меню «Сохранить», программа предлагала сохранить этот файл под другим именем, а под этим не разрешала вообще.
Как это сделать?
к сожалению я еще не достиг такого уровння.
и каким образом можно перенастроить стандартные кнопки и команды не знаю.
единственный вариант это создать свою кнопку с такой-же иконкой, а стандартную убрать , если получится
Дмитрий,по-моему,эти команды можно применить при выполнении какого-то макроса. Я же хочу, чтобы при нажатии пользователем кнопки или меню «Сохранить», программа предлагала сохранить этот файл под другим именем, а под этим не разрешала вообще.
Как это сделать?
У тебя какая-то нетривиальная задачка, ты хочешь отобрать у пользователя возможность сохранения файла под тем же названием?
Тогда надо залезть в обработчик события Workbook_BeforeSave этой книги:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
SaveAsUi — True if the Save As dialog box will be displayed — наверное то что тебе нужно.
У тебя какая-то нетривиальная задачка, ты хочешь отобрать у пользователя возможность сохранения файла под тем же названием?
Тогда надо залезть в обработчик события Workbook_BeforeSave этой книги:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
SaveAsUi — True if the Save As dialog box will be displayed — наверное то что тебе нужно.
Да, Сергей, Вы правы: хочу отобрать у пользователя эту возможность. Но использование параметра SaveAsUi ничего не дало. Для того, чтобы пользователь не смог сохранить файл нужно сделать так
тогда файл не сохраняется.
Самое смешное, что написав в обработчике событий выше приведенную команду я и сам теперь этот файл не могу сохранить, то есть не могу сохранить этот код ( Cancel=True )
Поэтому ничего не получается. Как быть?
Самое смешное, что написав в обработчике событий выше приведенную команду я и сам теперь этот файл не могу сохранить, то есть не могу сохранить этот код ( Cancel=True )
Поэтому ничего не получается. Как быть?
Попробуй открыть эту книгу . отключить макросы. изменить нужную процедуру. и сохранить. должно получиться. а вообще ситуация веселая 🙂
Смешно получилось, вот так дашь совет 🙂
Ну пока можно в конце Cancel=False приписать, который все разрешит. Ну пока код не отработан, можно его еще тестить, а сохранять уже в самом конце.
Насчет SaveAsUi, это конечно не решит все проблемы, тут еще надо повозится с проверками, просто мне показалось что удобно будет использовать это уже готовую возможность.
Думаю логика должна быть такая (сходу, не проверяя, убегать уже пора 🙂 )
1. Показываем диалог выбора сохранения файла (простой диалог, который возвращает токо имя и ничего больше не делает): Application.GetSaveAsFilename
2. Проверяем путь, если совпадает с текущим файлом — ругаемся на пользователя, куда-нибудь его посылаем или тихо игнорируем и ставим Cancel=True. Если путь не совпадает, то Cancel=False.
Originally posted by SergeySV
.
Думаю логика должна быть такая
1. Показываем диалог выбора сохранения файла (простой диалог, который возвращает токо имя и ничего больше не делает): Application.GetSaveAsFilename
2. Проверяем путь, если совпадает с текущим файлом — ругаемся на пользователя, куда-нибудь его посылаем или тихо игнорируем и ставим Cancel=True. Если путь не совпадает, то Cancel=False.
Вообщем сделал я следующее:
[COLOR=blue]
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim name, fName As String
name = «имя_файла.xls»
MsgBox «Рекомендуется сохранить файл под именем » + name, , «Внимание!»
ChDir ActiveWorkbook.Path
fName = Application.GetSaveAsFilename(InitialFileName:=name)
[color=green]’Если выбранное имя совпадает с именем текущего файла[/color]
If fName = ActiveWorkbook.FullName Then
[color=green]’Ругаемя на пользователя[/color]
MsgBox «Сохранение файла под текущим именем ЗАПРЕЩЕНО! Сохраниет файл под другим именем!», , «Внимание!»
Cancel = True [color=green]’отключаем сохранение[/color]
Else
[color=green]’иначе сохранение возможно[/color]
Cancel = False
[color=black]ПОСЛЕ ЭТОГО ФАЙЛ СОХРАНЯЕТСЯ ПОД ТЕКУЩИМ ИМЕНЕМ, А НЕ ПОД ТЕМ, КОТОРЫЙ ВЫБРАЛ ПОЛЬЗОВАТЕЛЬ. ВО КАК. ЧТО НУЖНО СДЕЛАТЬ, КАКОМУ ПАРАМЕТРУ ПРИСВОИТЬ ВЫБРАННОЕ ПОЛЬЗОВАТЕЛЕМ ИМЯ, ЧТОБЫ СОХРАНЕНИЕ ПРОИЗОШЛО КАК НАДО . [/color]
End If
End Sub
[/COLOR]
Ещё обнаружил, что при вызове команды «Сохранить как» открывается стандартное окно сохранения, даже
[COLOR=blue]SaveAsUI = False[/COLOR]
не помогает. Вот блин, никак не могу как следует извратиться. Можно конечно просто запретить любое сохранение и всё.
Что посоветуете?
Хм, прикольная получилась задачка, я раз десять подвесил свой Excel, прежде чем во всем разобрался и отладил код 🙂
Сразу поясню насчет параметра SaveAsUI, чтоб он больше нам не мешал — эта переменная в событии _BeforeSave всего лишь показывает как пользователь пытается сохранить файл: серез СОХРАНИТЬ или через СОХРАНИТЬ КАК, и все. Это для информации, соотв. присвоение этой переменной какого своего значение внутри события _BeforeSave не имеет никакого смысла. Тебе Excel эту переменную передал в качестве информации, по ByVal к тому же и то что ей что то еще пытаешься присвоить, на это Excel уже никакого внимание обращать не будет.
Теперь на счет твоих проблем с SaveAs внутри события _BeforeSave.
Тут складывается действительно забавная ситуация. Дело в том, что вызывая метод в SaveAs в этом событии мы порождаем опять же это событие, поэтому очень важно предусмотреть возможность выхода из него, не допустив зацикливания.
Происходит все следующим образом:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
строка1
ThisWorkbook.SaveAs «c:3.xls» ‘ строка2
строка3
End Sub
Мы нажимаем кнопку Сохранить в Excel’е.
попадаем в событие _BeforeSave на строчку1.
Переходим к строчке2 — ThisWorkbook.SaveAs «c:3.xls», которая порождает ВТОРОЕ событие _BeforeSave.
Поэтому со строчки2 мы вновь попадаем на строчку1.
Визуально это можно представить себе так, как если разместить рядом два одниковых куска кода процедуры Private Sub Workbook_BeforeSave и нарисовать стрелку перехода со строчки2 первого куска на второй кусок Private Sub Workbook_BeforeSave.
Эта аналогия будет полной еще в том смысле, что Excel отработает весь второй кусок и потом, ВНИМАНИЕ: вернуться в первый кусок на след. строчку после той, с которой его грубо прервали вызвав SaveAs (т.е. в нашем примере на строчку3)
Т.е. выполнение кода по строчка будет следующее:
строчка1 (_BeforeSave1)
строчка2 (тут мы вызываем еще одно _BeforeSave)
строчка1 (_BeforeSave2)
‘строчка2(_BeforeSave2)
строчка3 (_BeforeSave2)
строчка3 (вернeлись в первый _BeforeSave)
Хорошо видно что если не поставить какое-нибудь доп. условие на строчку2 (.SaveAs), то оно будет каждый раз порождает очередные _BeforeSave и мы так зациклимся.
Поэтому если внутри события _BeforeSave надо сохранить файл под другим названием, то бцдет например такой:
Dim lEvent As Long
Dim bolEx As Boolean
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If lEvent = 0 Then
lEvent = 1
ThisWorkbook.SaveAs «c:3.xls»
ElseIf lEvent = 1 Then
lEvent = 0
bolEx = True
End If
If lEvent = 0 And bolEx Then
bolEx = False
Cancel = False
Else
Cancel = True
End If
Чтобы посмотреть как работает этот код можешь открыть приложенный файл поставить breakpoint на If lEvent = 0 Then в событии _BeforeSave и нажать кнопку сохранить и двигаясь по шагам (через F8 ) увидишь как для второго события устанавливается Cancel=False, а при возвращаении к первому Cancel становится равным =True (если этого не сделать, то получим зависание Excel’я, он будет пытаться сохранить файл, который мы уже сохранили под другим именем, у Excel крышу тогда снесет)
Источник
← →
scorpio_md
(2005-12-16 11:35)
[0]
Подскажите плиз, как закрыть екселевское приложение без запроса на сохранение, пробовал
— По аналогии с WORD — ругается, неизветсный параметр
xls.quit;
xls.quit(2);
← →
Scorpio ©
(2005-12-16 15:07)
[1]
Мастера подскажите как мне всетаки закрыть ексель без сохранения, а то мозги уже кипят.
← →
Zz_
(2005-12-16 15:09)
[2]
DisplayAlerts
← →
Scorpio ©
(2005-12-16 15:16)
[3]
xls := CreateOleObject(«Excel.Application»);
app := XLS.Workbooks.Open(«c:spravkaspravka»);
xls.worksheets[«Ëèñò1″].Cells[1,1].Cells:=»Ïðèâåò»;
XLS.ActiveWindow.SelectedSheets.PrintOut(Copies:=1,Collate:=True);
xls.DisplayAlerts;
xls.quit;
xls := unassigned;
app := Unassigned;
Я пробовал с xls.quit;
и без, он мне выдает «Метод DisplayAlerts из класса Application завершен неверно».
← →
umbra ©
(2005-12-16 15:23)
[4]
xls.DisplayAlerts := false;
← →
Vlad ©
(2005-12-16 15:49)
[5]
> Scorpio © (16.12.05 15:16) [3]
Можно его обмануть
XLS.WorkBooks[1].Saved := True;
XLS.Quit;
← →
Scorpio ©
(2005-12-16 16:03)
[6]
Всем спасибо, теперь у меня все работает.
I have a excel automation application written in Delphi, that accesses a given excel workbook and extracts applying some internal logic different data of the sheets.
It has worked perfectly for years on Excel 2003 and 2007.
Recently some users have Excel 2010. On those users, when my application exits, Excel shows a dialog box asking the user to Save the unmodified worksheet. The message says something about versions of the formulas to be saved in a new 2010 format. Sorry I don’t have the exact words because it is not an english office package.
How can my app prevent excel 2010 showing this annoying and useless box?
Most of the users have Excel 2007, so most of the files that my application needs to process, regardless of the actual Excel version of the user running my app, are in that format, and will be in the future, so migrating all the files is not an option.
258
25 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Хм, прикольная получилась задачка, я раз десять подвесил свой Excel, прежде чем во всем разобрался и отладил код
Сразу поясню насчет параметра SaveAsUI, чтоб он больше нам не мешал — эта переменная в событии _BeforeSave всего лишь показывает как пользователь пытается сохранить файл: серез СОХРАНИТЬ или через СОХРАНИТЬ КАК, и все. Это для информации, соотв. присвоение этой переменной какого своего значение внутри события _BeforeSave не имеет никакого смысла. Тебе Excel эту переменную передал в качестве информации, по ByVal к тому же и то что ей что то еще пытаешься присвоить, на это Excel уже никакого внимание обращать не будет.
Теперь на счет твоих проблем с SaveAs внутри события _BeforeSave.
Тут складывается действительно забавная ситуация. Дело в том, что вызывая метод в SaveAs в этом событии мы порождаем опять же это событие, поэтому очень важно предусмотреть возможность выхода из него, не допустив зацикливания.
Происходит все следующим образом:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
строка1
ThisWorkbook.SaveAs «c:3.xls» ‘ строка2
строка3
End Sub
Мы нажимаем кнопку Сохранить в Excel’е.
попадаем в событие _BeforeSave на строчку1.
Переходим к строчке2 — ThisWorkbook.SaveAs «c:3.xls», которая порождает ВТОРОЕ событие _BeforeSave.
Поэтому со строчки2 мы вновь попадаем на строчку1.
Визуально это можно представить себе так, как если разместить рядом два одниковых куска кода процедуры Private Sub Workbook_BeforeSave и нарисовать стрелку перехода со строчки2 первого куска на второй кусок Private Sub Workbook_BeforeSave.
Эта аналогия будет полной еще в том смысле, что Excel отработает весь второй кусок и потом, ВНИМАНИЕ: вернуться в первый кусок на след. строчку после той, с которой его грубо прервали вызвав SaveAs (т.е. в нашем примере на строчку3)
Т.е. выполнение кода по строчка будет следующее:
строчка1 (_BeforeSave1)
строчка2 (тут мы вызываем еще одно _BeforeSave)
строчка1 (_BeforeSave2)
‘строчка2(_BeforeSave2)
строчка3 (_BeforeSave2)
строчка3 (вернeлись в первый _BeforeSave)
Хорошо видно что если не поставить какое-нибудь доп. условие на строчку2 (.SaveAs), то оно будет каждый раз порождает очередные _BeforeSave и мы так зациклимся.
Поэтому если внутри события _BeforeSave надо сохранить файл под другим названием, то бцдет например такой:
Код:
Dim lEvent As Long
Dim bolEx As Boolean
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If lEvent = 0 Then
lEvent = 1
ThisWorkbook.SaveAs «c:3.xls»
ElseIf lEvent = 1 Then
lEvent = 0
bolEx = True
End If
If lEvent = 0 And bolEx Then
bolEx = False
Cancel = False
Else
Cancel = True
End If
End Sub
Чтобы посмотреть как работает этот код можешь открыть приложенный файл поставить breakpoint на If lEvent = 0 Then в событии _BeforeSave и нажать кнопку сохранить и двигаясь по шагам (через F8 ) увидишь как для второго события устанавливается Cancel=False, а при возвращаении к первому Cancel становится равным =True (если этого не сделать, то получим зависание Excel’я, он будет пытаться сохранить файл, который мы уже сохранили под другим именем, у Excel крышу тогда снесет)