powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Модули класса. Все ли так просто.
25 сообщений из 70, страница 1 из 3
Модули класса. Все ли так просто.
    #32231951
Видел спор о порядке уничтожения объектов. Ну и мне тоже захотелось подлить масла в огонь.

пусть есть первый класс
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Compare Database
Option Explicit

Private m_c As Collection
Private m_Count As Long
Private Sub Class_Initialize()
    Debug.Print  "clsAny1.Initialize" 
    Set m_c = New Collection
    m_Count =  1 
End Sub

Private Sub Class_Terminate()
    Debug.Print  "clsAny1.Terminate" 
    Set m_c = Nothing
End Sub

Public Sub Add(ByRef cls As clsAny2)
    m_c.Add cls,  "id"  & m_Count
    m_Count = m_Count +  1 
    Set cls.Parent = Me
End Sub


ну куда же без второго класса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Option Compare Database

Private m_parent As clsAny1
Private Sub Class_Initialize()
    Debug.Print  "clsAny2.Initialize" 
End Sub

Private Sub Class_Terminate()
    Debug.Print  "clsAny2.Terminate" 
    Set m_parent = Nothing
End Sub

Property Set Parent(ByRef prnt As clsAny1)
    Set m_parent = prnt
End Property


Ну и наконец тетсовая процедурка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub Test()
    Dim cls1 As clsAny1
    Dim cls2 As clsAny2
    
    Set cls1 = New clsAny1
    Set cls2 = New clsAny2
    cls1.Add cls2
    Set cls2 = Nothing
    Set cls1 = Nothing
End Sub


И что же будет на выходе?

clsAny1.Initialize
clsAny2.Initialize
clsAny2.Terminate
clsAny1.Terminate

Иванов, садись ДВА!

На выходе будет вот что:

clsAny1.Initialize
clsAny2.Initialize

Загвоздка вся в том, что классы содержат ссылки друг на друга.
Исправляется это добавлением следующего метода в класс clsAny1
Код: plaintext
1.
2.
Public Sub RemoveAll()
    Set m_c = Nothing
End Sub

B вызова его в тестовой процедуре.

Выводы:
1. Помнить, что
Set obj = Nothing
не уничтожает объект или выражаясь ООПыми словами не является деструктором объекта, а уничтожает только ссылку на объект.
2. Не верьте событию Terminate, в сложных классах лучше написать свой деструктор.
3. Быть внимательным при программировании отношений Parent-Child.

Вроде все!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32231958
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Будем надеяться, что среди стандартных объектов Аксесса нет таких взаимных ссылок, а есть только строгая иерархия.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32231970
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. Это, кажется, у Гетца описано было... Или еще где - не помню уже... Циклические ссылки... Сам на эти грабли наступал в свое время, да и сейчас случается. Именно поэтому обязательно (во время разработки) веду лог (один из логов), отражающий созданные и уничтоженные классы, а так же в каждой строке счетчик, отображающий "живые" классы. Переодически анализирую этот лог и если в момент выхода из приложения (что прописывается отдельной строкой лога) счетчик не равен нулю, то начинаю копать кто и почему не умер. А хде "масло" та? :)

На счет "масла", то... (если позволите предположить, что речь идет о споре, в котором и я принимал участие)... могу сказать следущее:
Почему мы обсуждаем вопрос об обязательном присвоении объектным переменным значения "Nothing" и даже спорим о порядке выполнения данной процедуры? Ответ один-разъединственный - экономия памяти! Мы пытаемся высвободить память, которая занята объектом, который нам уже не нужен. Более того, мы очень хотим добиться в этом положительног результата , иначе положились бы на механизм автоматического уничтожения переменных (и еже с ними ссылок на объекты) при их выходе за область видимости и не тыкали бы везде и всюду Сет=ничё, Сет=ничё, сет=ниче. Ну а коль скоро мы так печемся о памяти, то позвольте и мне подлить маслеца:
Имеем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ГлобальныеПеременные:           ПамятьПриложения
Строка                          ?
ОбъектА                         ?
ОбъектБ                         ?

СтартоваяПроцедураПроекта:
Строка= "А"  'один символ          1 :  "А" 
ОбъектА= New Что-то              2 : Объект  "Что-то" 
ОбъектБ= New Что-то2             3 : Объект  "Что-то2" 

По ходу выполнения проекта:
Строка= "Некая строка"             1 : X ( "А" ) - мертвая память, запись значения в
                                позицию № 4 
Set ОбъектА=Nothing              2 : Х (Объект  "Что-то" ) - мертвая память
Set ОбъектБ=Nothing              3 : Х (Объект  "Что-то2" ) - мертвая память 
                                 4 :  "Некая строка"  - здесь, ибо не поместилась
                                   полностью в позиции № 1 .

Далее, чтобы мы не делали, как бы мы не пользовались памятью, области с номерами 1-3 останутся "мертвыми" до окончания проекта. Это мое видение того, что происходит внутри, которое частично подтверждается некоторыми тестами. И что же? Мы так яростно боремся за память и тут такая лага оказывается (может быть)...
Пока я не уверен в том, что всё происходит именно так, но в копии рабочего проекта попробовал применить нехитрую технологию: Все глобальные переменные, которые могут по определению занимать различное количество памяти (строковые переменные и массивы. Но с массивами сложнее и проще, поэтому здесь не рассматриваю) в момент старта приложения инициализирую значением, несколько превышающим предположительное максимальное его значение во время выполнения проекта. После этого, специальной строковой переменной произвожу "закрепление" и дальше забываю про всю эту ерунду.
Далее перезапускаю винду, запускаю недоработанный проект, выполняю ряд заранее определенных операций и смотрю на память, которую занимает проект. Повторяю всё тоже самое для доработанного проекта. В последнем случае (после 3-х различных перепроверок) занимаемая процессом память была меньше на 200Кб-1,2Мб(!). Должен сказать, что на ВИДИМОЙ производительности это никак не сказалось, да и на самом деле ХЗ что там творилось во время тестов, но лично для меня это РЕЗУЛЬТАТ.

У меня тоже, вроде, всё!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32231979
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнил про еще один мой тест (какой я скромный оказывается) по данной теме (память), о результатах которого можно посмотреть здесь.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232053
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нуф-Нуф: можно я крамольный вещь скажу?
В мире объектного программирования, до которого мы доплыли попутным ветром, нарастив ветрила с 4 мгц до 3 (или скока щас там?) ГГц, набрав тоннажу с 64кило до (у меня 128 мб, у гордых счастлифчиков побольше :-) никого и не интересует оптимальность как таковая. Зачем большому брату оптимальные программы? Чтобы все сказали - хватит! довольно этой бессмысленной гонки процессорной мощности, памяти, этого универсализма (когда любое окошко растягивается и мышкой можно в любом месте кликнуть) ценой полного забития на стержневые процессы ОС? А деньги!
Неа... Маздай на это пойтить никак не могет. И интел не пойдет, кремниевая долина. Ты как программер должен все время упираться в память и производительность и капать себе, своему начальству, своим клиентам - надо!надо сменить машинный парк! Софтина с такой классной фичей, но работает увы, на железе в 4 раза мощнее. Раскошеливайтесь граждане!
Я, конечно, ретроград, старая калоша, еще буду ныть тут в других топиках про сахар и щи кислые. Но одновременно и чайник, это я правду говорю, просто довольно долго был рядом с ИТ, а жена - конкретный профи. Если подробнее себя описывать, то такое два в одном старой калоши с чайником можно смело именовать самоваром. Поэтому /подбрасывая шишечки и раздувая сапогом огонек/ продолжу диссиденствовать: в середине 80-х, когда на в 1000раз менее мощных DEC-овских машинах программеры макросами на регистры спецпроцессоров сами закидывали данные и биты на контроллерах выставляли, в целом в компе нехилые задачи крутились. Саныч не даст соврать. Ну так примерно в 256-512 кило. и при этом многозадачность - не было проблемы набирать статью в текстовом редакторе, одновременно вычислительная задача какой-нить градиентный спуск делала, ну и, конечно, дискетка в фоновом режиме форматировалась, как же без этого. Правда тогда в программировании не было понятия класса, свойств, методов. Потому что у машины есть центральный процессор, который умеет выполнять команды ОС, и память, в которой можно хранить данные и программы. Остальные "классы" - это всегда, прежде всего, физические устройства, т.е. спецконтроллеры, у которых иерархия свойств и методов реализована на уровне железа. А софтина, обслуживающая класс - это драйвер (имхо).
А теперь вот классы на ПК широкого профиля создаются. Наверное, это удобно для разработчика. Мои общения с "классами" по сути состоят в запуске экземпляра имеющейся программы, например, из аксесса - ворд. Но уж больно сложный огород получается под объекты. Как нажмешь на плюс, объект в отладчике раскрывая, так волосы дыбом встают - сколько добрый акс свойств и методов по умолчанию впендюрит исключительно для удобства разработчика. Какие после этого могут быть рассуждения про оптимальность! Тока успевай мозги дополнительные вставлять да камни новые.

Не знаю. Мое частное мнение - что-то мы конечно нашли, но много и утеряли. И искусственный интеллект ближе не стал к воплощению. Ибо как-то экстенсивно все в ИТ-индустрии развивается.
Хотя, конечно, холодильники через И-нет продукты заказывают. Прогресс не остановить, блин.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232054
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Позволью себе чуть-чуть прояснить. (любопытным это окажется полезным)

Все объекты VBA - суть COM-объекты.
Все COM-объекты имеют следующие функции, которые наследуют от IUnknown (посмотреть в MSDN):
AddRef();
Release();
QueryInterface();
Эти функции являются системными, поэтому не показываются в браузере объектов (по F2), но они есть и активно используются.

Объектная переменная в VBA - это просто ссылка на объект. Когда такой переменной присваивают значение (set cn=new Connection), то у объекта вызывается функция AddRef(), когда ссылка освобождается, вызывается Release(). Чаще всего сам COM-объект ведет счетчик ссылок на себя самого, и как только этот счетчик становиться равным 0-лю, то удаляет сам себя.

QueryInterface() запрашивает у объекта его некоторый интерфейс (вот почему мы порой можем присваивать переменной типа Control какой-нибудь TextBox), т.е. объект может иметь как бы несколько типов.

Этим можно пользоваться. Можно создать объект, реализующий несколько типов. Например, мы создаем некий класс - ElementSpravochnika. Это будет наш базовый класс. Затем, создаем новый класс Sotrudnik, и с помощью ключевого слова Imlements реализуем все public методы и свойства ElementSpravochnika. В этом случае, тип Sotrudnik можно применять везде, где ожидается ElementSpravochnika. Описанным способом можно реализовывать произвольное количество интерфейсов в некотором классе (получаем настоящее ООП).
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232057
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вдогонку,

совсем не обязательно присваивать Nothing для локальных переменных (вопреки неоднократно высказаному в форуме мнению).

При выходе из области видимости объектная ссылка уничтожается сама. И при выходе из-за ошибки в том числе. (например OnError стоит на более высоком уровне). Так что, по-возможности используйте локальные переменные и забудьте для них про Nothing.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232067
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vidmas
Я бы все таки поостерегся давать такие советы.Негоже программисту полагаться на поведение системы (да еще разработанной микрософтом).
Кроме чисто техничечких причин,о которых тут уже немало говорилось,есть еще понятие стиль программирования.И так же ,как Шарапов не оставлял бумажек на своем столе,так и программист не должен оставлять за собой "мусор".
Так и начинается моральное падение:
Сегодня не поставил Set var=nothing,завтра недопил бутылку пива,послезавтра изменил Родине.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232096
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VIG

что значит Негоже программисту полагаться на поведение системы ?

Мы что, на кофейной гуще гадаем, или что - VBA такой уж "черный" ящик?
Да на мой взгляд VB/VBA- это вообще самые отлаженные и надежные технологии, которые когда-либо делала Майкрософт. То, что Access иногда глючит, так это к VBA никакого отношения не имеет, он использует VBA просто как "движок"(Кстати, любой, при желании может использовать VBA-движок в своих программах.)

