powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / My first class. вопросы
25 сообщений из 39, страница 1 из 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
25 сообщений из 39, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / My first class. вопросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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