Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.01;
Скачать: CL | DM;

Вниз

Предотвратить запуск 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.056 c
3-1175712325
Seme
2007-04-04 22:45
2007.07.01
Не могу подключиться к MySQL.


1-1178187804
Liza
2007-05-03 14:23
2007.07.01
Я делаю дипломную и мне нужно сделать прозрачное поле для ввода


15-1180774671
@!!ex_
2007-06-02 12:57
2007.07.01
Ну и за что бан?


2-1181129557
TIF
2007-06-06 15:32
2007.07.01
Картинки в Браузере


15-1180639235
Gefd
2007-05-31 23:20
2007.07.01
Проблема с сетью, в которой 2 компьютера.