Сегодня не поставил Set var=nothing,завтра недопил бутылку пива
Диктую большими буквами Set var=nothing не убивает объект, а вызывает у объекта функцию Release() и обнуляет саму объектную ссылку. (см. мои предыдущие посты). При выходе из области видимости, все локальные переменные все-равно очищаются и вызывают у своих объектов Release(), так что ты просто плодишь лишний код.
И еще, если у тебя OnError стоит на более высоком уровне (в вызывающей подпрограмме), и у тебя возникла ошибочная ситуация, и ты не дошел до своих Set var=nothing , так что, по-твоему? Объекты навсегда в памяти остаются?!! До 2000 года подавляющее большинство бизнесс приложений там на западе было написано на VB, причем в основном - серверная часть. Если бы этот микрософтный VBA оставил хотя бы один объект случайно неудаленным, то эту микрософт просто бы уже сожрали за такие дела!

Народ, кончайте вы эти суеверия. Уясните себе твердо: объекты остаются в памяти только при наличии кольцевых ссылок друг на друга, так что лучше обратить внимание именно на это, т.к. в этом случае set var=Nothing ничего не даст, а ты будешь в полной уверенности, что удалил объект. НЕ УДАЛИЛ, удалил все-лишь одну из ссылок на объект. Применять set var=Nothing считаю целесообразным только "сознательно", например по закрытию формы нам надо "разорвать" круг взаимных ссылок, а то форма будет висеть в памяти вечно, хоть и не видимая...

Не, блин "Негоже программисту полагаться на поведение системы"

Это все равно что верить, будто присутствие нехорошего человека может вызывать у программы глюки. Программные глюки бывают только по одной причине ...
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232147
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего себе, понаписали...

2Шкуренко Александр
На выходе будет вот что:

clsAny1.Initialize
clsAny2.Initialize


Хорошо. Вернее плохо. То есть, будем иметь ввиду. Спасибо.

2Нуф-Нуф
Почему мы обсуждаем вопрос об обязательном присвоении объектным переменным значения "Nothing" и даже спорим о порядке выполнения данной процедуры? Ответ один-разъединственный - экономия памяти!

Прости, Нуф, но я протестую. Экономия памяти не всегда критична. Конечно, так писать программы единственно правильно, но... В конце концов, если б Access, как ожидалось, чистил переменные при выходе из области видимости, насколько меньше было бы проблемм. В конце концов, может быть проще купить лишних 256 мб памяти, чем найти подобную "необъяснимую" ошибку (я считаю по затраченному времени/заработанным средствам).

Вопрос об очистке переменных подняли, по крайней мере я в недавнем топике, именно из-за некорректной работы Accessa, из-за которой пользователю пришлось бы для повторного запуска Accessa перезагружать компьютер.

2Vdimas
При выходе из области видимости объектная ссылка уничтожается сама. И при выходе из-за ошибки в том числе.

При выходе из области видимости не уничтожается. (см. 1 пост топика, и мой ответ Нуф-Нуфу)

И при ошибке не всегда. Гарантированно, если переменная живет в библиотеке (или, еще хуже, в библиотечном модуле класса). Для локальной mdb точного рецепта сказать не могу, но подобные проблемы, помнится, у меня были до вынесения части кода и переменных в отдельную mdb.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232154
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geo: 2Vdimas
При выходе из области видимости объектная ссылка уничтожается сама. И при выходе из-за ошибки в том числе.
При выходе из области видимости не уничтожается

Удаляется В ОБЯЗАТЕЛЬНОМ ПОРЯДКЕ именно объектная ссылка . (не путать с самим объектом!!!!) Сам объект удалиться только тогда, когда на него больше не ссылается ни одна объектная ссылка.
Не путать эти понятия.

-------------------------
и все-таки она круглая...
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232158
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2vdimas
Очень хорошо.

Set cls1 = New clsAny1 ' Создали класс , ссылку положили в cls1, отработалась инициализация
Set cls2 = New clsAny2 ' Cоздали класс , ссылку положили в cls2, отработалась инициализация
cls1.Add cls2 ' Создали класс , ссылку положили в переменную в cls1
Set cls2 = Nothing ' Удалили первую ссылку на класс
Set cls1 = Nothing ' Удалили вторую ссылку на класс и единственную - на класс

Вопрос: где осталась хоть одна ссылка на любой из этих классов? Если нигде, почему ни один из них не был уничтожен? Если был, почему не отработались Terminate?
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232162
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да в первом посте обычная циклическая ссылка. :)
Код: plaintext
1.
2.
3.
4.
Public Sub Add(ByRef cls As clsAny2)
    m_c.Add cls,  "id"  & m_Count
    m_Count = m_Count +  1 
    Set cls.Parent = Me
