Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как узнать какое событие инициировало вызов другого события / 18 сообщений из 18, страница 1 из 1
11.03.2020, 15:39
    #39936310
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
Имеется ленточная форма с областью заголовка и областью примечания,источником формы является запрос SELECT...
На области заголовка присутствует комбо, на области примечания кнопка.В обоих случаях (что при перевыборе значения комбо,что при нажатии кнопки-в случае если внесли изменение в комбо а потом сразу нажали кнопку) происходят 2 события ВСЕГДА:
1) комбо_BeforeUpdate
2) комбо_AfterUpdate
Можно ли как-то отделить зерна от плевел?Т.е. чтобы программно идентифицировать момент,когда эти 2 события вызваны перевыбором самого значения комбо,а когда это происходит из за того,что нажали кнопку?
...
Рейтинг: 0 / 0
11.03.2020, 15:49
    #39936312
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
drafty,

Использовать переменную на уровне модуля?
...
Рейтинг: 0 / 0
11.03.2020, 15:54
    #39936314
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
4d_monster
drafty,
Использовать переменную на уровне модуля?

В каком тогда событии присваивать ей значение,ведь если я жму на кнопку у меня все-равно:
screen.ActiveControl.Name=Имякомбо
...
Рейтинг: 0 / 0
11.03.2020, 16:22
    #39936329
Как узнать какое событие инициировало вызов другого события
drafty
ведь если я жму на кнопку у меня все-равно:
screen.ActiveControl.Name=Имякомбо
Почему? Когда "жму на кнопку", то фокус на ней и она - ActiveControl. Кстати, надежнее Me .ActiveControl.Name
...
Рейтинг: 0 / 0
11.03.2020, 16:26
    #39936332
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
Кривцов Анатолий
drafty
ведь если я жму на кнопку у меня все-равно:
screen.ActiveControl.Name=Имякомбо
Почему? Когда "жму на кнопку", то фокус на ней и она - ActiveControl. Кстати, надежнее Me .ActiveControl.Name

наверное потому,что при нажатии на кнопку,нельзя избежать события обновления комбо(если мы поменяли значение а потом не выходя из комбо-давим на кнопку)...
...
Рейтинг: 0 / 0
11.03.2020, 16:29
    #39936334
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
drafty
если мы поменяли значение а потом не выходя из комбо-давим на кнопку)...
Ну как это, не выходя? Фокус-то переносится. Вот выход и произошел.
...
Рейтинг: 0 / 0
11.03.2020, 16:30
    #39936335
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
drafty
В каком тогда событии присваивать ей значение
По-хорошему в каждом обработчике события (длинном и выполняющем сторонние операции) следует как минимум иметь переменную, которая сигнализирует, что экземпляр метода уже выполняется (и, как правило, игнорировать наложение событий), типа
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Sub control_event()
Static Busy As Boolean
If Busy Then Exit Sub
Busy = True 
' операции '
Busy = False
End Sub


В данном же случае переменные флагов занятости методов следует делать не статическими локальными в обработчике, а локальными в модуле класса (формы):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Dim ComboX_BeforeUpdate_Busy As Boolean
Dim ButtonX_Click_Busy As Boolean

Sub ComboX_BeforeUpdate()
If ComboX_BeforeUpdate_Busy Then Exit Sub
ComboX_BeforeUpdate_Busy = True 
' операции '
ComboX_BeforeUpdate_Busy = False
End Sub

Sub ButtonX_Click()
If ButtonX_Click_Busy Then Exit Sub
ButtonX_Click_Busy = True 
' операции '
ButtonX_Click_Busy = False
End Sub


Состояния флагов (значения переменных) доступны в любом обработчике формы для анализа и ветвления исполнения.
...
Рейтинг: 0 / 0
11.03.2020, 16:44
    #39936344
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
__Michelle
drafty
если мы поменяли значение а потом не выходя из комбо-давим на кнопку)...
Ну как это, не выходя? Фокус-то переносится. Вот выход и произошел.

Да,фокус переносится,но скринэктивконтрол тотже...
Хотя похоже,может потому,что у меня в процессе AfterUpdate комбо у меня в этом событии меняется рекордсоурс самой формы (с тем критерием,что на комбо)...
Код: vbnet
1.
2.
3.
Private Sub cboFindAcronym_AfterUpdate()
     Call fnkFormRecSrc(Nz(Me.cboFindAcronym))
End Sub


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Function fnkFormRecSrc(argum As String) As Byte
    Select Case (Me.grpFindAbbr)
        Case Is = 1
            If Not (argum = "") Then
                    USLOVIEZAPROSA = " WHERE Acronyms.Abbreviat like '*" & argum & "*'"
                Else
                    USLOVIEZAPROSA = " WHERE Acronyms.Abbreviat='" & argum & "'"
            End If
        Case Is = 2
            USLOVIEZAPROSA = " WHERE Acronyms.Sushnost like '*" & argum & "*'"
    End Select
            POLNIZAPROS = "SELECT Acronyms.Kod,Acronyms.Abbreviat,Acronyms.Sushnost,Acronyms.Istochnik FROM Acronyms" _
                           & USLOVIEZAPROSA _
                           & " ORDER BY Acronyms.Abbreviat ASC;"
            Me.RecordSource = POLNIZAPROS
End Function


И поэтому событие кнопки не срабатывает (наверное)
...
Рейтинг: 0 / 0
11.03.2020, 17:31
    #39936371
Как узнать какое событие инициировало вызов другого события
drafty
при нажатии кнопки-в случае если внесли изменение в комбо а потом сразу нажали кнопку ) происходят 2 события ВСЕГДА:
1) комбо_BeforeUpdate
2) комбо_AfterUpdate
Видимо выделенное, это ключевая фраза.
Вы уверены, что кнопка нажимается? Визуально это заметно?
Вы не показали код на комбо_BeforeUpdate и на кнопке. Вполне аероятно, что после "изменение в комбо" выполнение процедур занимает какое-то время и не дает переместить фокус. BeforeUpdate - уж точно.
Для анализа добавьте Debug.Print "..." на GotFocus и Click кнопки.

Чисто по вопросу "программно идентифицировать" - т.к. на AfterUpdate вы просто вызываете функцию, то вызывайте ее и на Click кнопки. А в функцию добавьте аргумент, через который передавайте имя элемента или другой идентификатор.
...
Рейтинг: 0 / 0
11.03.2020, 18:12
    #39936391
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
Кривцов Анатолий,
да, действительно,кнопка по факту не нажимается...
...
Рейтинг: 0 / 0
12.03.2020, 08:40
    #39936510
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
Кривцов Анатолий
drafty
при нажатии кнопки-в случае если внесли изменение в комбо а потом сразу нажали кнопку ) происходят 2 события ВСЕГДА:
1) комбо_BeforeUpdate
2) комбо_AfterUpdate
Видимо выделенное, это ключевая фраза.
Вы уверены, что кнопка нажимается? Визуально это заметно?
Вы не показали код на комбо_BeforeUpdate и на кнопке. Вполне аероятно, что после "изменение в комбо" выполнение процедур занимает какое-то время и не дает переместить фокус. BeforeUpdate - уж точно.
Для анализа добавьте Debug.Print "..." на GotFocus и Click кнопки.

Чисто по вопросу "программно идентифицировать" - т.к. на AfterUpdate вы просто вызываете функцию, то вызывайте ее и на Click кнопки . А в функцию добавьте аргумент, через который передавайте имя элемента или другой идентификатор.

Дело в том,что у меня событие клик срабатывает только после второго нажатия на кнопку (мне оч стыдно)...
...
Рейтинг: 0 / 0
12.03.2020, 09:00
    #39936518
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
drafty
Кривцов Анатолий
пропущено...
Видимо выделенное, это ключевая фраза.
Вы уверены, что кнопка нажимается? Визуально это заметно?
Вы не показали код на комбо_BeforeUpdate и на кнопке. Вполне аероятно, что после "изменение в комбо" выполнение процедур занимает какое-то время и не дает переместить фокус. BeforeUpdate - уж точно.
Для анализа добавьте Debug.Print "..." на GotFocus и Click кнопки.

Чисто по вопросу "программно идентифицировать" - т.к. на AfterUpdate вы просто вызываете функцию, то вызывайте ее и на Click кнопки . А в функцию добавьте аргумент, через который передавайте имя элемента или другой идентификатор.

Дело в том,что у меня событие клик срабатывает только после второго нажатия на кнопку (мне оч стыдно)...

