powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / My first class. вопросы
39 сообщений из 39, показаны все 2 страниц
My first class. вопросы
    #32518087
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал следующий код в moduleclass MyTextbox
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Option Compare Database
Option Explicit

Private WithEvents m_TextBox As TextBox
Private nIndex As Integer
Public Event GotFocus(ByVal Index As Integer)

Public Sub MyText(z As TextBox, ByVal i As Integer)
    Set m_TextBox = z
    nIndex = i
End Sub
Private Sub Class_Terminate()
    Set m_TextBox = Nothing
End Sub
Private Sub m_TextBox_GotFocus()
    m_TextBox.BackColor =  16776960 
    RaiseEvent GotFocus(nIndex)
End Sub
A в форме установил text2 TextBox и
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Option Compare Database
Dim WithEvents z2 As MyTextbox
Private Sub Form_Open(Cancel As Integer)
    Set z2 = New MyTextbox
    Text2.Value = "4"
    Call z2.MyText(Text2,  2 )
End Sub
Private Sub z2_GotFocus(Index As Integer)
   MsgBox "ggg"
End Sub
Однако событие z2_GotFocus не иницируеться и m_TextBox_GotFocus не получает управление , когда соответсвующий элемент получает фокус
В чем ошибка ?
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518145
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
Public Sub MyText(z As TextBox, ByVal i As Integer)
    Set m_TextBox = z
   m_TextBox.OnGotFocus = "[Event Procedure]"
    nIndex = i
End Sub
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518187
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь внутри класса ловиться GotFocus,
но событие z2_GotFocus не возбуждаеться
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518190
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И что это дает
Код: plaintext
m_TextBox.OnGotFocus = "[Event Procedure]"
такая запись ?
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518198
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если в OnGotFocus не написано "[Event Procedure]", то обработчик не будет вызываться.

Насчет z2_GotFocus - интересно поставить брейкпойнт на m_TextBox.BackColor = 16776960 и посмотреть, куда оно идет дальше.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518208
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так все нормально. Я в ручную написал все, а вот когда поставил его объявление, то получилось , что они разные .
Система посавил
параметр
Код: plaintext
ByVal Index As Integer
( у меня было по ссылке )
Спасибо
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518240
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совет:
Проверь, чтобы наступало событие
Private Sub Class_Terminate()
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518267
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как можно не использовать дополнительную процедуру для установки а инициализировать их как бы в конструкторе ( как в С++ )
Может здесь тоже есть что то похожее ?

Код: plaintext
От модератора. Про инициализацию автор создал отдельный топик. Просьба отвечать туда.\nЦелую, Саныч.
/topic/92992
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518275
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имел ввиду members.
За совет спасибо. Работает. Объект уничтожаеться.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518408
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторРаботает.

(не видел этого топика, потому про конструктор ответил в соседнем)

И что работает? неужто z2_GotFocus заработал?

Мнится мне, что вретес. Малость там шпиндель не довернут.

ЗЫ
Похоже Вам не совсем ЭТО надо.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518412
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон - довернут - глазки еще не залиты, а уже не смотрют.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32518456
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще пару замечаний.

1) Если MyTextBox нужет ТОЛЬКО для того, чтобы менять цвет фона, ТО ему не нужен RaseEvent. Уведомление о наступлении события GotFocus получат все слушатели, подписавшиеся на него, в порядке подписки.

Строка m_TextBox.OnGotFocus = "[Event Procedure]" ПОДПИСЫВАЕТ класс MyTextBox на получение соответствующих уведомлений. ОНА ОБЯЗАТЕЛЬНА в данном месте. В формах механизм подписки к событиям своих контролах скрыт и приближен к VB синтаксису.

В форме (и прочих интересных) местах достаточно перехватывать GotFocus самого контрола.
Поставьте MsgBox "ggg" в zz_GotFocus и в Text2_GotFocus - получите его дважды


2) Про деструктор. Гетс расказывает, что выполнение операций типа
Set SomeThing=Nothing в деструкторе, вообще говоря ненадежно и может не освобождать ссылок в действительности. Зависит от версии/сервис пака.
Почему-то надежнее в деструкторе вызывать метод (типа ) Terminate в котором собственно и производятся такие действия. Т.Е.

Код: plaintext
1.
2.
3.
4.
5.
6.
Sub Terminate()
  SetSomeThing=Nothing
End Sub

Private Sub Class_Terminate()
  Terminate
