Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
2-1181201129
Snane
2007-06-07 11:25
2007.07.01
Замена DBNavigator


3-1175757826
derm
2007-04-05 11:23
2007.07.01
ADO кодировка


15-1180159464
boriskb
2007-05-26 10:04
2007.07.01
Мы


2-1181222942
webpauk
2007-06-07 17:29
2007.07.01
Array of TmyRec


2-1181127648
jaanis
2007-06-06 15:00
2007.07.01
Определить какая .exe открыла порт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский