zulus
|
 |
« : 27 Март 2013, 08:00:19 » |
|
подскажите как определить какой пакет офиса установлен? выкидываю в Excell данные посредством OLE и заколебался уделать так: if(user = имя юзера) Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str()); else Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str(),56);
как видно, тут определяю по юзверю, зная заведомо что у него стоит: первая строка в выборе - Офис до 2007 года, вторая (после else )моложе... но это ж не правильно  PS тырнета под рукой нет.
|
|
« Последнее редактирование: 29 Март 2013, 13:09:15 от zulus »
|
Записан
|
Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
|
|
|
Blackman
|
 |
« Ответ #1 : 27 Март 2013, 08:11:26 » |
|
DelphiMaster рекомендуют способ ExcelApplication1: TExcelApplication; ... ShowMessage(ExcelApplication1.Version[0]); Но это очевидно в случае использования компонента, через что сделано у тебя - я не в курсе. Рядом же: MsgBox "Welcome to Microsoft Excel version " & _ Application.Version & " running on " & _ Application.OperatingSystem & "!" но язык уже другой, да Расшифровка их нумерации: 14: officeVersion = "2010"; 12: officeVersion = "2007"; 11: officeVersion = "2003"; 10: officeVersion = "XP"; 9: officeVersion = "2000"; 8: officeVersion = "97"; 7: officeVersion = "95";
|
|
« Последнее редактирование: 27 Март 2013, 08:14:49 от Blackman »
|
Записан
|
что-нибудь жизнеутверждающее 
|
|
|
zulus
|
 |
« Ответ #2 : 27 Март 2013, 08:26:05 » |
|
не прокатывает... я не пользуюсь компонентами, создаю объект: Excel=Variant::CreateObject("Excel.Application"); а далее ОЛЕ процелурами открываю и добавляю. про коды разных офисов знаю.... с реестром... хз где и как и есть сомнения по поводу прав юзверей на доступ к реестру... хотя, может быть, через него... только где?
|
|
« Последнее редактирование: 27 Март 2013, 08:28:10 от zulus »
|
Записан
|
Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
|
|
|
Blackman
|
 |
« Ответ #3 : 27 Март 2013, 08:32:31 » |
|
Через реестр тоже много вариантов было. А так OLE-объекты в Delphi вроде же дают подсказки свойств и методов - чисто по названию посмотреть не пробовал? vVarApp=CreateOleObject("Excel.Application");
Можно видеть у отдельных авторов в некоторых примерах конструкцию вида Excel.Application.9 и т.п. , что не является обязательным, а скорее всего и вредным - ориентация будет на конкретную библиотеку *.olb. Без указания версии Offise приложение берет ее из реестра (HREY_CLASSES_ROOT раздел Word.Application ключ CurVer, там можно прочитать Excel.Application.8 или Excel.Application.9 или ...).
|
|
« Последнее редактирование: 27 Март 2013, 08:35:00 от Blackman »
|
Записан
|
что-нибудь жизнеутверждающее 
|
|
|
zulus
|
 |
« Ответ #4 : 27 Март 2013, 08:36:46 » |
|
Через реестр тоже много вариантов было.
А так OLE-объекты в Delphi вроде же дают подсказки свойств и методов - чисто по названию посмотреть не пробовал?
в реестре мне подсказали уже где )): \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office а подсказок билдер не даёт ... зараза, вернее нужных нет... чиортовы ОЛЕ  во! в HREY_CLASSES_ROOT раздел Word.Application ключ CurVer Word.Application.12 (у меня)... пойду поюзаю юзверей 
|
|
« Последнее редактирование: 27 Март 2013, 08:40:14 от zulus »
|
Записан
|
Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
|
|
|
zulus
|
 |
« Ответ #5 : 27 Март 2013, 10:28:49 » |
|
апну сам... вот ветка с версией екселя: HKEY_CLASSES_ROOT\Excel.Application\CurVer вот так я делаю: #include "registry.hpp" ... String S; TRegistry *Reg = new TRegistry; Reg->RootKey = HKEY_CLASSES_ROOT; Reg->OpenKey("\\Excel.Application", false); S = Reg->ReadString("CurVer"); Memo1->Lines->Add("1 " + S ); delete Reg; и нифигашечки (S == NULL)... где я налажал?
|
|
|
Записан
|
Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
|
|
|
Blackman
|
 |
« Ответ #6 : 27 Март 2013, 11:11:43 » |
|
CurVer - это тоже папка. А в ней значение по умолчанию надо прочитать. что-то около: Reg->OpenKey("\\Excel.Application\CurVer", false); S = Reg->ReadString("");
|
|
« Последнее редактирование: 27 Март 2013, 11:15:34 от Blackman »
|
Записан
|
что-нибудь жизнеутверждающее 
|
|
|
zulus
|
 |
« Ответ #7 : 27 Март 2013, 12:21:43 » |
|
CurVer - это тоже папка. А в ней значение по умолчанию надо прочитать. что-то около: Reg->OpenKey("\\Excel.Application\CurVer", false); S = Reg->ReadString(""); не работает... Reg->ReadString("") - пробовал в кавычки вписывать "Значение", "Value0-1-2-3"... короч, метод тыка не проходит...  прикольно... сохранил этот ключ на диске.. вот как он выглядит: [HKEY_CLASSES_ROOT\Excel.Application\CurVer] @="Excel.Application.12"
|
|
« Последнее редактирование: 27 Март 2013, 12:31:28 от zulus »
|
Записан
|
Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
|
|
|
Blackman
|
 |