End Sub
...
Рейтинг: 0 / 0
My first class. вопросы
    #32530494
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Victosha

В аксесс97
создал модуль класса
(давно не брал я в руки фишек)
(для наглядности):
Код: 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.
...
Private WithEvents ArcF As Form
...
Public Property Get ArcForm() As Form
    Set ArcForm = ArcF
End Property

Public Property Set ArcForm(ByVal ArcFvNewValue As Form)
    Set ArcF = ArcFvNewValue
If ArcFvNewValue Is Nothing Then Exit Property
On Error Resume Next
    ArcF.AfterUpdate = "[Event Procedure]"
    If With_T Then ArcF.BeforeUpdate = "[Event Procedure]"
    
    ArcF.OnDelete = "[Event Procedure]"
    If With_T Then ArcF.BeforeDelConfirm = "[Event Procedure]"
    ArcF.AfterDelConfirm = "[Event Procedure]"
End Property
...
Sub Terminate()
  SetSomeThing=Nothing '% 0 ) - некий список обнулений ссылок и очистки памяти
End Sub

Private Sub Class_Terminate()
  Terminate
End Sub
...
в формах, например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private TARC As New T_ArcF

Private Sub Form_Open(Cancel As Integer)
    Set TARC.ArcForm = Me
    TARC.sTable = "Factura"
    vKey( 0 ) = "Code": vKey( 1 ) = "Code"
    TARC.fKeys.Add (vKey)
End Sub
если
Код: plaintext
1.
2.
3.
4.
5.
6.
'Private Sub Form_Close()
    'Set TARC = Nothing 'или
    'TARC.Terminate
    'и то и другое вызывает системную ошибку акеса
    'уже ПО выходу из процедуры Form_Close
    'т.е. не в деструкторах, а в механизмах аксесса
'End Sub
-тут все заккоментировано, проблема понятна из комментария

так (без явного вызова деструктора) вроде работает,
но без
Set TARC = Nothing события
Class_Terminate
по выходу из формы не происходят. (смотрел в отладчике)
(хотя ссылка должна умирать ?)

Чем это чревато?
Что говорит наука?
...
Рейтинг: 0 / 0
My first class. вопросы
    #32530512
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем это чревато?
Что говорит наука?

чреватость покажет Диспечер задач - используемая Акесом память будет постоянно рости.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32530524
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да , Вы правы. Но в ссылке где то стояла .dll и я ее взял просто :-)
Спасибо
...
Рейтинг: 0 / 0
My first class. вопросы
    #32530845
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде память жрет. Но и без класса тоже жрет. Закрывается нормально.

ватсон выдает:

Код: plaintext
1.
2.
3.
4.
Исключение в приложении:
        Прил.: msaccopt.exe (pid= 1012 )
        Время:  24 . 05 . 2004  @  13 : 15 : 58 . 765 
        Номер: c0000005 (нарушение прав доступа)
...
(т.е. Access Violation)

в итоге выяснил, что проблема в попытке "Порвать связь" между классами
оставил только те операции, которые не вызывают сбоя:
Код: plaintext
1.
2.
3.
Private Sub ClearMem() 'чистим, что можно, не вызывая сбоя аксеса
    Erase pClon
    Set fKeys = Nothing
End Sub
и, поскольку не требуется вызова деструктора, вызов делаем из самого класса

находим еще одну интересность:
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub ArcF_Close()
    ClearMem
    Set ArcF = Nothing '!!! работает !!! только !!! тут
                       '_без сваливания аксеса_
                       'в Nothing выставляет (смотрел)
                       'еще б и класс потерминейтить теперь :( 
End Sub
(дополнив Property Set ArcForm строкой .OnClose = [])

...побег я, потом посмотрю (если накидаете советов)
...
Рейтинг: 0 / 0
My first class. вопросы
    #32530882
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фыыв

автордополнив Property Set ArcForm строкой .OnClose = [])

на бегу именно это ключём выглядит
...
Рейтинг: 0 / 0
My first class. вопросы
    #32530898
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде память жрет. Но и без класса тоже жрет. Закрывается нормально.

VBA всегда жрет память. Да же если открывать/закрывать пустую форму (без модуля), такова, видимо, его ущербная природа. Но при работе с классами, по моему опыту (и моему примеру), корректное убиение объектов в классе позволяло вместо 100-150 кб роста памяти, ограничится 5-10-30кб роста.

Класс уничтожается (и ссылка на frm) по следующему примерному алгоритму (это обсуждение было на сайте Андрея Митина)

