|
|
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Видел спор о порядке уничтожения объектов. Ну и мне тоже захотелось подлить масла в огонь. пусть есть первый класс Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ну куда же без второго класса Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Ну и наконец тетсовая процедурка Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. И что же будет на выходе? clsAny1.Initialize clsAny2.Initialize clsAny2.Terminate clsAny1.Terminate Иванов, садись ДВА! На выходе будет вот что: clsAny1.Initialize clsAny2.Initialize Загвоздка вся в том, что классы содержат ссылки друг на друга. Исправляется это добавлением следующего метода в класс clsAny1 Код: plaintext 1. 2. B вызова его в тестовой процедуре. Выводы: 1. Помнить, что Set obj = Nothing не уничтожает объект или выражаясь ООПыми словами не является деструктором объекта, а уничтожает только ссылку на объект. 2. Не верьте событию Terminate, в сложных классах лучше написать свой деструктор. 3. Быть внимательным при программировании отношений Parent-Child. Вроде все! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2003, 21:54 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Будем надеяться, что среди стандартных объектов Аксесса нет таких взаимных ссылок, а есть только строгая иерархия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2003, 22:10 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Ну да. Это, кажется, у Гетца описано было... Или еще где - не помню уже... Циклические ссылки... Сам на эти грабли наступал в свое время, да и сейчас случается. Именно поэтому обязательно (во время разработки) веду лог (один из логов), отражающий созданные и уничтоженные классы, а так же в каждой строке счетчик, отображающий "живые" классы. Переодически анализирую этот лог и если в момент выхода из приложения (что прописывается отдельной строкой лога) счетчик не равен нулю, то начинаю копать кто и почему не умер. А хде "масло" та? :) На счет "масла", то... (если позволите предположить, что речь идет о споре, в котором и я принимал участие)... могу сказать следущее: Почему мы обсуждаем вопрос об обязательном присвоении объектным переменным значения "Nothing" и даже спорим о порядке выполнения данной процедуры? Ответ один-разъединственный - экономия памяти! Мы пытаемся высвободить память, которая занята объектом, который нам уже не нужен. Более того, мы очень хотим добиться в этом положительног результата , иначе положились бы на механизм автоматического уничтожения переменных (и еже с ними ссылок на объекты) при их выходе за область видимости и не тыкали бы везде и всюду Сет=ничё, Сет=ничё, сет=ниче. Ну а коль скоро мы так печемся о памяти, то позвольте и мне подлить маслеца: Имеем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Далее, чтобы мы не делали, как бы мы не пользовались памятью, области с номерами 1-3 останутся "мертвыми" до окончания проекта. Это мое видение того, что происходит внутри, которое частично подтверждается некоторыми тестами. И что же? Мы так яростно боремся за память и тут такая лага оказывается (может быть)... Пока я не уверен в том, что всё происходит именно так, но в копии рабочего проекта попробовал применить нехитрую технологию: Все глобальные переменные, которые могут по определению занимать различное количество памяти (строковые переменные и массивы. Но с массивами сложнее и проще, поэтому здесь не рассматриваю) в момент старта приложения инициализирую значением, несколько превышающим предположительное максимальное его значение во время выполнения проекта. После этого, специальной строковой переменной произвожу "закрепление" и дальше забываю про всю эту ерунду. Далее перезапускаю винду, запускаю недоработанный проект, выполняю ряд заранее определенных операций и смотрю на память, которую занимает проект. Повторяю всё тоже самое для доработанного проекта. В последнем случае (после 3-х различных перепроверок) занимаемая процессом память была меньше на 200Кб-1,2Мб(!). Должен сказать, что на ВИДИМОЙ производительности это никак не сказалось, да и на самом деле ХЗ что там творилось во время тестов, но лично для меня это РЕЗУЛЬТАТ. У меня тоже, вроде, всё! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2003, 22:55 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Вспомнил про еще один мой тест (какой я скромный оказывается) по данной теме (память), о результатах которого можно посмотреть здесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2003, 23:12 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Нуф-Нуф: можно я крамольный вещь скажу? В мире объектного программирования, до которого мы доплыли попутным ветром, нарастив ветрила с 4 мгц до 3 (или скока щас там?) ГГц, набрав тоннажу с 64кило до (у меня 128 мб, у гордых счастлифчиков побольше :-) никого и не интересует оптимальность как таковая. Зачем большому брату оптимальные программы? Чтобы все сказали - хватит! довольно этой бессмысленной гонки процессорной мощности, памяти, этого универсализма (когда любое окошко растягивается и мышкой можно в любом месте кликнуть) ценой полного забития на стержневые процессы ОС? А деньги! Неа... Маздай на это пойтить никак не могет. И интел не пойдет, кремниевая долина. Ты как программер должен все время упираться в память и производительность и капать себе, своему начальству, своим клиентам - надо!надо сменить машинный парк! Софтина с такой классной фичей, но работает увы, на железе в 4 раза мощнее. Раскошеливайтесь граждане! Я, конечно, ретроград, старая калоша, еще буду ныть тут в других топиках про сахар и щи кислые. Но одновременно и чайник, это я правду говорю, просто довольно долго был рядом с ИТ, а жена - конкретный профи. Если подробнее себя описывать, то такое два в одном старой калоши с чайником можно смело именовать самоваром. Поэтому /подбрасывая шишечки и раздувая сапогом огонек/ продолжу диссиденствовать: в середине 80-х, когда на в 1000раз менее мощных DEC-овских машинах программеры макросами на регистры спецпроцессоров сами закидывали данные и биты на контроллерах выставляли, в целом в компе нехилые задачи крутились. Саныч не даст соврать. Ну так примерно в 256-512 кило. и при этом многозадачность - не было проблемы набирать статью в текстовом редакторе, одновременно вычислительная задача какой-нить градиентный спуск делала, ну и, конечно, дискетка в фоновом режиме форматировалась, как же без этого. Правда тогда в программировании не было понятия класса, свойств, методов. Потому что у машины есть центральный процессор, который умеет выполнять команды ОС, и память, в которой можно хранить данные и программы. Остальные "классы" - это всегда, прежде всего, физические устройства, т.е. спецконтроллеры, у которых иерархия свойств и методов реализована на уровне железа. А софтина, обслуживающая класс - это драйвер (имхо). А теперь вот классы на ПК широкого профиля создаются. Наверное, это удобно для разработчика. Мои общения с "классами" по сути состоят в запуске экземпляра имеющейся программы, например, из аксесса - ворд. Но уж больно сложный огород получается под объекты. Как нажмешь на плюс, объект в отладчике раскрывая, так волосы дыбом встают - сколько добрый акс свойств и методов по умолчанию впендюрит исключительно для удобства разработчика. Какие после этого могут быть рассуждения про оптимальность! Тока успевай мозги дополнительные вставлять да камни новые. Не знаю. Мое частное мнение - что-то мы конечно нашли, но много и утеряли. И искусственный интеллект ближе не стал к воплощению. Ибо как-то экстенсивно все в ИТ-индустрии развивается. Хотя, конечно, холодильники через И-нет продукты заказывают. Прогресс не остановить, блин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 02:39 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Позволью себе чуть-чуть прояснить. (любопытным это окажется полезным) Все объекты 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. Описанным способом можно реализовывать произвольное количество интерфейсов в некотором классе (получаем настоящее ООП). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 02:41 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Да, вдогонку, совсем не обязательно присваивать Nothing для локальных переменных (вопреки неоднократно высказаному в форуме мнению). При выходе из области видимости объектная ссылка уничтожается сама. И при выходе из-за ошибки в том числе. (например OnError стоит на более высоком уровне). Так что, по-возможности используйте локальные переменные и забудьте для них про Nothing. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 02:53 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
2 vidmas Я бы все таки поостерегся давать такие советы.Негоже программисту полагаться на поведение системы (да еще разработанной микрософтом). Кроме чисто техничечких причин,о которых тут уже немало говорилось,есть еще понятие стиль программирования.И так же ,как Шарапов не оставлял бумажек на своем столе,так и программист не должен оставлять за собой "мусор". Так и начинается моральное падение: Сегодня не поставил Set var=nothing,завтра недопил бутылку пива,послезавтра изменил Родине. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 09:44 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
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 считаю целесообразным только "сознательно", например по закрытию формы нам надо "разорвать" круг взаимных ссылок, а то форма будет висеть в памяти вечно, хоть и не видимая... Не, блин "Негоже программисту полагаться на поведение системы" Это все равно что верить, будто присутствие нехорошего человека может вызывать у программы глюки. Программные глюки бывают только по одной причине ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 12:50 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Ничего себе, понаписали... 2Шкуренко Александр На выходе будет вот что: clsAny1.Initialize clsAny2.Initialize Хорошо. Вернее плохо. То есть, будем иметь ввиду. Спасибо. 2Нуф-Нуф Почему мы обсуждаем вопрос об обязательном присвоении объектным переменным значения "Nothing" и даже спорим о порядке выполнения данной процедуры? Ответ один-разъединственный - экономия памяти! Прости, Нуф, но я протестую. Экономия памяти не всегда критична. Конечно, так писать программы единственно правильно, но... В конце концов, если б Access, как ожидалось, чистил переменные при выходе из области видимости, насколько меньше было бы проблемм. В конце концов, может быть проще купить лишних 256 мб памяти, чем найти подобную "необъяснимую" ошибку (я считаю по затраченному времени/заработанным средствам). Вопрос об очистке переменных подняли, по крайней мере я в недавнем топике, именно из-за некорректной работы Accessa, из-за которой пользователю пришлось бы для повторного запуска Accessa перезагружать компьютер. 2Vdimas При выходе из области видимости объектная ссылка уничтожается сама. И при выходе из-за ошибки в том числе. При выходе из области видимости не уничтожается. (см. 1 пост топика, и мой ответ Нуф-Нуфу) И при ошибке не всегда. Гарантированно, если переменная живет в библиотеке (или, еще хуже, в библиотечном модуле класса). Для локальной mdb точного рецепта сказать не могу, но подобные проблемы, помнится, у меня были до вынесения части кода и переменных в отдельную mdb. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 15:34 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Geo: 2Vdimas При выходе из области видимости объектная ссылка уничтожается сама. И при выходе из-за ошибки в том числе. При выходе из области видимости не уничтожается Удаляется В ОБЯЗАТЕЛЬНОМ ПОРЯДКЕ именно объектная ссылка . (не путать с самим объектом!!!!) Сам объект удалиться только тогда, когда на него больше не ссылается ни одна объектная ссылка. Не путать эти понятия. ------------------------- и все-таки она круглая... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 15:48 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
2vdimas Очень хорошо. Set cls1 = New clsAny1 ' Создали класс , ссылку положили в cls1, отработалась инициализация Set cls2 = New clsAny2 ' Cоздали класс , ссылку положили в cls2, отработалась инициализация cls1.Add cls2 ' Создали класс , ссылку положили в переменную в cls1 Set cls2 = Nothing ' Удалили первую ссылку на класс Set cls1 = Nothing ' Удалили вторую ссылку на класс и единственную - на класс Вопрос: где осталась хоть одна ссылка на любой из этих классов? Если нигде, почему ни один из них не был уничтожен? Если был, почему не отработались Terminate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 15:58 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
да в первом посте обычная циклическая ссылка. :) Код: plaintext 1. 2. 3. 4. Да, ты удалил свои локальные ссылки, но тебе это не помогло (я же говорю, это не панацея, локальные ссылки и так удаляются). Но у нас остались еще объектные ссылки и оба класса ссылаются друг на друга, "держат" друг друга в памяти. У одного ссылка - Parent, у другого - член коллекции m_c. елы-палы, уже все поняли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:05 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
А все-таки vdimas прав. Set obj = Nothing -это скорее правило хорошего тона и не более. Почитав о COM объектах я многое для себя уяснил. Спсиб тебе vdimas. 2 GEO >Вопрос: где осталась хоть одна ссылка на любой из этих классов? Если нигде, >почему ни один из них не был уничтожен? Если был, почему не отработались >Terminate? 1.Ссылки остались внутри классов. clsAny1 хранит ссылки на все clsAny2 (в данном случае коллекция), а каждый clsAny2 хранит в себе ссылку на clsAny1 (m_parent). 2.Не уничтожились потому-что, не все ссылки были удалены! (см. пост vdimas) 3. Поэтому и не отработало потому что не уничтожились объекты 2 Нуф-Нуф ну ты даешь, стаким подходом тебе пора ближе к C++ или на крайний случай C#. Так держать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:11 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
в С# та же фигня с циклическими ссылками, можно на VB тренироваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:15 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
vdimas не прав. Обязательно надо удалять объектные ссылки РУКАМИ и предусмотреть в обработчике ошибок удаление этих ссылок Безусловно vdimas интересный раззказчик и глубокий теоретик. И я бы поверил ему. Но много раз удавалось переписыванием кода или советами на форумах избавиться самому или помочь людям избавиться от глюков (чьи это глюки уже совсем не понятно), особенно одного из самых расспространенных - Не закрывается окно Аксесс. Кроме того рекомендации о том что надо искусственно уничтожать ссылки на объекты всегда давались самыми авторитетными авторами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:21 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
Нуф-нуф копает в правильном направлении. Это не что иное как дефрагментация памяти. Правда строки с объектами там не пересекаются (чесс-слово). Но вот строки со строками и объекты с объектами пересекаются. Память постепенно "дробиться", у нас получается очень много общего свободного места, но в них невозможно создать большой объект, потому как все кусочки маленькие. Потом выделяем память под большой объект, пользуем, удаляем его. А потом вдруг опять хаотически "набегут" маленькие объекты и нагрызут в памяти дыр. Выход один, постараться минимизировать создание и удаление объектов, порой, созданные объекты (особенно если речь идет о большом количестве маленьких объектов) лучше хранить "про запас" и пользовать по мере надобности, чтобы уменьшить количество парных new и delete. А вот в .NET гарбадж коллектор ПЕРЕМЕЩАЕТ ОБЪЕКТЫ В ПАМЯТИ, в плане борьбы с дефрагментацией, т.е. там это не страшно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:27 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
to progist Локальны объектные ссылки так же как и простые переменные подчиняются правилам видимости и жизни. Почему же ты тогда в коде не пытаешся уничтожить ссылку на переменную типа Integer, Long и т.п. Ведь, и объектная ссылка, и переменная это ничто иное как указатель на кусок памяти. Не закрывается окно Access как раз потому что не все объекты уничтожены. Тестировать и искать ошибки в коде, а не хаять Access! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:31 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
2 vdimas совсем не обязательно присваивать Nothing для локальных переменных (вопреки неоднократно высказаному в форуме мнению). Ты бы все-таки поостерегся такие советы давать Присваивать Nothing - необязательно, но крайне желательно. Если есть что-нибудь типа Close - тоже лучше ручками вызывать. То, что Access иногда глючит, так это к VBA никакого отношения не имеет Да иногда и к аксесу никакого отношения не имеет. Например, посчет ссылок глючит в библиотеке DAO. И никак ты с этим не поборешься, кроме как закрывая руками то, что DAO оставил (или наоборот, насильно держа ссылку на то, что DAO почему-то закрывает) По теме обсуждения. Циклические ссылки - вещь давно известная и сто раз обмусоленная. Читайте Роджерсона, он давным давно про это все что надо написал. И как бороться - то же. В дочернем объекте ссылку на Parent получайте не через QueryInterface/AddRef (как автоматом делает VB), а простым копированием указателя (хоть через memcpy). И не будет у вас никаких циклических ссылок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:32 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
progist неккоректно передаешь мою мысль. Автоматически удаляются ТОЛЬКО ЛОКАЛЬНЫЕ ССЫЛКИ . Все остальные - члены классов или модулей необходимо ОБЯЗАТЕЛЬНО чистить руками. Правда, если на какой-то класс уже никто не ссылается, и он удаляетя, то все его ссылки-мемберы тоже чистятся. Это может вызвать каскадное удаление объектов, если была соблюдена строгая односторонняя направленность владения. progist, чудес не бывает :) Возьми свою собственную программу, разрисуй кружочками классы, а стрелочками - взаимные ссылки (для VB ссылка аналогична понятию "владение") и определись, кто-кого держит. Сразу станет понятно, как "разорвать порочный круг". Разумеется, повсеместное втыкание Set var=Nothing значительно повышает вероятность, что ты случайно напишешь правильно, но п.1. данного топика дал тебе пример, где тебя это ну никак не спасет. Здесь именно необходимо иметь четкое представление о взаимном владении собственных классов, и тогда чудеса исключены. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:37 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
2 ЛП Не знаю как в DAO, но ADO я сталкивался с подобным (объекты остаются в памяти). Только это происходило у меня из-за того, что я сам же это и провоцировал. Описываю ситуацию, в которой я это наблюдал: dim rs as ADODB.Recordset set rs=me.Recordset ' получили рекордсет записей на форме. ... me.RecordSorce="уже другой запрос", (или пользователь F9 нажал). так вот, именно в этом случае, я должен сделать set rs=Nothing перед сменой свойства me.RecordSorce, т.е. я должен "отпустить" объект рекордсет перед тем, как форма создаст новый рекордсет по изменению свойства me.RecordSorce. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:47 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
2 vdimas Автоматически удаляются ТОЛЬКО ЛОКАЛЬНЫЕ ССЫЛКИ. Все остальные - члены классов или модулей необходимо ОБЯЗАТЕЛЬНО чистить руками Да сколько же раз говорить - локальные ссылки должны удаляться, но иногда не удаляются . Члены классов или модулей точно так же должны удаляться (освобождаться ссылки) при закрытии аксеса. Но иногда этого не происходит. Пока писал - ты пример на адо привел. В этом форуме кучу раз советовали делать Requery с помощью конструкции Me.RecordSource = Me.RecordSource - для обычных рекордсетов. И, вроде, для обычный рекордсетов глюков не наблюдали. И так же кучу раз говорили, что Me.Recordset - это нифига не обычный рекордсет, а мутант какой-то. Если то, что ты привел - глючит, то это как раз глюк аксеса (Me.Recordset), а не адо (ADODB.Recordset). Имхо. 2 Шкуренко Александр Не закрывается окно Access как раз потому что не все объекты уничтожены. Тестировать и искать ошибки в коде, а не хаять Access Тебе показать пример абсолютно правильного кода, выполнение которого приводит к незакрывающемуся аксесу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:55 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
показать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 17:00 |
|
||
|
Модули класса. Все ли так просто.
|
|||
|---|---|---|---|
|
#18+
И так же кучу раз говорили, что Me.Recordset - это нифига не обычный рекордсет, а мутант какой-то. Жаль что я на SQL.ru только недавно. :( Потрясающе интересное местечко. Дык я и говорю, что ведет он себя этот рекордсет ну очень странно. Вполне логично, что это объект не ADO, а внутренний ассессовский, который имплементит интерфейс адошного рекордсета. Вооруженный такими "знаниями", я именно с ним стараюсь вести себя аккуратно, т.е. не "держать" его перед обновлением записей формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 17:05 |
|
||
|
|

start [/forum/topic.php?fid=45&tid=1679860]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
94ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 474ms |

| 0 / 0 |
