powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Class Module
25 сообщений из 42, страница 1 из 2
Class Module
    #32853343
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь разобраться, как работать с модулями класса.
Поискал по форуму - сделал - не получилось.
Модуль класса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Option Compare Database

Private btn As CommandButton

Public Property Get CommandButton() As CommandButton
    Set CommandButton = btn
End Property

Public Property Set CommandButton(btn1 As CommandButton)
    Set btn = btn1
    btn.OnClick = "[event procedure]"
End Property

Public Sub btn_click()
    MsgBox "adasdadad"
End Sub

Форма:
Код: plaintext
1.
2.
3.
Dim btn As Class1

Set btn = New Class1
Set btn.CommandButton = Me.btn1
При нажатии на кнопку ничего не проиходит. В чем тут проблема?
...
Рейтинг: 0 / 0
Class Module
    #32853361
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Мне кажется, надо

Private WithEvents btn As CommandButton

Когда ставишь курсор в btn_click, то сверху в двух комбобоксах должно появиться btn слева и click справа, а не btn_click вместе.
...
Рейтинг: 0 / 0
Class Module
    #32853514
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СанычМне кажется, надо

Private WithEvents btn As CommandButton

Когда ставишь курсор в btn_click, то сверху в двух комбобоксах должно появиться btn слева и click справа, а не btn_click вместе.
Теперь все появляется так, как надо, но только эффект остался тот же, то есть при нажатии на кнопку ничего не происходит.
...
Рейтинг: 0 / 0
Class Module
    #32853520
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавь в
Public Property Get CommandButton() As CommandButton
строку
btn.OnClick = "[Event Procedure]"
...
Рейтинг: 0 / 0
Class Module
    #32853522
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тьфу ты не в Get а в Set конечно
...
Рейтинг: 0 / 0
Class Module
    #32853526
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну всё равно попробуй написать именно так, с большими буквами
...
Рейтинг: 0 / 0
Class Module
    #32853563
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha_1ну всё равно попробуй написать именно так, с большими буквами
Написл "[Event Procedure]" - тот же эффект
...
Рейтинг: 0 / 0
Class Module
    #32853573
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну еще в качестве бредовой идеи:
вместо Public поставить Private

Private Sub btn_click()
MsgBox "adasdadad"
End Sub
...
Рейтинг: 0 / 0
Class Module
    #32853582
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha_1ну еще в качестве бредовой идеи:
вместо Public поставить Private

Private Sub btn_click()
MsgBox "adasdadad"
End Sub
Не сработало.
Хм...
Странно это все :(
...
Рейтинг: 0 / 0
Class Module
    #32853589
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
действительно странно.
сто раз так делал, проблем не возникало.

а в форме ты где пишешь инициализацию?
...
Рейтинг: 0 / 0
Class Module
    #32853591
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аааа.
я кажется понял.
ты Dim btn As Class1 где пишешь?
небось внутри процедуры?
...
Рейтинг: 0 / 0
Class Module
    #32853593
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должно! работать
...
Рейтинг: 0 / 0
Class Module
    #32853604
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Vsevolod VSet btn = New Class1
Кстати, эта строчка лишняя. Но дело все равно не в этом.
...
Рейтинг: 0 / 0
Class Module
    #32853610
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
строчка не лишняя. (имхо)

дело видимо в том, что
Dim btn As Class1
объявлена внутри процедуры открытия формы и после отрабатывания процедуры все переменные разрушаются.

т.е. Dim btn As Class1
должно быть вынесено из процедуры просто в модуль формы.
...
Рейтинг: 0 / 0
Class Module
    #32853613
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Но там идет подряд:
Vsevolod VSet btn = New Class1
Set btn.CommandButton = Me.btn1
Зачем два сета подряд, если первый затирается вторым?
...
Рейтинг: 0 / 0
Class Module
    #32853615
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А. Дошло. Беру свои слова обратно. Там сет один раз переменной, а второй раз ее свойству. Пардон.
...
Рейтинг: 0 / 0
Class Module
    #32853639
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлично! Заработало :)
Действительно "Dim btn As Class1" необходимо было вынести из процедуры
Спасибо.
...
Рейтинг: 0 / 0
Class Module
    #32853943
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь пытаюсь проделать тоже самое с лейблом (только в этом случае обрабатываю событие OnMouseDown)
Текст модуля класса
Код: 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.
Private WithEvents lbl As Label
Private mfrm As Form
Private mcmb As CommandBar

Public Property Get Label() As Label
    Set Label = lbl
End Property

Public Property Set Label(lblNewLabel As Label)
    Set lbl = lblNewLabel
    lbl.OnMouseDown = "[Event Procedure]"
    Set mfrm = lbl.Parent
End Property

Public Property Get CommandBar() As CommandBar
    Set CommandBar = mcmb
End Property