Код: 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.
Option Compare Database
Option Explicit

Private WithEvents frm As Access.Form

Public Sub Destroy()
  Set frm = Nothing
End Sub

Private Sub Class_Terminate()
  Destroy
End Sub

Public Property Get MyForm() As Access.Form
  Set MyForm = frm
End Property

Public Property Set MyForm(ByVal vNewValue As Access.Form)
  Set frm = vNewValue
  frm.OnUnload = "[Event Procedure]"
End Property

Private Sub frm_Unload(Cancel As Integer)
    Destroy
End Sub
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531346
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
я посмотрел, у меня действительно
Код: plaintext
1.
2.
3.
Private Sub ArcF_Close()
    ClearMem
    Set ArcF = Nothing 
End Sub
вызывает Class_Terminate (и не вызывает падения аксеса)
(сразу не посмотрел - у меня там 6-7 подформочек к классу прикручены)
(почему, кстати, предпочитаете юзать OnUnload? Close вроде позже?)

просто при непосредственном вызове в форме
Код: plaintext
1.
2.
Private Sub Form_Close()
    Set TARC.ArcForm = Nothing 
End Sub
где Property Set и делало (внутри себя),
Set ArcF = Nothing
деструктор запускался, но после отработки ВСЕГО кода (т.е. после прохождения End Sub процедуры Form_Close()) Аксесс валился "в ватсона".
( то же и при Set TARC = Nothing в Form_Close)

ЗЫ: при этом нет нужды делать
Public Sub Destroy() (у меня - Terminate к примеру)
Достаточно
Private
т.к. ArcF_Close
ее найдет и так (приватно), а вызванная снаружи (из Form_Close) она валит Аксесс после отработки Class_Terminate и выхода из Form_Close в Ватсона влет (на ArcF_Close поток ес-сно уже не попадает).
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531365
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фыыв

Сударь, интересно - Вы специально такие примерчики составляете, дабы на вшивость людей проверять, или НА САМОМ ДЕЛЕ ТАКОЙ код пишите-)

Вам надо отвечать или Вы просто шутите?
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531366
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отвечу через 10 мин - труба зовет.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531407
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и хде это просветленное мнение?
или великого гуру токо на наезд и хватило?

ждемс :0)
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531422
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)
раз у Вас есть
Private Sub ArcF_Close()
значит, где-то есть
ArcF.OnClose="[Event Procedure]" - то есть явная подписка на это событие, иначе ArcF_Close() просто не будет его получать.


2) не событие Close есть по крайней мере два подпсичика. из них ближайший (первый по списку вызвова) модуль класса самой формы. Второй - экземляр T_ArcF. Оповещение о наступлении события будет пытаться отдаваться обоим, пока каждый из них явно не откажется от подписки. Первый отписывается методом изничтожения процедуры Form_Close, второй - установлением
ArcF.OnClose="" .


3) При наступлении события сначала о нем извещается ближайший подписчик. В нем, Вы уничтожаете ссылку на подпысываемый объект НЕ ОТПИСЫВАЯ его от очереди событий. То Есть, Если бы Вы завели метод в классе T_ArcF
типа
Peperty Set ClearForm(nothingForm as Form)
ArcF.OnClose=""
...
ArcF.OnПрочиеПодписанныеСобытия=""
...
Set ArcF=nothingForm
End Sub

И вызывали ли бы в

Private Sub Form_Close()
set TARC.ClearForm = nothing
End Sub
То у Вас все (скорее всего) нормально работало.

В приведенном же варианте кода по завершении Form_Close()
ПЫТАЕТСЯ ПРОИЗВЕСТИСЬ вызов Private Sub ArcF_Close() КОГДА УЖЕ никакого ArcF И В ПОМИНЕ НЕТ (внутри класса)
Как же на это реагировать - видно,
ШУТИТЬ ИЗВОЛИТЕ.
-)))
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531424
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хуру, наезд
все бы Вам обижаться.
Нет пива, а он наезд.
эхь

Вот упьюся один и будет Вам ФормСлозе.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531440
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фыыф -
Ты есче тута, или уже спишь и мне можно пиво пить начинать?
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531445
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
изначально, ежели вы читали, никакого
Private Sub ArcF_Close()
нихде не было
а все было в Form_Close
(Set TARC.ArcForm = NOTHING
, правда другие события не выставлялись в ""
а просто обходились в процедуре
Property Set ArcForm (см выше))

И все валилсоь