Вот механизм,если что (события BeforeUpdate на комбо нету-убрал):
Код: vbnet
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.
Private Sub cboFindAcronym_AfterUpdate()
    Call fnkFormRecSrc(1)
End Sub
Function fnkFormRecSrc(argum As Byte) As Byte 
    If (argum = 1) Then
            Select Case (Me.grpFindAbbr)
                Case Is = 1
                    If Not (Me.cboFindAcronym = "") Then
                            USLOVIEZAPROSA = " WHERE Acronyms.Abbreviat like '*" & Me.cboFindAcronym & "*'"
                        Else
                            USLOVIEZAPROSA = " WHERE Acronyms.Abbreviat='" & Me.cboFindAcronym & "'"
                    End If
                Case Is = 2
                    USLOVIEZAPROSA = " WHERE Acronyms.Sushnost like '*" & Me.cboFindAcronym & "*'"
                End Select
                    POLNIZAPROS = "SELECT Acronyms.Kod,Acronyms.Abbreviat,Acronyms.Sushnost,Acronyms.Istochnik FROM Acronyms" _
                                  & USLOVIEZAPROSA _
                                  & " ORDER BY Acronyms.Abbreviat ASC;"
                    Me.RecordSource = POLNIZAPROS
        Else
            Exit Function
    End If
End Function
Private Sub butAddAbbrev_Click()
Dim flagdialoga As Byte
Dim chislozap As Long
flagdialoga = 0
If (IsNull(Me.cboFindAcronym)) Then 
        Exit Function
    Else
        sqlstr = "SELECT Acronyms.Abbreviat,COUNT(Acronyms.Abbreviat) as KolAbbrev FROM Acronyms WHERE Acronyms.Abbreviat like'" & Me.cboFindAcronym & "' GROUP BY Acronyms.Abbreviat HAVING Count(Acronyms.Abbreviat)>0;"
        If ((KolichPovtoreniyGRP(sqlstr, 1)) > 0) Then flagdialoga = MsgBox(".....", vbYesNo, "....") 
            Select Case flagdialoga 
                Case Is <= 6 
                        Forms!MainForm.InsOnMainfrmAcronyms.Form.AllowAdditions = True
                        With Forms!MainForm.InsOnMainfrmAcronyms.Form.Recordset
                            .AddNew
                                !Abbreviat = UCase(Me.cboFindAcronym)
                                !Sushnost = "XXX"
                                !Istochnik = "XXX"
                            .Update
                        End With
                        Forms!MainForm.InsOnMainfrmAcronyms.Form.AllowAdditions = False 
                        FLAGSOHRANENIYA = 0
                        Call fnkButActive(1, 0, 1)
            End Select
End If
End Sub
...
Рейтинг: 0 / 0
12.03.2020, 09:02
    #39936521
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
drafty
drafty
пропущено...

Дело в том,что у меня событие клик срабатывает только после второго нажатия на кнопку (мне оч стыдно)...

Вот механизм,если что (события BeforeUpdate на комбо нету-убрал):
Код: vbnet
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.
Private Sub cboFindAcronym_AfterUpdate()
    Call fnkFormRecSrc(1)
End Sub
Function fnkFormRecSrc(argum As Byte) As Byte 
    If (argum = 1) Then
            Select Case (Me.grpFindAbbr)
                Case Is = 1
                    If Not (Me.cboFindAcronym = "") Then
                            USLOVIEZAPROSA = " WHERE Acronyms.Abbreviat like '*" & Me.cboFindAcronym & "*'"
                        Else
                            USLOVIEZAPROSA = " WHERE Acronyms.Abbreviat='" & Me.cboFindAcronym & "'"
                    End If
                Case Is = 2
                    USLOVIEZAPROSA = " WHERE Acronyms.Sushnost like '*" & Me.cboFindAcronym & "*'"
                End Select
                    POLNIZAPROS = "SELECT Acronyms.Kod,Acronyms.Abbreviat,Acronyms.Sushnost,Acronyms.Istochnik FROM Acronyms" _
                                  & USLOVIEZAPROSA _
                                  & " ORDER BY Acronyms.Abbreviat ASC;"
                    Me.RecordSource = POLNIZAPROS
        Else
            Exit Function
    End If
