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

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

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

наверное потому,что при нажатии на кнопку,нельзя избежать события обновления комбо(если мы поменяли значение а потом не выходя из комбо-давим на кнопку)...
...
Рейтинг: 0 / 0
Как узнать какое событие инициировало вызов другого события
    #39936334
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty
если мы поменяли значение а потом не выходя из комбо-давим на кнопку)...
Ну как это, не выходя? Фокус-то переносится. Вот выход и произошел.
...
Рейтинг: 0 / 0
Как узнать какое событие инициировало вызов другого события
    #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
Как узнать какое событие инициировало вызов другого события
    #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
Как узнать какое событие инициировало вызов другого события
    #39936371
drafty
при нажатии кнопки-в случае если внесли изменение в комбо а потом сразу нажали кнопку ) происходят 2 события ВСЕГДА:
1) комбо_BeforeUpdate
2) комбо_AfterUpdate
Видимо выделенное, это ключевая фраза.
Вы уверены, что кнопка нажимается? Визуально это заметно?
Вы не показали код на комбо_BeforeUpdate и на кнопке. Вполне аероятно, что после "изменение в комбо" выполнение процедур занимает какое-то время и не дает переместить фокус. BeforeUpdate - уж точно.
Для анализа добавьте Debug.Print "..." на GotFocus и Click кнопки.

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

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

Дело в том,что у меня событие клик срабатывает только после второго нажатия на кнопку (мне оч стыдно)...
...
Рейтинг: 0 / 0
Как узнать какое событие инициировало вызов другого события
    #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
Как узнать какое событие инициировало вызов другого события
    #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
Как узнать какое событие инициировало вызов другого события
    #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
Как узнать какое событие инициировало вызов другого события
    #39936557
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty
Код: vbnet
1.
(Dao.Recordset("POLNIZAPROS").Recordcount>0)

дичь
...
Рейтинг: 0 / 0
Как узнать какое событие инициировало вызов другого события
    #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
Как узнать какое событие инициировало вызов другого события
    #39936589
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty
это некая мнемоника
я человек простой...(с) И с чего я должен догадаться что у нас тут пишут шарады, а не код? Подписывайся тогда - "Синицкий".

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

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

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

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

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


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