т.е. вы утверждаете, что в случае Nothing
в Property Set ArcForm (см выше)
нужен обратный обход:
сначала все
Set ArcF.OnТРАТАТА = ""
и только потом
Set ArcF= nothing

?
возможно.
Пасиб за растолковку.
проверю на досуге (сейчас запарка временная)
завтра. Все завтра.


вот только что же он, падла, валится, а не ругается :(
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531451
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет сначала ТРАТАТА="", а потом Nothing - это определенно.
Но.

НО

Переменные типа формы (и прочие "внешние объекты автоматизации") требуют ОЧЕННО БОЛЬШОЙ акууратности.
При всем том, что Nothing - это всего лишь лонг равный нулю, я сам ПРОСТО ПОБОЯЛСЯ БЫ писать

Set myVar.MySetMethod= Nothing

применительно к переменным формы. В этом месте ЛЕД ТОНКИЙ. И лыж походящих может не оказаться. В 10 случаях из 10 я бы написал внутреннюю очистку для данного случая.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531474
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне хотелось бы, чтобы класс работал "похоже" на собственные объекты Аксес
Если есть паблик св-во (пропертя сет), чтобы можно (не токмо мне) "не задумываясь" влудить
Set ЭтаСамяПропертя = Nothing
в том же модуле класса (формы), где ей сначала делали не Nothing
(чтобы и не надо было лазить в реализацию, и убеждаться, что оно там само умрет).
...
Рейтинг: 0 / 0
My first class. вопросы
    #32531627
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автормне хотелось бы, чтобы класс работал "похоже" на собственные
объекты Аксес
Если есть паблик св-во (пропертя сет), чтобы можно (не токмо мне) "не задумываясь" влудить
Set ЭтаСамяПропертя = Nothing


а зачем вообще нужен такой класс, умеющий слушать РАЗНЫЕ формы - какие прикажут? Ведь модуль класса КАЖДОЙ формы обладает таким волшебным умением - слушать СВОЮ форму. Видимо, для "экономной" реализации однотипного поведения. Не знаю какого, например, той самой пресловутой "регистрации действий пользователя с базой". Будучи однажды написанным (неважно в данном контексте) он способен подключаться/его можно подключить (КРИТИЧЕСКИ ВАЖНО- собственно определяет отношение к такому классу) к любой форме, работающей с набором данных (вновь не важно). Что здесь "похожего" на собственные объекты акцесс? И где вообще проперти Сет?
Тут вовсе НЕ проперсти Сет
а

Public Sub AttachForm( byval uForm as Form)

и
Public Sub Detach|Destroy|ClearClass|Terminate просматриваются, а никак не проперти Сет, которое никого не делает ни на кого похожим.


автор(чтобы и не надо было лазить в реализацию, и убеждаться, что оно там само умрет).

-)))
а вот с этого места пожалуйста поподробней. Кого Вы собираетесь туда послать?
И чем дисциплина Set|Set лучше чем дисциплина Attach|Detach ?
По мне так второй вариант гораздЕЕ лучше именно тем, что собственное имя для всякого случая имеет.

ЗЫ1 пока пиво пилось подумал - неа, не убелили, что все это не провокация )))
Ps2 сегодня "меня не будет". Так что, "вероятные продолжения" - завтра.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32532391
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проверил вчера эээ "теорию отключения подписчиков" (хотя и так было ясно, что она тут не причем - Arc_Close не отписывал никого, а крахом не кончался, но я спорить не стал - а вдруг действительно чо вумное скажете :0)

так вот, фиха. (пока все об акс 97)
т.е. сермяга не в подписке/отписке и не в письках ваапше, а в том, что в а97(по меньшей мере в моих версиях) надо вызывать деструктор ТОЛЬКО в событии (еще посмотреть, где можно, а вдрух не везде) форменной переменной класса, объявленной WithEvents

