|
|
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Я оформил кое-какие необходимые функции в отдельный класс. В приложении есть startup форма, она же, по совместительству, форма-заставка. При ее загрузке выполняются необходимые действия по инициализации приложения. Потом она делается невидимой, но остается загруженной на все время работы приложения. Благодаря этому при попытке закрыть приложение вызывается ее событите Unload. В нем тоже выполняется код по подчистке хвостов после работы. Пробема состоит в следующем. У меня есть некий класс, ссылка на который объявленая на уровне формы frmStartup. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Все замечательно. НО! При активизации формы каким-то образом экземпляр класса уничтожается. в его Terminate вставлен MsgBox, а в отладчике видно, что cls становится Nothing. Как продлить жизнь экземпляру класса ? При запуске приложения в нем накапливается информация, нужная для корректного завершения, то есть он должен дожить до этого момента. frmStartup благополучно доживает в невидимом состоянии. А класс - нет. Как быть ? Пытался выносить ссылку на класс в отдельный модуль (не класса, обычный) - та же петрушка. Создается, а потом благополучно уничтожается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 10:14:05 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
А так на уровне General Declarations пробовал Public cls as Object Set cls = New ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 10:32:20 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
если идет сброс переменных в результате правки кода в режиме остановки и прочих гадостей публиные объекты тоже упадут. кто -то предлагал выносить переменные в библиотечные файлы (codeproject) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 10:37:43 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
авторПри активизации формы каким-то образом экземпляр класса уничтожается. в его Terminate вставлен MsgBox, а в отладчике видно, что cls становится Nothing. при активизации - это в Form_Load? если да, то у тебя в Form_Load где-то сидит локальное объявление Dim cls as CustomClass которое перекрывает cls уровня модуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 10:39:35 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Спасибо за советы, но увы... Уничтожение столь нужного мне экземпляра проверется MsgBox'ом в его Terminate именно для того, что бы не вносить погрешности от процесса отладки. Приложение запускается без какой-либо правки кода, так что по этой причине сброса быть не может. Пробовал и как Object в самом верху модуля формы. Не помогло :( Дублирующего локального объявления абослютно точно нет. Ошибка осталась... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 10:51:02 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
начнем с предположения АлексейК 1) проект полностью компилируется? 2) Class_Initialize есть? (с выражением лица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 10:54:08 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Компилируется полностью. Инитиалайз есть. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 10:57:04 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
на всякий случай - компиляцию проводить с проставленным Option Explicit на уровне всех модулей, так или иначе имеющих отношение к больному классу и затрагиваемых в нем, включая "скрытую форму" (с выражением лица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 10:58:57 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Option Explicit стоит. Глобальную переменную в неклассовый модуль выносил - с тем же эффектом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 11:00:49 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
А как и где производятся обращения к экземпляру класса? Если я не ошибаюсь, то реальное создание экземпляра класса производится при первом обращении к нему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 11:04:16 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
текст формы и класа давай, с указанием строки, на которой происходит уничтожение класса. укажи версию акцесс. ЗЫ в конструкторе класса msgbox - не шибко здорово. Debug.print - спокойнее. (с выражением лица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 11:04:24 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Даю код... Элементарный класс, хранящий данные о ссылке для ее прилинковке при старте приложения (будет выполняться перебор от MaxVersion до MinVersion, например 3.1, 3.0 ... 2.7: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Класс-контейнер, проверяющий ссылки, прилинковывающий их и который ДОЛЖЕН при выходе из приложения отключить те, которые были на его совести: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. Ну, и наконец, форма dlgStartup, в которой все это крутится: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. Модуль LinkReferencesInstance: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 11:19:23 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Неужели придется обходить проблему (записывать действия в специальные таблицы, с тем, чтобы в любой момент восстановить состояние процесса) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 11:47:19 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
в данном случае (дерганье за ссылки ) - вообще никто ничего не обещал. Скажи спасибо, что не отсылает сообщений по известному адресу. нет уверенности, что оно должно работать - тут я не знаю, требуются доп. усилия с моей стороны. С первого взгляда, проблема где-то внутри Public Function LinkReference я бы в "линейный" код все это преобразовал. Класс здесь точно не нужен. (с выражением лица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 11:48:27 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Закомментируй для отладки почти весь код класса кроме инициализации, например, и постепенно открывай код, каждый раз производя проверки при запуске формы. Так локализуешь проблему. Я попробовал на пустышке - даже без обращения к классу, только создание его уже не возвращает Nothing на созданный класс. Так что ошибка где-то в коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 11:58:27 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Ошибка внутри цикла процедуры LinkReference. Экземпляр класса Reference надо создавать внутри цикла, а не снаружи. Т.е. внутри цикла разместить Dim lnkReference as New Reference For version = dbMaxVersion To dbMinVersion Step -0.1 iMajor = Int(version) iMinor = Int((version - iMajor) * 10 + 0.01) Application.References.AddFromGuid lnkReference.Guid, iMajor, iMinor DoEvents If Err.Number <> 0 Then 'MsgBox _ "AddFromGuid" & " " & lnkReference.Name & " " & lnkReference.Guid & _ " " & iMajor & " " & iMinor & " " & _ "Error" & " " & Err.Number & " " & Err.Description Print #1, "AddFromGuid", _ lnkReference.Name, lnkReference.Guid, _ iMajor, iMinor, _ "Error", Err.Number, Err.Description Err.Clear Else Set lnkReference.Reference = Application.References.Item(Application.References.Count) ReferenceCollection.Add lnkReference, sName 'MsgBox _ "AddFromGuid" & " " & lnkReference.Reference.Name & " " & lnkReference.Reference.Guid & " " & _ lnkReference.Reference.Major & " " & lnkReference.Reference.Minor & " " & _ lnkReference.Reference.FullPath Print #1, "AddFromGuid", _ lnkReference.Reference.Name, lnkReference.Reference.Guid, _ lnkReference.Reference.Major, lnkReference.Reference.Minor, _ lnkReference.Reference.FullPath Print #1, "" Close #1 LinkReference = version Exit Function End If Next version ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 12:03:50 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Внутри размещать, наверное, нельзя. Тут такая логика: Создаем объект LinkReference. В цикле подбираем для него конкретные значения Major и Minor. Когда нашли, то в его поле Reference записываем стандартную VBA-шную ссылку, чтобы были доступны ее свойства. Жалко в VBA каждую строчку приходится комментировать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 12:41:04 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Программист-любительЖалко в VBA каждую строчку приходится комментировать... В VBA-редакторе существуют команды Comment Block и Uncomment Block, и я ими активно пользуюсь. К сожалению, их обнаружить не так легко: в меню они отсутствуют, а панель, на которой находятся соответствующие кнопки, не показывается по умолчанию. Самый простой способ "достать" эти функции - это "включить" панель инструментов Edit (удобно расположить её по правой границе окна). Можно также "кастомизировать" меню или панель инструментов Standard, добавив туда эти команды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 13:01:08 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Программист-ЛюбительВнутри размещать, наверное, нельзя. Тут такая логика: Создаем объект LinkReference. В цикле подбираем для него конкретные значения Major и Minor. Когда нашли, то в его поле Reference записываем стандартную VBA-шную ссылку, чтобы были доступны ее свойства. Жалко в VBA каждую строчку приходится комментировать... А почему применяется стандартный VBA-шный объект Reference? По-моему, он имеет какое-то отношение к COM. Это своего рода счетчик. Если количество ссылок на объект с этим счетчиком 0 - то объект уничтожается. Соответственно вызывается Деструктор базового класса. И наверное, по-этому MsBox в твоем деструкторе не отрабатывает. Попробуй написать свой подобный класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 13:02:47 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
2 Dats проект все равно сбросится, если произойдет реальное изменение в наборе ссылок. (с выражением лица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 13:12:09 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Спасибо за Comment Block !!! Проект при переустановке ссылок на объектные библиотеки работает. Цель всего этого ковыряния - запуск приложения на разных версиях Office, с разными версиями библиотек ADODB и ADOX. То есть это те ссылки, которые в ручном режиме цепляются через Tools|References меню VBA. В линейном коде вообще все работает, но я хотел при старте запомнить свежеподключенные ссылки в коллекции, чтобы при выходе их отключить. Как показали эксперименты, если при старте приложения ссылок на ADODB воовсе нет, то ее можно нормально подключить. Но если не отключать при выходе, то при следующем запуске на машине с другой конфигурацией она окажется "broken". Вот такая у меня никак не отключалась. Поэтому я и решил отключать проблемные ссылки (внешние и зависящие от версии MDAC/Office/Windows отключать). При подключении действует простой механизм перебора от высших номеров версии к низшим. Проблема ТОЛЬКО в уничтожении объекта класса за время жизни формы. О чем и вопию... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 15:06:35 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
авторВ линейном коде вообще все работает, но я хотел при старте запомнить свежеподключенные ссылки в коллекции, чтобы при выходе их отключить. я не буду спрашивать, зачем тебе их отключать... сделай макрос автозапуска. свой код по проверке ссылок запускай до старта скрытой формы. Если нужно, результат - сохраняй в таблице. Кешировать в собственных переменных коллекцию ссылок во время исполнения - совсем не надо. При выходе, если очень надо, сравнивай guid ссылки с ожидаемым значением, и отключай на здоровье. ЗЫ вот тебе аналогия. Пишешь класс, поднимаешь экземпляр, потом через vbe дописываешь метод и хочешь обратиться к поднятому экземпляру ( типа по таймеру) - свежедописанный метод подергать... Как думаешь, что получится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 15:15:47 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Пождалуй в таком направлении и переделаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 15:20:33 |
|
||
|
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
|
|||
|---|---|---|---|
|
#18+
Я не понял, а зачем ты версии перебираешь? Или я не понял сути задачи Я просто делал (подключал) референсы с номером версии 0.0, а Акс сам подхватывал существующую на компутере (или не подхватывал - если ее не было :( ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 16:48:01 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32804181&tid=1670063]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 330ms |

| 0 / 0 |
