|
|
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
создаю в приложении объект set OBJ = GetObject(path) (ком -объект) после завершения приложения, которое создало этот объект хочу чтобы он остался. есть мысль что если указать в качестве окна - родителя рабочий стол то поможет ? хотя путаюсь в мыслях как происходит закрытие дочерних объектов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 14:36 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Тут лучше проявить конкретику, потому как некоторые приложения например сами отвязываются если в окно запущенной программы вмешивается пользователь, так например у Excel происходит Вообщем что за программа, какой у нее статус (может access с ней в режиме hide работает, а ты потом хочешь показать ее и оставить висеть) и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 14:47 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
программа - приложение Access я хочу чтоб он не убивался после того как будет закрыто вызвавшее его приложение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 14:52 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Ага, вот так значит Я проводил опыты с Excel, вызывая его из Access. Там так: с ParentWindow ловить нечего, потому как в обоих случаев у Excel нет никакого ParentWindow. Наскоко я в курсе все решает COM технология, именно она глушит сама окно/программу, которая самма по себе то и не ведает что с ней будут творить - она себя полностью отдает COM интерфейсу. Чтобы оставить висеть Excel, я сделал так - просто не стал делать Set xlApp=Nothing - и все. Ссылка не обновилась и COM не убил программу, так и висит, пока я ее вручную не убил. Главное не вешать так прогру в скрытом режиме, а то токо через менеджер задач придется убивать, хотя тоже не очень сложно :) Думаю с Access также можно, поробуй.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:04 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Очепятка: >>Set xlApp=Nothing - и все. Ссылка не обнУЛИлась и... Кстати, это к разговору об автоматической очистке ... Видно что с некоторыми COM объектами пока явно не обнулишь счетчик через Set xlApp=Nothing освобождение памяти происходить не будет, потому что сам компиллятор VBE не собирается делать это за нас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:14 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
к сожалению set ACCOBJ = nothing в случае с аксессом приводит к закрытию объекта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:15 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
2 АлексейК. в оле используется счетчик ссылок на созданные объекты. при каждом присваивании увеличивает на 1 при освобождении уменьшает на 1. когда количество ссылок равно 0 то объект уничтожается. в данном случае можно либо не освобождать текущую ссылку на объект либо выполнить присваивание еще раз. SergeySV предложил на мой взгляд вполне приемлемый путь. как раз то что тебе нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:16 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
в том то и дело что обнуляется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:26 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Ну да АлексейК, я ж как раз обратное предлагал (наверное слишком сумборно) - не делать в своем коде Set ACCOBJ = Nothing Просто ниже, я пошел филосовствовать по поводу того, что некоторые предлагают в своем коде не писать Set rst=Nothing, так как все равно автомат. чистильщик VBE очистит память если время жизни переменной вышло. вроде бы с Recordset не было замечано в этом случае утечек памяти, а вот с внешними COM-объектами - пжл, на лицо явная утечка памяти, токо если это не преднамерено (как в твоем случае). По идее Recodset (ADO, DAO) это же тоже подключаемая библиотека, наверная таже технология COM используется, но эффекты разные. Видимо так задумано было специально, чтобы Com объекты типа программ Excel, Word, Access оставались висеть в памяти если нет явного Set ... = Nothing, ведь в реализации COM интерфейса помойму сам объект решает что ему делать и наверное он может и наплевать, на то что ему пришло указание, что в его услугах больше не нуждаются, а он раз такой и говорит - все фигня, хочу и вешу :-) - ИМХО мое предположение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:30 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Хмм, ща поглядим... с Excel прокатывало ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:31 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
надыбал фишку, буду думать как ее применить: если объект уже создан а я делаю set OBJ = GetObject(path) то объект назначается и после set OBJ = nothing объект не уничтожается!!!! правда не хочется cmdshell для предварительного создания использовать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:35 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Мдаам, действительно противный. закрывается даже тогда, когда теряет ссылку. Set =nothing делал - висит, ну думаю обманул, Excel закрыл, Access тоже закрылся :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:36 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
надо поиметь ссылку на созданный Аксесс.Аппликейшн из другого (не закрываемого) сеанса. Лучше всего - из того самого, который хочется оставит открытым (схватить себя за хвост). Я как-то че-то в этом роде смотрел, но плюнул и сделал через Shell (или ShellExecute). Что неудобно - могут быть у разных юзеров настроены разные пути (разные команды по умолчанию). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:39 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Да, на =Nothing мне тоже удалось его прокатить, но как токо Excel закрываю, то Access грохается полюбому даже несмотря на то, что я там уже вручную какую-то базу открыл. Правда я сейчас смотрю вариант с CreateObject, а не с GetObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:39 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Следуя совету ShellExecute мне удалось заставить висеть Access после закрытия Excel'я. Для этого в базу Access добавил функцию: Set a = GetObject(CurrentProject.FullName) переменная "a" объявлена на уровне формы как public Таким макаром мы сделали ссылку на самого себя и Access остался висеть - прикольно. Ща еще пощупаю код, как можно попроще ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:47 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
авторсхватить себя за хвост вот как бы это сделать... сеейчас ищу в свойствах объекта access путь к каталогу офиса откуда он запущен ... вроде где - то было ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:49 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Так, уточняю: переменную "a" надо объвлять на уровне модуля, потому как если она умрет (время жизни вышло), а Excel пока еще не закрыт и начинает закрывать, то естественно ссылка Access на самого себя пропадает и он успешно закрывается. Теперь надо думать, что делать если в базу низя заранее добавить такой модуль с переменной и функцией. Тут варианты: 1. Добавить модуль и вписать туда строчки кода через COM (где-то на форуме был пример динамического создания и заполнения модуля) - достат. гемморойно, да еще и модуль будет висеть... 2. мда... думая я... нет у меня пока никакго второго варианта :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:53 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
объявлять переменную мне не подходит - проекты будут разные да и вроде кривовато.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 15:54 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
2 АлексейК а если тебе через реестр посмотреть где аксесс прописан? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:04 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Тогда наверное действительно дучше делать через Shell, как например и у Гетца (кое что от меня): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:10 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
c путем к файлу аксесса разобрался Accesspath = ACC.Application.SysCmd(acSysCmdAccessDir) & "msaccess.exe" теперь новая засада почему то Call Shell(Accesspath & " " & Filepath, vbMaximizedFocus) открывает в режиме только чтение.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:10 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
1. я про криэйт и говорил - фихфам там такой же. 2. офтоп авторЧтобы оставить висеть Excel, я сделал так - просто не стал делать Set xlApp=Nothing - и все гы! - а ты сделай так без придания видимости: Код: plaintext 1. 2. 3. 4. у меня после этого в списке процессов столько EXCEL , сколько раз запускалось. (в списке задач EXCEL-а правда нет). И сам файл ручками открывается только с "уведомлением" (пока не убьеш процессы в менеджере) 3. автор свойствах объекта access путь к каталогу офиса может посмотреть в регистри путь по имени (Access.Application.9)(вернее по имени - класс, а в классе путь)? Но, сдается, может быть установлено несколько екзешников (да я как-то и по сети с другой машины екзешник запускал - а тот уж точно в реестр локал машины не был прописан :0). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:11 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
А зачем искать MSACCESS.EXE, Officce и так свои пути прописывает, достаточно написать MSACCESS.EXE и все, попробуйте... А если Access умудрились так хитр поставить, что путей не будет, тогда выведи диалог OpenFile и пусть пользователь сам его ищет, вот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:12 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
>>открывает в режиме только чтение.... у меня такого нет, пишу Shell ("MSACCESS.EXE c:\db2.mdb") и он нормально открывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:15 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
спасибо, это я затупил, забыл его закрыть в предыдущей сессии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:20 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
у вас скорее всего настрока запуска по умолчанию "только чтение" авторПараметры командной строки Следующая таблица содержит список параметров командной строки Microsoft Access. Параметр Результат базаДанных Открытие файла указанной базы данных. При необходимости, укажите путь к этому файлу. /Excl Открытие указанной базы данных с монопольным доступом. Чтобы открыть базу данных для общего доступа в многопользовательской среде, опустите данный параметр. /Ro Открытие указанной базы данных с доступом только для чтения. /User имяПользователя Запуск Microsoft Access с указанным именем пользователя. /Pwd пароль Запуск Microsoft Access с указанным паролем. /Profile конфигурация Запуск Microsoft Access с параметрами указанной конфигурации пользователя, вместо стандартных параметров реестра Windows, записанных при установке Microsoft Access. Данный параметр заменяет параметр /ini, использовавшийся в предыдущих версиях Microsoft Access для указания файла инициализации. Однако параметр /ini будет по-прежнему работать для пользовательских файлов .INI из предыдущих версий Microsoft Access.В комплекте Microsoft Access Developer’s Toolkit содержатся средства создания конфигурации пользователя и их описание. Для получения дополнительных сведений нажмите кнопку . /Compact результирующийФайл Сжатие базы данных, указанной перед параметром /Compact и закрытие Microsoft Access. Если опустить имя результирующего файла базы данных после параметра /Compact, база данных после сжатия записывается в файл с тем же именем. Для сохранения сжатого файла под другим именем необходимо указать имя результирующего файла. /Repair Восстановление указанной базы данных и закрытие Microsoft Access. /Convert результирующийФайл Преобразование базы данных предыдущей версии в формат базы данных Microsoft Access 97 под новым именем и закрытие Microsoft Access. Исходная база данных задается перед параметром /Convert. /X макрос Запуск Microsoft Access с одновременным запуском указанного макроса. Другой способ запуска макроса при открытии базы данных заключается в использовании макроса AutoExec. /Cmd Задание в командной строке значения, возвращаемого функцией Command. Этот параметр должен быть последним параметром командной строки. Вместо параметра /Cmd допускается использование точки с запятой (;).Для получения дополнительных сведений о функции Command нажмите кнопку . /Nostartup Запуск Microsoft Access без вывода стартового диалогового окна (второго диалогового окна, которое видит пользователь при запуске Microsoft Access). /Wrkgrp файлРабочейГруппы Запуск Microsoft Access с использованием указанного файла рабочей группы. авторAccesspath = ACC.Application.SysCmd(acSysCmdAccessDir) & "msaccess.exe" - Сэнкс. Закоплю (обычно теряется). Находил неоднократно :0) Вопросы на засыпку: сколько может быть установлено аксов? Какой из них найдется как "MSACCESS.EXE" ? :0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:21 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
найдется тот который запустился по getobject() )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 15:15 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
откуда такая уверенность? А если я делаю конкретно: CreateObject("Access.Application.8") т.к. у меня стоит еще Access.Application.9 ... Access.Application.ХХХ так какой из них запустится ПРОСТО как "MSACCESS.EXE" ? (из Shell ) (не уверен, что любой запуск любого аксесса перепишет реестр нужным образом). а предложенный вариант {Accesspath = ACC.Application.SysCmd(acSysCmdAccessDir) & "msaccess.exe"} вернет, похоже, что нужно - путь именно к исполняемому в настоящий момент экзешнику. (Или я ошибаюсь?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 15:45 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Нет, все правильно: ACC.Application.SysCmd(acSysCmdAccessDir) & "msaccess.exe - это конечно более надежный способ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 16:33 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
странно, но опытным путем выяснил, если подержаться руками за открытый програмно Access.Application (просто щелкнуть в его окно), то он не закрывается после закрытия родителя. после этого обнаружил, что после Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. , если в вызываемом приложении по умолчанию запускается форма, то оно висит (собирался делать nAcc.Screen.ActiveForm.SetFocus, но не понадобилось) вполне нормально после закрытия вызова. Сейчас попробую в 2000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 17:22 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Так это наверное у тебя Acc97....?! У него раньше была нестандартная реакция на Nothing после Create/Get Object , он любил висеть :) С 2000 все поменялось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 17:41 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
там похуже: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. И, главное, если потом просто закрыть стартовую формочку - эта падла (аппликейшен 9) захлопнется целиком, а вот если создать какой объектик - то вроде не станет . ЗЫ В списке процессов с 97 все в порядке - просто если передать до закрытия в него фокус (просто перйти после Stop руками, то он не закрывается (а ведет себя как4 нормально руками созданный), в отличии от 2000, а в 2000 надо еще и поработать, чтобы он закрываться не начал (перестал). Вот что именно напрочь отобьет ему охоту к закрытию, я пока не выяснил, но покуда открыта стартовая форма, он точно не закрывается) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 17:47 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
Интересно, что если сделать так Set nAcc = CreateObject("Access.Application.8") nAcc.Visible = true то для того чтобы оставить 97 на экране не достаточно просто кликнуть окно, а нужно открыть какой-нибудь диалог, например About или Open ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 17:56 |
|
||
|
GetObject() как отвязать объект от родительского приложения?
|
|||
|---|---|---|---|
|
#18+
2guest действительно nAcc.Visible = True в 97 чуть меняет поведение окна. В случае открытия в вызванном приложении формы (в параметрах запуска), оно все таки остается открытым, но при закрытии окна б.д. (видимо - после закрытия последнего подчиненного окна объекта Screen) станет закрываться (без nAcc.Visible = True - не закрывается и после закрытия окна б.д). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 18:11 |
|
||
|
|

start [/forum/topic.php?all=1&fid=45&tid=1676537]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
164ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 482ms |

| 0 / 0 |