« Ответ #8 : 27 Март 2013, 12:44:01 » |
|
попробуй null вместо пустых кавычек может...
|
|
|
Записан
|
что-нибудь жизнеутверждающее 
|
|
|
zulus
|
 |
« Ответ #9 : 27 Март 2013, 12:49:02 » |
|
попробуй null вместо пустых кавычек может...
достала эта "угадайка"... блин... не не помогло. такое впечатление, что код вообще работает только до строчки Reg->OpenKey.... ветку выбирает правильно, а дальше - нипанятна... попробовал так: Reg->OpenKey("\\Excel.Backup\\shell\\Open\\command", false); S = Reg->ReadString("command"); те же яйца, вид с боку. но параметр command в одноимённой папке существует!!! т.е. у меня пошто-то тупо не хотит его читать....
|
|
« Последнее редактирование: 27 Март 2013, 13:10:06 от zulus »
|
Записан
|
Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
|
|
|
zulus
|
 |
« Ответ #10 : 27 Март 2013, 14:17:06 » |
|
всё! это тупик: if(Registry->KeyExists(KeyName)){ бла бла бла} выполняет!!! следовательно, ключ видит, но значение читать не хочет! а это может означать, что у меня просто прав нет на то  блин! нужна новая идея... как другим методом определить? вся фигня заключается в том, что Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str()); сохранит документ, но его потом не открыть 
|
|
|
Записан
|
Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
|
|
|
Shire
|
 |
« Ответ #11 : 29 Март 2013, 08:41:33 » |
|
Лучший способ копаться в потрохах офиса - это нажать Alt+F11 и F2  В частности, у объекта Application (скорее всего, у тебя он называется Excel) есть свойство Version. Оно возвращает строковое представление версии (например, для Office 2007 - "12.0"). А вот насчёт "сохраняется и не открывается" - у тебя, похоже, что-то неправильно написано, всё открывается.
|
|
|
Записан
|
|
|
|
zulus
|
 |
« Ответ #12 : 29 Март 2013, 08:54:39 » |
|
Лучший способ копаться в потрохах офиса - это нажать Alt+F11 и F2  В частности, у объекта Application (скорее всего, у тебя он называется Excel) есть свойство Version. Оно возвращает строковое представление версии (например, для Office 2007 - "12.0"). А вот насчёт "сохраняется и не открывается" - у тебя, похоже, что-то неправильно написано, всё открывается. нене. не так понял меня! 1. надо без участия пользователя (ещё до открытия книги) определить как её (книгу) сохранять: if(Офис 2003 или старше) Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str()); else Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str(),56); 2. возможности покопаться в потрохах практически нет....! 3. не так-то всё и просто оказалось.... HKEY rKey; unsigned char Reget[512]; DWORD RegetPath = sizeof(Reget); if(RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"),0,KEY_ALL_ACCESS, &rKey) == ERROR_SUCCESS) { LPBYTE res; RegQueryValueEx(rKey, TEXT("Desktop"), 0, 0, Reget, &RegetPath); RegCloseKey(rKey); } _tprintf("%s",Reget); return 0; интересная наколка, но снова в моём случае, в HKEY_CLASSES_ROOT хз как прочесть переменную "по умолчанию" (CurVer)  PS В *.dll можно, конечно, прочитать версию... но в какой  да и не айс это ...
|
|
« Последнее редактирование: 29 Март 2013, 08:57:32 от zulus »
|
Записан
|
Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
|
|
|
Shire
|
 |
« Ответ #13 : 29 Март 2013, 11:20:36 » |
|
Похоже, это ты не понял. Работа с Excel начинается с создания объекта Application. У этого объекта есть свойство Version. В этом свойстве и находится информация о версии. Для этого не нужно ни копаться в реестре (в котором могут быть недоеденные остатки от других офисов), ни открывать новый документ. Причём, Application (если создавать по умолчанию, "Excel.Application") будет именно нужной, выбранной версии офиса. UPD: если уж очень хочется слазить в реестр, лезь сюда: HKEY_CLASSES_ROOT\Excel.Application\CurVer
Там в свойстве по умолчанию будет текущий ProgID Excel'я - для 2007 офиса - это "Excel.Application.12", для 2003 - "Excel.Application.11".
|
|
« Последнее редактирование: 29 Март 2013, 11:25:05 от Shire »
|
Записан
|
|
|
|
zulus
|
 |
« Ответ #14 : 29 Март 2013, 12:19:01 » |
|
Похоже, это ты не понял. Работа с Excel начинается с создания объекта Application. У этого объекта есть свойство Version. В этом свойстве и находится информация о версии. Для этого не нужно ни копаться в реестре (в котором могут быть недоеденные остатки от других офисов), ни открывать новый документ. Причём, Application (если создавать по умолчанию, "Excel.Application") будет именно нужной, выбранной версии офиса. UPD: если уж очень хочется слазить в реестр, лезь сюда: HKEY_CLASSES_ROOT\Excel.Application\CurVer
Там в свойстве по умолчанию будет текущий ProgID Excel'я - для 2007 офиса - это "Excel.Application.12", для 2003 - "Excel.Application.11". да, с реестром я уж совсем запарился... покажи, плиз как мне тут: Variant Excel; Excel=Variant::CreateObject("Excel.Application"); узнать ... это будет нечто типа: ххх = Excel.OleProcedure("Version"); или я не прав? тыкаться в слепую тяжко 
|
|
|
Записан
|
Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
|
|
|
|