End Function
Private Sub butAddAbbrev_Click()
Dim flagdialoga As Byte
Dim chislozap As Long
flagdialoga = 0
If (IsNull(Me.cboFindAcronym)) Then 
        Exit Function
    Else
        sqlstr = "SELECT Acronyms.Abbreviat,COUNT(Acronyms.Abbreviat) as KolAbbrev FROM Acronyms WHERE Acronyms.Abbreviat like'" & Me.cboFindAcronym & "' GROUP BY Acronyms.Abbreviat HAVING Count(Acronyms.Abbreviat)>0;"
        If ((KolichPovtoreniyGRP(sqlstr, 1)) > 0) Then flagdialoga = MsgBox(".....", vbYesNo, "....") 
            Select Case flagdialoga 
                Case Is <= 6 
                        Forms!MainForm.InsOnMainfrmAcronyms.Form.AllowAdditions = True
                        With Forms!MainForm.InsOnMainfrmAcronyms.Form.Recordset
                            .AddNew
                                !Abbreviat = UCase(Me.cboFindAcronym)
                                !Sushnost = "XXX"
                                !Istochnik = "XXX"
                            .Update
                        End With
                        Forms!MainForm.InsOnMainfrmAcronyms.Form.AllowAdditions = False 
                        FLAGSOHRANENIYA = 0
                        Call fnkButActive(1, 0, 1)
            End Select
End If
End Sub


...извините за такую "портянку" на весь экран - не знаю как делать опцию "плюсика" которая сворачивает объемный код
...
Рейтинг: 0 / 0
12.03.2020, 09:34
    #39936552
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
drafty
drafty
пропущено...


Код: vbnet
1.
2.
3.
4.
5.
6.
......
                    POLNIZAPROS = "SELECT Acronyms.Kod,Acronyms.Abbreviat,Acronyms.Sushnost,Acronyms.Istochnik FROM Acronyms" _
                                  & USLOVIEZAPROSA _
                                  & " ORDER BY Acronyms.Abbreviat ASC;"
                    if (Dao.Recordset("POLNIZAPROS").Recordcount>0) Then Me.RecordSource = POLNIZAPROS 'в скобках IF указана некая мнемоника,чтобы не писать программный код - а показать именно суть принчины  
...........



Короче кнопка добавления с первого раза не срабатывала потому,что набору таблицы присваивался рекордсоурс после обновления.
Теперь срабатывает с первого раза.
Всех благодарю за содействие!
...
Рейтинг: 0 / 0
12.03.2020, 09:51
    #39936557
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
drafty
Код: vbnet
1.
(Dao.Recordset("POLNIZAPROS").Recordcount>0)

дичь
...
Рейтинг: 0 / 0
12.03.2020, 10:35
    #39936578
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
Панург
drafty
Код: vbnet
1.
(Dao.Recordset("POLNIZAPROS").Recordcount>0)

дичь
)))))

Выражение Dao.Recordset("POLNIZAPROS").Recordcount>0,есть ни что иное,как:
Код: vbnet
1.
2.
3.
4.
5.
Dim dbs as Dao.Database
Dim rst as DAO.Recordset
Set dbs = CurrentDb
Set rst = CurrentDb.OpenRecordset(POLNIZAPROS)
If  (rst.Recordcount>0) Then ....


Так нормально?
Я же в этой строке специально в коменте написал,что ( Dao.Recordset("POLNIZAPROS") .Recordcount>0) это некая мнемоника(чтобы не писать "лишнее")
...
Рейтинг: 0 / 0
12.03.2020, 11:14
    #39936589
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
drafty
это некая мнемоника
я человек простой...(с) И с чего я должен догадаться что у нас тут пишут шарады, а не код? Подписывайся тогда - "Синицкий".

drafty
Код: vbnet
1.
(rst.Recordcount>0)

А это ты ещё не знаешь что некоторые наборы возвращают всегда -1...
...
Рейтинг: 0 / 0
12.03.2020, 11:49
    #39936604
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать какое событие инициировало вызов другого события
Панург
drafty
это некая мнемоника
я человек простой...(с) И с чего я должен догадаться что у нас тут пишут шарады, а не код? Подписывайся тогда - "Синицкий".

drafty
Код: vbnet
1.
(rst.Recordcount>0)

А это ты ещё не знаешь что некоторые наборы возвращают всегда -1 ...

Нет,не знаю,пока не сталкивался с подобным...
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как узнать какое событие инициировало вызов другого события / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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