powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Class Module
42 сообщений из 42, показаны все 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
Class Module
    #32859087
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно добавить в класс моего лэйбла свойство "Контекстные меню" (ShortcutMenu). Это нужно для того, чтобы после отображения контестного меню данного лэйбла не отображалось основное контекстное меню формы.

Как я понял это делается с помощью Property Let
Попробывал так (текст модуля класса):
Код: 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.
Option Compare Database
Option Explicit

Private WithEvents lbl As Label
Private mfrm As Form
Private mcmb As CommandBar
Private IsSwitch As Boolean

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

Public Property Get ShortcutMenu() As Boolean
    ShortcutMenu = IsSwitch
End Property

Public Property Let ShortcutMenu(Value As Boolean)
    IsSwitch = Value
End Property

Private Sub lbl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    CurrentLabelID = lbl.HelpContextId
    If Button = acRightButton Then mcmb.ShowPopup
    lbl.ShortcutMenu = False 'Ошибка здесь
End Sub
При нажатии правой кнопкой мыши на лэйбле возникает ошибка: Method or data member not found
...
Рейтинг: 0 / 0
Class Module
    #32859775
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Me.Requery
...
Рейтинг: 0 / 0
Class Module
    #32859814
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vsevolod Vlbl.ShortcutMenu = False 'Ошибка здесь
а есть такое свойство у Label?
ищите в Object Browser'e
да и скомпилировать класс не помешает. сразу всё наружу вылезет
...
Рейтинг: 0 / 0
Class Module
    #32859838
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Biryukov Vsevolod Vlbl.ShortcutMenu = False 'Ошибка здесь
а есть такое свойство у Label?
ищите в Object Browser'e
да и скомпилировать класс не помешает. сразу всё наружу вылезет
В том-то и дело, что свойства такого нет, а нужно :)
...
Рейтинг: 0 / 0
Class Module
    #32859862
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если такое невозможно, то сразу так и скажите, а то я тут репу морщу весь день уже :)
...
Рейтинг: 0 / 0
Class Module
    #32859945
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну тогда попробуйте одно из двух
Код: plaintext
1.
2.
3.
4.
Private Sub lbl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    CurrentLabelID = lbl.HelpContextId
    If Button = acRightButton Then mcmb.ShowPopup
    mfrm.ShortcutMenu = False 'Ошибки здесь не будет
End Sub
второе: не заморачивайтесь с обработкой событий от лейбл для показа контекстного меню. Для этого есть свойство ShortcutMenuBar.
...
Рейтинг: 0 / 0
Class Module
    #32859954
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторmfrm.ShortcutMenu = False
В этом случае после отработки этого события нужно вкючать ShortcutMenu формы, а для этого писать еще один класс (класс формы), связывать его с классом лэйбла и по таймеру устанавливать ShortcutMenu = True.
Этот вариант мне не по душе :)

авторне заморачивайтесь с обработкой событий от лейбл для показа контекстного меню
Так тоже нельзя. Потому что через контекстное меню заложена функция, которой требуется HelpContextId
...
Рейтинг: 0 / 0
Class Module
    #32859965
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, кстати, готов рассмотреть любой другой способ получения HelpContextId лэйбла при вызове его контекстного меню :)
...
Рейтинг: 0 / 0
Class Module
    #32860678
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Me.Requery
...
Рейтинг: 0 / 0
Class Module
    #32861076
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private Sub mfrm_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    mfrm.ShortcutMenu = True
End Sub

Private Sub lbl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    mfrm.ShortcutMenu = False
End Sub
...
Рейтинг: 0 / 0
Class Module
    #32861242
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть все таки пишем класс для формы... :)
...
Рейтинг: 0 / 0
Class Module
    #32861324
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал класс формы, где на MouseMove повесил mfrm.ShortcutMenu = True.
Но это событие срабатывает только на Области Данных, тобиш Section(0), а если пользователь поводит мышкой в загаловке, то беда.
Какие есть выходы кроме написания класса для Section?
...
Рейтинг: 0 / 0
Class Module
    #32861785
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновлю вопрос.
Есть класс лэйбла, который задает лэйблу контестное меню (зачем это надо здесь обсуждать не будем). По щелчку правой кнопкой мыши на лэйбле это меню появляется, после чего появляется еще и контестное меню формы (которое тоже нужно, но не на лэйбле). Как мне "убрать с лэйбла" контестное меню формы?
...
Рейтинг: 0 / 0
Class Module
    #32861973
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня в одной книге написано так: "Property Let используется объекту свойств, которые ему не принадлежат". А вот как это делать написать забыли :(
Может кто знает, а? :)
...
Рейтинг: 0 / 0
Class Module
    #32861975
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Млин
"Property Let используется для назначения объекту свойств, которые ему не принадлежат"
...
Рейтинг: 0 / 0
Class Module
    #32863869
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем с контекстным меню формы кое как разобрался.
---
Проблема номер N :)
Есть класс все того же лэйбла:
Код: 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.
Option Compare Database
Option Explicit

Private WithEvents lbl As Label
Private mfrm As Form
Private mcmb As CommandBar
Private IsSwitch As Boolean

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)
    If mfrm.ShortcutMenu = True Then
        mfrm.ShortcutMenu = False
    End If
    CurrentLabelID = lbl.HelpContextId
    If Button = acRightButton Then mcmb.ShowPopup
    mfrm.TimerInterval =  10 
End Sub
По щелчку на контекстном меню лэйбла выполняется функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Function CallHelp()
    Dim HTbl As DAO.RecordSet
        If CurrentLabelID >  0  Then
            Set HTbl = CurrentDb.OpenRecordset("select * from __temp_help where " _
                    & "H_ID = " & CurrentLabelID & "")
            If Not HTbl.EOF Then
                DoCmd.OpenForm "context_help"
                Forms!context_help!fld_TEXT = HTbl!H_TEXT
            End If
            HTbl.Close
        Else
            MsgBox "Справка по этому элементу не доступна", , "Справка"
        End If
End Function
Если CurrentLaelID = 0, то отображается соответствующее сообщение, нажимаем ОК и снова появляется контекстное меню лэйбла . Причем происходит это только на одной сабформе - на всех остальных все работает нормально. С чем это может быть связано?
...
Рейтинг: 0 / 0
Class Module
    #32864939
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Me.Requery
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Class Module
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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