Public Property Set CommandBar(cmbNewCommandBar As CommandBar)
    Set mcmb = cmbNewCommandBar
End Property

Private Sub lbl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    mfrm.CurrentLabelName = lbl.Name
    If Button = acRightButton Then mcmb.ShowPopup
End Sub
Текст модуля формы
Код: plaintext
1.
2.
3.
4.
5.
Dim clbl As clsCurrentLabel
Private Sub Form_Load()
        Set clbl = New clsCurrentLabel
        Set clbl.Label = Me.[Надпись13] 
        Set clbl.CommandBar = Application.CommandBars("help") 'Здесь ошибка
End Sub
Так вот проблема в том, что если лейбл привязан к текстбоксу то на указанной строке возникает ошибка: Object or class does not support the set of events. В остальных же случаях все работает нормально
...
Рейтинг: 0 / 0
Class Module
    #32853950
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Vsevolod VТак вот проблема в том, что если лейбл привязан к текстбоксу то на указанной строке возникает ошибка: Object or class does not support the set of events. В остальных же случаях все работает нормально
Если лейбл привязан к текстбоксу, то вроде и обычным способом таких событий нет, не только через классы.
...
Рейтинг: 0 / 0
Class Module
    #32853954
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видать в этом случае лейбл наледует события от текстбокса.
Тогда возникает другой вопрос :)
А как программно определить привязан лейбл к текстбоксу или нет?
...
Рейтинг: 0 / 0
Class Module
    #32853958
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Vsevolod VА как программно определить привязан лейбл к текстбоксу или нет?
typename(ctl.parent) вернет либо "TextBox", либо "Form_имяформы".
...
Рейтинг: 0 / 0
Class Module
    #32856950
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое?! :(
Не могу добавить вопрос с текстом кода. Появляется ошибка:
... возможно закончилась сессия. Попробуйте зайте в форум заново
...
Рейтинг: 0 / 0
Class Module
    #32856984
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модуль класса:
Код: 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.
Private WithEvents lbl As Label
Private mfrm As Form
Private mcmb As CommandBar

Public Property Get Label() As Label
    Set Label = lbl
End Property

Public Property Set Label(lblNewLabel As Label)
    Set lbl = lblNewLabel
    lbl.OnMouseDown = "[Event Procedure]"
    Set mfrm = lbl.Parent
End Property

Public Property Get CommandBar() As CommandBar
    Set CommandBar = mcmb
End Property

Public Property Set CommandBar(cmbNewCommandBar As CommandBar)
    Set mcmb = cmbNewCommandBar
End Property

Private Sub lbl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    mfrm.CurrentLabelName = lbl.Name
    If Button = acRightButton Then mcmb.ShowPopup
End Sub
Далее. Пишу функцию для назначения контекстного меню лэйблам на форме и ее сабформах.
Код: 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.
Dim ColnLbls As Collection
Dim Clbl As clsCurrentLabel
'======== Функция начинается тут 
Set ColсLbls = New Collection
    For Each V In frm.Controls
        If V.ControlType = acSubform Then
            For Each V2 In V.Form.Controls
                If V2.ControlType = acLabel Then
                    If TypeName(V2.Parent) = "Form_" & V.SourceObject Then
                        Set Clbl = New clsCurrentLabel
                        Set Clbl.Label = frm(V.Name)(V2.Name) 
                        Set Clbl.CommandBar = Application.CommandBars("help")
                        ColсLbls.Add Clbl, Clbl.Label.Name
                        Set Clbl = Nothing
                    End If
                End If
            Next V2
        End If
        If V.ControlType = acLabel Then
            If TypeName(V.Parent) = "Form_" & frm.Name Then
                Set Clbl = New clsCurrentLabel
                Set Clbl.Label = frm(V.Name)
                Set Clbl.CommandBar = Application.CommandBars("help") 
                ColсLbls.Add Clbl, Clbl.Label.Name
                Set Clbl = Nothing
            End If
        End If
    Next V
Проблемы:
1. На форме две сабформы. В первой на лэйблах появляется соответствующее контекстное меню, а во второй нет.
2. При открытии новой формы и запуске этого кода теряются настройки лэйблов для уже открытых форм. Пробовал объявить ColсLbls и как Global и как Public - ничего не помогает.
...
Рейтинг: 0 / 0
Class Module
    #32857329
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Me.Requery
...
Рейтинг: 0 / 0
Class Module
    #32857487
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3 часа работы и сам разобрался :)
---
Теперь есть вопрос по поводу коллекций.
Как видно из кода, я создаю коллекцию лэйблов. Тут я столкнулся с проблемой того, что существует масса лэйблов с одинаковыми наименованиеми - отсюда ошибка: The key is already associatied with an element of this collection.
Посмотрел справку (в коллекциях я не силен) - ничего дельного не нашел.
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Class Module
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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