End Sub


Да, ты удалил свои локальные ссылки, но тебе это не помогло (я же говорю, это не панацея, локальные ссылки и так удаляются). Но у нас остались еще объектные ссылки и оба класса ссылаются друг на друга, "держат" друг друга в памяти.
У одного ссылка - Parent, у другого - член коллекции m_c.

елы-палы, уже все поняли...
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232166
А все-таки vdimas прав.
Set obj = Nothing -это скорее правило хорошего тона и не более. Почитав о COM объектах я многое для себя уяснил. Спсиб тебе vdimas.

2 GEO
>Вопрос: где осталась хоть одна ссылка на любой из этих классов? Если нигде, >почему ни один из них не был уничтожен? Если был, почему не отработались >Terminate?

1.Ссылки остались внутри классов. clsAny1 хранит ссылки на все clsAny2 (в данном случае коллекция), а каждый clsAny2 хранит в себе ссылку на clsAny1 (m_parent).

2.Не уничтожились потому-что, не все ссылки были удалены! (см. пост vdimas)

3. Поэтому и не отработало потому что не уничтожились объекты

2 Нуф-Нуф
ну ты даешь, стаким подходом тебе пора ближе к C++ или на крайний случай C#. Так держать!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232169
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в С# та же фигня с циклическими ссылками, можно на VB тренироваться.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232173
Фотография progist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdimas не прав.
Обязательно надо удалять объектные ссылки РУКАМИ
и предусмотреть в обработчике ошибок удаление этих ссылок

Безусловно vdimas интересный раззказчик и глубокий теоретик. И я бы поверил ему. Но много раз удавалось переписыванием кода или советами на форумах избавиться самому или помочь людям избавиться от глюков (чьи это глюки уже совсем не понятно), особенно одного из самых расспространенных - Не закрывается окно Аксесс.
Кроме того рекомендации о том что надо искусственно уничтожать ссылки на объекты всегда давались самыми авторитетными авторами.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232176
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нуф-нуф копает в правильном направлении.
Это не что иное как дефрагментация памяти. Правда строки с объектами там не пересекаются (чесс-слово). Но вот строки со строками и объекты с объектами пересекаются. Память постепенно "дробиться", у нас получается очень много общего свободного места, но в них невозможно создать большой объект, потому как все кусочки маленькие. Потом выделяем память под большой объект, пользуем, удаляем его. А потом вдруг опять хаотически "набегут" маленькие объекты и нагрызут в памяти дыр.

Выход один, постараться минимизировать создание и удаление объектов, порой, созданные объекты (особенно если речь идет о большом количестве маленьких объектов) лучше хранить "про запас" и пользовать по мере надобности, чтобы уменьшить количество парных new и delete.

А вот в .NET гарбадж коллектор ПЕРЕМЕЩАЕТ ОБЪЕКТЫ В ПАМЯТИ, в плане борьбы с дефрагментацией, т.е. там это не страшно.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232179
to progist
Локальны объектные ссылки так же как и простые переменные подчиняются правилам видимости и жизни.
Почему же ты тогда в коде не пытаешся уничтожить ссылку на переменную типа Integer, Long и т.п. Ведь, и объектная ссылка, и переменная это ничто иное как указатель на кусок памяти.

Не закрывается окно Access как раз потому что не все объекты уничтожены. Тестировать и искать ошибки в коде, а не хаять Access!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232180
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas
совсем не обязательно присваивать Nothing для локальных переменных (вопреки неоднократно высказаному в форуме мнению).
Ты бы все-таки поостерегся такие советы давать
Присваивать Nothing - необязательно, но крайне желательно. Если есть что-нибудь типа Close - тоже лучше ручками вызывать.

То, что Access иногда глючит, так это к VBA никакого отношения не имеет
Да иногда и к аксесу никакого отношения не имеет. Например, посчет ссылок глючит в библиотеке DAO. И никак ты с этим не поборешься, кроме как закрывая руками то, что DAO оставил (или наоборот, насильно держа ссылку на то, что DAO почему-то закрывает)