стало быть продолжим думать о том, на что вы вчера не подумавши накинулись: а именно как убрать торчащие из класса свойства и методы, приводящие к краху. (Или сделать так (если невозможно убрать что-то совсем), чтобы поюзав их, внешнеий пользователь класса не приводил систему к краху.)
то, что метод Destroy (Terminate) придется запретить к публикации уже ясно.
Остаются 2 ручки, валящие аксесс (именно Access.exe валится из-зм анхендлед ексепшн, а не "ТАКОЙ КОД", прошу заметить, т.ч. хуру тут обшибся адресом). 1. попытка "обнулить" свойство Set TARC.Arc_Form = Null
(что, поскольку оно торчит из класса, никто формально не отменял)
это лечится просто:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Property Set ArcForm(ByVal ArcFvNewValue As Form)
    If ArcFvNewValue Is Nothing Then Exit Property
    'блокируем пи при попытке явно убрать св-во
    'можно еще установить флаг, т.,чтобы Property Get ArcForm()
    'возвращал после этого "вовне" Nothing
    Set ArcF = ArcFvNewValue
    ArcF.AfterUpdate = "[Event Procedure]"
    If With_T Then ArcF.BeforeUpdate = "[Event Procedure]"
    
    ArcF.OnDelete = "[Event Procedure]"
    If With_T Then ArcF.BeforeDelConfirm = "[Event Procedure]"
    ArcF.AfterDelConfirm = "[Event Procedure]"
    ArcF.OnClose = "[Event Procedure]"
    'не "[Event Procedure]" перекрываются, "[Event Procedure]" дополняются !!!
End Property
а при юзании флага еще и "обнулит" св-во нафих (внешний юсер класса получит Nothing что кульно).
(видимо флаг вообще необходим, дабы предотвратить попытку переключить форму после первого подключения - надо подумать...)
Второе - попытка запустить деструктор извне -
Set TARC = Nothing
(или объявить переменную TARC на уровне процедуры, а не класса, что по выходу из процедуры очистит ссылку и тем самым вызовет его деструктор). Это можно сделать в инициализации, но поскоку класс можно юзать и не из форм (гипотетически) (скажем какие-то методы), то лучше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private piPreventer As Object 'самоподхват
...
Public Property Set ArcForm(ByVal ArcFvNewValue As Form)
    Set piPreventer = Me 'ставим блокировку пи при
                'внешних попытках вызвать деструктор класса
    If ArcFvNewValue Is Nothing Then Exit Property
    'блокируем пи при попытке явно убрать св-во
    'можно еще установить флаг, т.,чтобы Property Get ArcForm()
    'возвращал после этого "вовне" Nothing
    Set ArcF = ArcFvNewValue
    ArcF.AfterUpdate = "[Event Procedure]"
    If With_T Then ArcF.BeforeUpdate = "[Event Procedure]"
    
    ArcF.OnDelete = "[Event Procedure]"
    If With_T Then ArcF.BeforeDelConfirm = "[Event Procedure]"
    ArcF.AfterDelConfirm = "[Event Procedure]"
    ArcF.OnClose = "[Event Procedure]"
    'не "[Event Procedure]" перекрываются, "[Event Procedure]" дополняются !!!
End Property
далее проверяем:
Код: plaintext
1.
2.
3.
4.
5.
Private TARC As New T_ArcF

Private Sub Form_Close()
    Set TARC.ArcForm = Nothing
    Set TARC = Nothing 'проверим нашу блокировку
End Sub
"все путем" (отключаем Form_Close() - нормально, т.е. ссылку бить руками не надь)
далее можно и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
'Private TARC As New T_ArcF
Private Sub Form_Open(Cancel As Integer)
Dim TARC As New T_ArcF
    'TARC.With_T = True 'фиксировать в шапке - чревато глюками
    Set TARC.ArcForm = Me
    TARC.sTable = "Facturno"
    vKey(0) = "Code": vKey(1) = "Code" 'vKey( 0 ) - в таблице, vKey( 1 ) - в форме
    TARC.fKeys.Add (vKey) 
