Форум: "Начинающим";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];
ВнизПредотвратить запуск Excel. Найти похожие ветки
← →
Neket (2007-05-28 15:20) [0]Подскажите как на время работы моей программы предотвратить запуск Excel. Т.е. Моя прогрмма выгружает из БД данные и складывает их в Excel книгу у которой Visibl=false. Но если на машине запусить Exce (новый файл или уже имещийся) то данные записываются в открытый документ, а нет в тот который создал сам. Как это предотвратить?
ActiveSheet нигде не использую.
← →
Сергей М. © (2007-05-28 16:07) [1]
> как на время работы моей программы предотвратить запуск
> Excel
Запуск кем - тобой программно или пользователем вручную ?
← →
DrPass © (2007-05-28 16:10) [2]
> то данные записываются в открытый документ, а нет в тот
> который создал сам. Как это предотвратить?
Необязательно это делать анальным способом. Можно ведь просто принудительно создать новую рабочую книгу, а не цеплять первую открытую, и выгружать в нее.
← →
Neket (2007-05-28 17:06) [3]2 Сергей М. : Пользователем в ручную.
2 DrPass : Что значит цеплять первую открытую?
Я создаю книигу так
XLApp:= CreateOleObject("Excel.Application");
XL:=XLApp.Workbooks.Add();
и пишу в неё так
XLApp.Cells.Item[Count+3, 8].Value := "Hello World";
XLApp.Cells.Item[Count+3, 8].Font.Bold:=True;
← →
Amoeba © (2007-05-28 17:14) [4]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=249
← →
Neket (2007-05-29 08:39) [5]Долго изучал
> Amoeba © (28.05.07 17:14) [4]
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=249
Но того что мне необходимо так и не нашел... кто может подсказать?
← →
Сергей М. © (2007-05-29 08:50) [6]
> Neket (28.05.07 17:06) [3]
> Пользователем в ручную
Почему ты хочешь ограничить пользователя в праве запустить еще одну копию Excel ?
← →
Neket (2007-05-29 08:54) [7]Потому как в этом случае данные пишутся не в
XLApp:= CreateOleObject("Excel.Application");
XL:=XLApp.Workbooks.Add();
XL.Cells.Item[Count+3, 8].Value := "Hello World";
XL.Cells.Item[Count+3, 8].Font.Bold:=True;
а в этот, вновь созданный и открытый докуент
← →
ЮЮ © (2007-05-29 09:01) [8]> [3] Neket (28.05.07 17:06)
> XLApp.Cells.Item[Count+3, 8].Value := "Hello World";
> XLApp.Cells.Item[Count+3, 8].Font.Bold:=True;
> [7] Neket (29.05.07 08:54)
> XL.Cells.Item[Count+3, 8].Value := "Hello World";
> XL.Cells.Item[Count+3, 8].Font.Bold:=True;
И во втором случае тоже?
← →
Сергей М. © (2007-05-29 09:13) [9]
> Neket (29.05.07 08:54) [7]
> Потому как в этом случае
В каком "таком случае" ?!
Пользователь просто запустил "ручками" еще одну копию Excel и сидит себе покуривает, ничего никуда не "пишет". Ни про какие тайные пассы с первой копией Excel"а, которые твоя программа в этот момент осуществляет, пользователь знать не знает.
?
← →
Neket (2007-05-29 09:36) [10]Дык в том-то и дело... Что если
XLApp:= CreateOleObject("Excel.Application");
XL:=XLApp.Workbooks.Add();
и при этом
XLApp.Visible:=false;
то если юзер отрывает вновь созданный документ
моя XL мало того что становиться видимой так ещё и данные пишуться во вновь созданную книгу а не в ту которую я програмно создал.
← →
Сергей М. © (2007-05-29 09:48) [11]
> Neket (29.05.07 09:36) [10]
Т.е. ты утверждаешь, что юзер в такой ситуации стартует не новый экз-р Excel-приложения, а работает с уже существующей копией, созданной тобой программно ?
← →
Neket (2007-05-29 10:00) [12]Получается что так и есть....
← →
Neket (2007-05-29 10:02) [13]Нее точнее он то стартует по всей видимости новый экземпляр, но в моеё случае почему-то вывод данных осущствляется в этот новый экземпляр...
Вот я и решил пойти по пути наименьшего сопротивления и запретить на время формирование отчета запуск Excel
← →
homm © (2007-05-29 10:04) [14]> [11] Сергей М. © (29.05.07 09:48)
> > Neket (29.05.07 09:36) [10]
> Т.е. ты утверждаешь, что юзер в такой ситуации стартует
> не новый экз-р Excel-приложения, а работает с уже существующей
> копией, созданной тобой программно ?
Сергей, Вы что, читать разучились? Человек уже 4-й раз одно и то-же Вам толдычит.
Он пишет все в свою копию, скрытую, все хоршо. Процесс записи видим продолжительные. И если во время этого процесса пользователь запускает приложение Эксель, то программа начинает писать уже в нее, а не во вновь созданую копию.
← →
Neket (2007-05-29 10:06) [15]
> Нее точнее он то стартует по всей видимости новый экземпляр
Забираю свои слова обратно.... :-)
Специально посмотрел диспетчер задачь... Экземпляр один (и тот же)
← →
Сергей М. © (2007-05-29 10:09) [16]
> Нее точнее он то стартует по всей видимости новый экземпляр
Так по идеологии и должно быть.
> в моеё случае почему-то вывод данных осущствляется в этот
> новый экземпляр
Не верю ..
У тебя свой собственный XLApp-объект, у этого объекта свой собственный объект - активный лист. С объектами, созданными юзером, твои объекты никак не должны пересекаться ...
Что-то ты тут путаешь ..
← →
Neket (2007-05-29 10:17) [17]Я сам не пойму....
Вот кусок кода.
Вот так создается новый экземпляр:
XLApp:= CreateOleObject("Excel.Application");
XL:=XLApp.Workbooks.Add();
XLApp.Workbooks[1].WorkSheets[1].Name:=Diap+" â "+RegName1;
-----------
А вот одна из процедурprocedure MakeXl.Legenda(XLApp:Variant);
begin
Form1.Label1.Caption:="Текст1";
Form1.ProgressBar1.Min:=0;
Form1.ProgressBar1.Max:=10;
Form1.ProgressBar2.Min:=0;
Form1.ProgressBar2.Max:=10;
Form1.ProgressBar1.Position:=0;
Form1.ProgressBar2.Position:=0;
XLApp.Cells.Item[Count+3, 8].Value := "Текст2";
XLApp.Cells.Item[Count+3, 8].Font.Bold:=True;
XLApp.Cells.Item[Count+4, 8].Value:= "47";
XLApp.Cells.Item[Count+4, 9].Value:= "48";
XLApp.Cells.Item[Count+4, 10].Value:= "49";
XLApp.Cells.Item[Count+4, 11].Value:= "50";
XLApp.Cells.Item[Count+4, 12].value:="Текст3";
XLApp.Range["H"+Inttostr(count+4),"K"+Inttostr(count+4)].Select;
XLApp.selection.Font.Bold:=True;
XLApp.selection.Borders.Weight:=3;
XLApp.selection.Orientation:=xlUpward;
XLApp.Cells.Item[Count+6, 8].Value:= "47";
XLApp.Cells.Item[Count+6, 9].Value:= "48";
XLApp.Cells.Item[Count+6, 10].Value:= "49";
XLApp.Cells.Item[Count+6, 11].Value:= "50";
XLApp.Cells.Item[Count+6, 12].value:="Текст1";
XLApp.Range["H"+Inttostr(count+6),"K"+Inttostr(count+6)].Select;
XLApp.selection.Borders.Weight:=2;
XLApp.selection.Interior.Color:=ClMyGreen;
//---
Form1.ProgressBar1.Position:=10;
Form1.ProgressBar2.Position:=10;
end;
← →
clickmaker © (2007-05-29 10:29) [18]
> [17] Neket (29.05.07 10:17)
Explorer - Tools - Folder Options - File Types - XLS - Props - Advanced сними галку Use DDE
Тогда каждый xls будет стартовать свой excel.exe
← →
clickmaker © (2007-05-29 10:32) [19]
> XLS - Props - Advanced
XLS - Advanced - Open - Edit - Use DDE [ ]
← →
homm © (2007-05-29 10:45) [20]> [18] clickmaker ©
А что, пользователям всем тоже снимать?
← →
clickmaker © (2007-05-29 10:52) [21]
> [20] homm © (29.05.07 10:45)
а это уже не наши проблемы )
← →
homm © (2007-05-29 10:54) [22]> а это уже не наши проблемы )
Капец, за что нынче мастера дают :(
Метла по тебе плачет.
← →
clickmaker © (2007-05-29 10:58) [23]
> [22] homm © (29.05.07 10:54)
ваши предложения?
← →
Neket (2007-05-29 10:59) [24]
> clickmaker © (29.05.07 10:32) [19]
>
> > XLS - Props - Advanced
>
> XLS - Advanced - Open - Edit - Use DDE [ ]
Интересно :-)
А програмно этот вопрос возможно решить?
← →
homm © (2007-05-29 11:09) [25]> ваши предложения?
Нет предложений. Потому что опят работы COM. Но через отключение DDE - гнилой костыл.
А вообще прав[16] Сергей М. ©
. У автора скорее всего проблема в 17-й строке.
← →
Сергей М. © (2007-05-29 11:14) [26]
> homm © (29.05.07 10:54) [22]
Умерь пыл, здесь ты не прав)
Можно было попросту намекнуть автору, что если проблема и существует, то она легко обходится программным взаимодействием с Excel как СОМ (а не OLE) сервером.
← →
homm © (2007-05-29 11:18) [27]> Потому что опят работы COM.
* Потому что опыта работы с COM почти нет.
Рука в очередной раз дрогнула :)
← →
Игорь Шевченко © (2007-05-29 11:20) [28]Странно, сколько с Excel не работаю, все пишется из программы куда надо, даже если пользователь при этом запустил десяток Excel"ей для своих нужд.
Наверное у меня программа неправильная.
← →
umbra © (2007-05-29 11:26) [29]а если сразу после создания файл сохранить под новым именем?
← →
clickmaker © (2007-05-29 11:36) [30]XLApp:= CreateOleObject("Excel.Application");
XL:=XLApp.Workbooks.Add();
XL.Sheets[1].Cells[3, 8].Value := "Hello World";
XL.Sheets[1].Cells[3, 8].Font.Bold:=True;
пишет, куда надо
← →
clickmaker © (2007-05-29 11:46) [31]
> [26] Сергей М. © (29.05.07 11:14)
function CreateOleObject(const ClassName: string): IDispatch;
var
ClassID: TCLSID;
begin
ClassID := ProgIDToClassID(ClassName);
OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IDispatch, Result));
end;
может, мне и правда пора за метлой, или это какой-то другой "COM"?
← →
ASoft (2007-05-29 11:59) [32]>Neket
а у вас XLApp.ConectKind=ckNewInstance?
← →
Demon123 (2007-05-30 12:30) [33]Всем спасибо....
Посидел я. Попытался переписать код, но все по прежнему. А именно.
Если я создаю экземпляяр Excel таким образом:XLApp:= CreateOleObject("Excel.Application");
XL:=XLApp.Workbooks.Add();
То, при открытии абсолютно "Левого" файла 1.xls, вся инфа начинает записываться в этот 1.xls, если открыть ещё один файл (к прнимеру 2.xls), то инфа начинает записываться в 2.xls. Т.е. запись начинает производиться в активную книгу которая открыта в одном и том-же экземпляреXLApp:= CreateOleObject("Excel.Application");
← →
clickmaker © (2007-05-30 12:35) [34]
> [33] Demon123 (30.05.07 12:30)
см. код в [30]
← →
umbra © (2007-05-30 13:06) [35]
> XLApp.Cells.Item[Count+3, 8].Value := "Текст2";
эквивалентноXLApp.ActiveWorkbook.ActiveSheet.Cells.Item[Count+3, 8].Value := "Текст2";
так что все работает так, как и должно. Т.е. при открытии "левой" книги она становится активной и поэтому в нее все и пишется
← →
DiamondShark © (2007-05-30 16:02) [36]Оставьте его. Это робот.
← →
Neket (2007-05-31 08:15) [37]
> XLApp.ActiveWorkbook.ActiveSheet.Cells.Item[Count+3, 8].
> Value := "Текст2";
>
> так что все работает так, как и должно. Т.е. при открытии
> "левой" книги она становится активной и поэтому в нее все
> и пишется
Точно...
Теперь понятно.
Всем спасибо за помощь. Извините что сразу не понял :-)
> DiamondShark © (30.05.07 16:02) [36]
> Оставьте его. Это робот.
Я не робот :-(
← →
Котик Б (2007-05-31 11:33) [38]
ShowMessage("Не запускайте пожалуйста Excel во время работы программы");
:)
← →
Neket (2007-06-06 11:14) [39]Ды всерано в каком топике...
Вот ошибка:
Raised exception class EOleException with message "OLE error 800AC472". Process stopped.
← →
sniknik © (2007-06-06 12:11) [40]> Ды всерано в каком топике...
так думаешь? ну значит твои ветки частенько будут удаляться как спам...
> 800AC472
ошибка одновременного доступа. а не открывай один файл в 2х и более программах/потоках... должен быть только один инстанс. (либо установить функцию одновременного доступа. не знаю как программно, не делал, но в самом екселе такое есть, распределенная работа с одним файлом. а раз есть то и сделать можно)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.005 c