По теме обсуждения.
Циклические ссылки - вещь давно известная и сто раз обмусоленная. Читайте Роджерсона, он давным давно про это все что надо написал. И как бороться - то же.
В дочернем объекте ссылку на Parent получайте не через QueryInterface/AddRef (как автоматом делает VB), а простым копированием указателя (хоть через memcpy). И не будет у вас никаких циклических ссылок.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232184
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
progist
неккоректно передаешь мою мысль.

Автоматически удаляются ТОЛЬКО ЛОКАЛЬНЫЕ ССЫЛКИ .
Все остальные - члены классов или модулей необходимо ОБЯЗАТЕЛЬНО чистить руками. Правда, если на какой-то класс уже никто не ссылается, и он удаляетя, то все его ссылки-мемберы тоже чистятся. Это может вызвать каскадное удаление объектов, если была соблюдена строгая односторонняя направленность владения.

progist, чудес не бывает :)
Возьми свою собственную программу, разрисуй кружочками классы, а стрелочками - взаимные ссылки (для VB ссылка аналогична понятию "владение") и определись, кто-кого держит. Сразу станет понятно, как "разорвать порочный круг".

Разумеется, повсеместное втыкание Set var=Nothing значительно повышает вероятность, что ты случайно напишешь правильно, но п.1. данного топика дал тебе пример, где тебя это ну никак не спасет. Здесь именно необходимо иметь четкое представление о взаимном владении собственных классов, и тогда чудеса исключены. ;)
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232189
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ЛП

Не знаю как в DAO, но ADO я сталкивался с подобным (объекты остаются в памяти). Только это происходило у меня из-за того, что я сам же это и провоцировал.
Описываю ситуацию, в которой я это наблюдал:
dim rs as ADODB.Recordset
set rs=me.Recordset ' получили рекордсет записей на форме.
...
me.RecordSorce="уже другой запрос", (или пользователь F9 нажал).
так вот, именно в этом случае, я должен сделать set rs=Nothing перед сменой свойства me.RecordSorce, т.е. я должен "отпустить" объект рекордсет перед тем, как форма создаст новый рекордсет по изменению свойства me.RecordSorce.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232194
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas
Автоматически удаляются ТОЛЬКО ЛОКАЛЬНЫЕ ССЫЛКИ.
Все остальные - члены классов или модулей необходимо ОБЯЗАТЕЛЬНО чистить руками

Да сколько же раз говорить - локальные ссылки должны удаляться, но иногда не удаляются . Члены классов или модулей точно так же должны удаляться (освобождаться ссылки) при закрытии аксеса. Но иногда этого не происходит.

Пока писал - ты пример на адо привел.
В этом форуме кучу раз советовали делать Requery с помощью конструкции Me.RecordSource = Me.RecordSource - для обычных рекордсетов. И, вроде, для обычный рекордсетов глюков не наблюдали.
И так же кучу раз говорили, что Me.Recordset - это нифига не обычный рекордсет, а мутант какой-то.
Если то, что ты привел - глючит, то это как раз глюк аксеса (Me.Recordset), а не адо (ADODB.Recordset). Имхо.

2 Шкуренко Александр
Не закрывается окно Access как раз потому что не все объекты уничтожены. Тестировать и искать ошибки в коде, а не хаять Access
Тебе показать пример абсолютно правильного кода, выполнение которого приводит к незакрывающемуся аксесу?
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232196
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
показать
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232199
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И так же кучу раз говорили, что Me.Recordset - это нифига не обычный рекордсет, а мутант какой-то.

Жаль что я на SQL.ru только недавно. :(
Потрясающе интересное местечко.

Дык я и говорю, что ведет он себя этот рекордсет ну очень странно. Вполне логично, что это объект не ADO, а внутренний ассессовский, который имплементит интерфейс адошного рекордсета. Вооруженный такими "знаниями", я именно с ним стараюсь вести себя аккуратно, т.е. не "держать" его перед обновлением записей формы.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232200
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вот:\r
\r
/topic/33519\r
\r
На протяжении этого топика есть несколько примеров.
...
Рейтинг: 0 / 0
25 сообщений из 70, страница 1 из 3
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Модули класса. Все ли так просто.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]