End Sub
т.е. ваабще забываем о TARC в форме (все равно подействовать на него в смысле вызова деструктора нам запрещено (падением акеса опосля), а для другого он нам не нужен.

Итак, убрать ручки можно. Но всегда ли удобно то, что я не имею право дестройнуть класс снаружи (не вызвав требуемого события в ЕГО форменной переменной)? Ведь я могу захотеть написать ветвящиеся алгоритмы, некоторые ветви которого мне УДОБНО бы было реализовывать как ОТДЕЛЬНЫЙ класс и отключать его полностью (деструтором) по мере необходимости (подключая, в случае нужды, новый), а не ввязываться в бодягу полного перенаполнения контекста (событий, методов вызываемых в событиях, и т.п.) одного и того же класса по условию. Я не утверждаю, но полагаю такой случай возможным.

___
Да, проверил на 2к. То же самое (сначала показалось не-а, но "пригляделся - "t,encz"). Т.что делать паблик методы дестрой/терминейт и т.п. нет нужды и в нем.

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

___
Насчет
Public Sub AttachForm
и т.п. - поподробней, если не лома.
Ибо в моем классе русским по белому накарябано
... Property Set
... Property Get
и никаких Attach-ей- и прочачей нет. Где подмена (засада)? Кто осуществлял. Какая падла это криво реализовала? Кого piPrevent-ить будем?

____________
нет, я вполне допускаю, что именно у меня руки криво прикручены. Т.е. что я нахожу штучки, которые не работают. Но мне кажется, что они должны работать.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32532408
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опс. Упустил:

имелось в виду, что разблокировка терминейта теперь у нас в наших событиях форменной переменной класса . И токо там.
Код: plaintext
1.
2.
3.
4.
Private Sub ArcF_Close()
    Set piPreventer = Nothing 'только тут снимаем блокировку пи
    ClearMem
    Set ArcF = Nothing 'работает только тут ! (иначе вываливает аксес)
End Sub
...
Рейтинг: 0 / 0
My first class. вопросы
    #32533615
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хуру, значит хуру.
тема закрыта. По крайней мере до замены огрызков на куски кода пригодные к анализу. (модуль формы+ модуль класса-обвязки в "исходном виде")
Гадать на Ваших гущах мне весьма затруднительно. А в том, что мне Ваши "методы" не подошли - виноват я сам.

PS
Не знаю, что там у Вас A2K "также" как в 97, а про 97 "знаю" примерно следующее - там неэтично начинать подобные "обвязки" без установленного 3-го сервис пака. На всякий случай - проверьте. (не знаю, были ли более поздние)
...
Рейтинг: 0 / 0
My first class. вопросы
    #32534195
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тесtовая база (2k==97)
форма
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Option Compare Database
Option Explicit
Private TARC As New T_ArcF

Private Sub Form_Close()
    Set TARC = Nothing
End Sub

Private Sub Form_Open(Cancel As Integer)
    Set TARC.ArcForm = Me
End Sub
класс T_ArcF:
Код: 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.
Option Compare Database
Option Explicit

Private piPreventer As Object 'самоподхват
Private WithEvents ArcF As Form

Public Property Get ArcForm() As Form
    Set ArcForm = ArcF
End Property

Public Property Set ArcForm(ByVal ArcFvNewValue As Form)
    'Set piPreventer = Me 'ставим блокировку пи при
                'внешних попытках вызвать деструктор класса
    'If ArcFvNewValue Is Nothing Then Exit Property
    Set ArcF = ArcFvNewValue
    ArcF.AfterUpdate = "[Event Procedure]"
    ArcF.OnClose = "[Event Procedure]"
End Property

' При удалении экземпляра
Private Sub Class_Terminate()
    Terminate
'!не писать в формах:
'Private Sub Form_Close()
    'Set TARC = Nothing 'или
    'Set TARC.ArcForm = Nothing
    'TARC.Terminate
    'и то и другое и третье вызывает системную ошибку акеса
    'уже ПО выходу из процедуры Form_Close
    'т.е. не в деструкторах, а в механизмах аксесса
'End Sub
End Sub

Private Sub Terminate() 'все равно все не чистим
    Set ArcF = Nothing      'Без ArcF_Close валит Access
End Sub

Private Sub ArcF_AfterUpdate()
On Error GoTo err

ex:
    Exit Sub
err:
    MsgBox err.Description
    Resume ex
End Sub

'Private Sub ArcF_Close()
'    Set piPreventer = Nothing 'только тут снимаем блокировку пи
'    Set ArcF = Nothing 'работает только тут ! (иначе вываливает аксес)
'End Sub

97 -SP2, но ACCESS2000 - SP3 (а тут с какого SP ?)
оба падают уже после исполнения предложения {End Sub} процедуры {Private Sub Form_Close()}



вот и думаю, шо я не так поняв за классы (шо даже обработку эксепшенов на такой случай делать не нада)?
...
Рейтинг: 0 / 0
My first class. вопросы
    #32534321
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соврал я в своих изложениях только в одном - в порядке подписки.
Далее про письки.
письки в приведенном Вами Terminate должны жить следующим образом:

Private Sub Terminate() 'все равно все не чистим
ArcF.AfterUpdate = "" ' - это письки '
ArcF.OnClose = "" ' это тоже '
Set ArcF = Nothing 'Без ArcF_Close валит Access - враки - с письками никто никого не валит, если письки стоят.
End Sub
...
Рейтинг: 0 / 0
My first class. вопросы
    #32535026
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тупо вставил.

тупо валится.

тупо в 97 SP2

тупо в 2000 SP3


А в каком у вас не валится? (И вообще, что он делает без "отписки")

_
ЗЫ. "Отписку" я не воспроизводил в пердлагаемой модели, поскоку все одно валится. Что и подтвердилося.

:( нет в жисти щастя
...
Рейтинг: 0 / 0
My first class. вопросы
    #32535036
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
Исключение в приложении:
        Прил.:  (pid= 1308 )
        Время:  26 . 05 . 2004  @  16 : 01 : 59 . 062 
        Номер: c0000005 (нарушение прав доступа)

* ----> Сведения о системе <----*
 

* ----> Список задач <----*
 
    0  Idle.exe
    8  System.exe
  140  SMSS.exe
  164  CSRSS.exe
  184  WINLOGON.exe
  212  SERVICES.exe
  224  LSASS.exe
  376  svchost.exe
  420  svchost.exe
  468  spoolsv.exe
  500  cusrvc.exe
  568  regsvc.exe
  584  mstask.exe
  720  wm.exe
  744  svchost.exe
  880  explorer.exe
  972  dpmw32.exe
  988  nwtray.exe
 1024  drwebscd.exe
  356  spiderml.exe
 1040  internat.exe
 1060  LvAgent.exe
 1068  thebat.exe
  604  IEXPLORE.exe
  596  svchost.exe
  388  TASKMGR.exe
  920  MSOHELP.exe
 1256  msaccess.exe
  540  winhlp32.exe
 1308  MSACCESS.exe
 1260  DRWTSN32.exe
    0  _Total.exe

( 30000000  -  30491000 ) 
(77F80000 - 77FFC000) 
(77F40000 - 77F7C000) 
(793A0000 - 7945A000) 
(77E10000 - 77E75000) 
( 10000000  -  10019000 ) 
( 79060000  - 790C2000) 
(770F0000 - 7715E000) 
(308C0000 - 30E1D000) 
(77A50000 - 77B3C000) 
( 37020000  - 3713B000) 
(00F80000 -  01184000 ) 
(779B0000 - 77A4B000) 
(6E380000 - 6E386000) 
(75E00000 - 75E1A000) 
(68C10000 - 68C96000) 
( 78000000  -  78045000 ) 
( 71780000  - 7180A000) 
(1B000000 - 1B170000) 
(1B5D0000 - 1B665000) 
(1B270000 - 1B2BC000) 
( 20000000  - 2000C000) 
( 65000000  -  65263000 ) 
( 65300000  -  65327000 ) 
(1B810000 - 1B84A000) 
( 77260000  - 772CC000) 
(0D310000 - 0D458000) 
(70BD0000 - 70C34000) 

Копия памяти для потока 0x1a8

eax= 00000000  ebx= 00000000  ecx= 00000000  edx= 00000000  esi=779d93d0 edi= 00000000 
eip= 30058326  esp=0012ef44 ebp=0012f010 iopl= 0          nv up ei pl zr na po nc
cs=001b  ss= 0023   ds= 0023   es= 0023   fs=003b  gs= 0000              efl= 00000246 


функция: <nosymbols>
        300582f5  50                push    eax
        300582f6 895dd8           mov     [ebp+0xd8],ebx         ss:00bb8ef6=????????
        300582f9 ff158cff3f30     call    dword ptr [303fff8c]   ds:303fff8c=779db790
        300582ff 8b4d14           mov     ecx,[ebp+0x14]         ss:00bb8ef6=????????
         30058302  e83353ffff       call    CreateIExprSrvObj+0x2121e (3004d63a)
         30058307  3bc3             cmp     eax,ebx
         30058309  8945e0           mov     [ebp+0xe0],eax         ss:00bb8ef6=????????
        3005830c 895d08           mov     [ebp+0x8],ebx          ss:00bb8ef6=????????
        3005830f 0f86ac000000     jbe     CreateIExprSrvObj+0x2bfa5 (300583c1)
         30058315  8b3598ff3f30     mov     esi,[303fff98]         ds:303fff98=779d93d0
        3005831b ff7508           push    dword ptr [ebp+0x8]    ss:00bb8ef6=????????
        3005831e 8b4d14           mov     ecx,[ebp+0x14]         ss:00bb8ef6=????????
         30058321  e839020000       call    CreateIExprSrvObj+0x2c143 (3005855f)
СБОЙ ->  30058326  8b4004           mov     eax,[eax+0x4]          ds:00a89ee6=????????
         30058329  8d55f0           lea     edx,[ebp+0xf0]         ss:00bb8ef6=????????
        3005832c  52                push    edx
        3005832d ff7510           push    dword ptr [ebp+0x10]   ss:00bb8ef6=????????
         30058330  8b08             mov     ecx,[eax]              ds: 00000000 =????????
         30058332   50                push    eax
         30058333  ff11             call    dword ptr [ecx]        ds: 00000000 =????????
         30058335  8bf8             mov     edi,eax
         30058337  3bfb             cmp     edi,ebx
         30058339  0f8c82000000     jl      CreateIExprSrvObj+0x2bfa5 (300583c1)
        3005833f 8b45e4           mov     eax,[ebp+0xe4]         ss:00bb8ef6=????????
         30058342  8b4df0           mov     ecx,[ebp+0xf0]         ss:00bb8ef6=????????
         30058345  0fbf401c         movsx   eax,word ptr [eax+0x1c]    ds:00a89ee7=????
         30058349  8b09             mov     ecx,[ecx]              ds: 00000000 =????????
        3005834b 391c08           cmp     [eax+ecx],ebx          ds: 00000000 =????????
...
Рейтинг: 0 / 0
My first class. вопросы
    #32535108
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня никак не валится ни так не эдак. Офис xp

Замечание по поводу последнего приведенного "полного" текста от 12:15
- почему Private TARC As New T_ArcF - NEW тут для кого?
- не вполне честно "подписываться" не предоставив собственно интерфейса для получения уведомлений.

По поводу версий - про 97 свое мнение об этичности оставляю в силе. в 2000 должно бы работать в любой вариации.

Теперь по поводу валится.
Исключительно для очистки совести, я бы в такой ситуации провел два эксперимента.
1) в классе-обвязке, применив последний указанный мной Terminate завел бы ПУСТУЮ процедуру
Private Sub ArcF_Close()

End Sub
и посмотрел бы на результат

2) Не заводя вышуказанной процедуры, снял бы Private ограничение на Terminate, вставил бы в него в качестве первой строки
ON ERROR RESUME NEXT

И, в событии закрытия формы
написал
TARC.Terminate
Set TARC = Nothing

(и посмотрел бы на результат)

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

Возможно, правильнее, сразу лезть на саппорт microsoft по теме совместного использования 97 и 2000
и шарит затем по реестру в соответствии с вычитанными рекомендациями.

ЗЫ
А не была ли у Вас установлена какая-нибудь особо полезная програмь, подменившая при своей установке Ole32.Dll ?
...
Рейтинг: 0 / 0
My first class. вопросы
    #32535334
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, не выходит каменный цветок.

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

____________
замечание: В событии Close формы "отписку" от OnClose производить поздно.
Я уже писал ПРЯМО в него (в Form_Close) так:
Me.OnClose = ""
или
TARC.ArcForm.OnClose = ""
и наблюдал (если я в Form_Close НЕ удаляю TARC)
по крайней мере в последнем случае (т.к. это я помню точно)
что:
ArcForm.OnClose = ""
ArcF.OnClose = ""
но дебуггер на
ArcF_Close
приходит все равно сразу после Form_Close


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


можно ж и не (пере)объявлять
ArcF.OnClose = "[Event Procedure]"
и не создавать ArcF_Close
(я ж не обязан дублировать все обработчики своими?
а только те, которые я хочу дополнить)
а просто выполнить
Form_Close, уж коль уже сохранено св-во
(и не переопределялось в коде) как:
Form.OnClose = "[Event Procedure]"

все упадает в лучшем виде.

__
по поводу DLL - могабыть. Только я на 2-х компах это имел. (дома и на работе).
Осталось посмотреть на "чистом" а2000.

Ole32.Dll 5.00.2195.6810
Операционная система Microsoft (R) Windows (R) 2000
923 КБ (945 936 байт)
суббота 23 августа 2003 г., 14:48:40

язык - русськи
__
NEW - у меня форма, на ней 4 подформы юзают класс
на 2-х из них - свои подформы, из них класс юзают -
на 1- одна
на 2-й - 2
(могут быть и больше, но я архивирую только важные для юзеров таблицы - по поводу авторства записей в которых они спорят). Т.ч. мне в каждой форме нужны свои архиваторы.
...
Рейтинг: 0 / 0
My first class. вопросы
    #32535351
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / My first class. вопросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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