Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Access HTMLButtonElement - связать элемент с событием / 14 сообщений из 14, страница 1 из 1
04.04.2020, 21:10
    #39944020
SERG-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
День добрый.
Прошу помочь в одной проблеме.

Не могу обработать событие OnClick для HTMLElement в Internet Explorer. Точнее для HTMLButtonElement.
Пытаюсь реализовать это через WithEvents. Но не получается связать событие с функцией обработки события.

Майкрософт для VB описывает реализацию с объявлением Event и вызова событий через RaiseEvent, а связывать событие и обработчик предлагается через операторы WithEvents и предложением Handles.
Но не могу понять как это реализовать в VBA и нужно ли это вообще в текущей ситуации.

На некоторых сайтах предлагается реализовывать также, как это пытаюсь делать я - через оператор WithEvents. Но как упоминал выше, у меня не получается "поймать" событие для элемента.

Плиаз, подскажите решение или направление, по какому пути идти?
Очень буду признателен. Времени потратил немерено, но пока не ясно где камень.

Код: 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.
49.
50.
51.
52.
53.
Option Compare Database
 
 
Private WithEvents evtBUT As MSHTML.HTMLButtonElement
Private bd As HTMLBody
 
'обработчик события, который не запускается при нажатии кнопки
Private Function evtBUT_OnClick() As Boolean
bd.innerHTML = "!ТЕСТ!"
End Function
 
'точка запуска программы
Public Sub startProgramm()
Dim doc As HTMLDocument
Dim nodeHTML As IHTMLDOMNode
Dim emtBUT As IHTMLButtonElement
Set doc = IeRun.Document
With doc
Set bd = .body
Set emtBUT = .createElement("button")
With emtBUT
.innerText = "click"
.OnClick = "evtBUT_OnClick" 'событие
With .Style
.Width = "100px"
.Height = "20px"
.TextAlign = "center"
End With
End With
Set nodeHTML = .getElementsByTagName("HTML")(, 0)
Set evtBUT = nodeHTML.insertBefore(emtBUT, nodeHTML.firstChild)
 
'evtBUT.Click 'проверка события. убрав комментарий событие обрабатывается
 
End With
Set doc = Nothing
Set emtBUT = Nothing
Set nodeHTML = Nothing
End Sub
 
'IE объект
Private Function IeRun() As InternetExplorer
Dim ie As New InternetExplorer
With ie
.navigate "about:blank"
.Visible = True
Do
DoEvents
Loop While .ReadyState < READYSTATE_COMPLETE
Set IeRun = ie
End With
Set ie = Nothing
End Function
...
Рейтинг: 0 / 0
04.04.2020, 21:34
    #39944025
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
SERG-S
Код: vbnet
1.
Private Function evtBUT_OnClick() As Boolean

вот эта строка написана руками или сгенерирована с помощью выбора из выпадающего списка?
...
Рейтинг: 0 / 0
04.04.2020, 21:43
    #39944026
SERG-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
Shocker.Pro,
я пишу коды только своими руками))
...
Рейтинг: 0 / 0
04.04.2020, 21:59
    #39944028
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
SERG-S
я пишу коды только своими руками))
Тогда вопрос, к пишущему коды своими руками - сигнатура метода верная?
...
Рейтинг: 0 / 0
04.04.2020, 22:49
    #39944035
SERG-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
Shocker.Pro,
ответ тот же.. поэтому не могу сказать уверено.

Но пробовал использовать процедуру (sub) - ошибка, ругается. На сайте, майкрософт пишет, что событие onClick должно возвращать значение объекту. Не исключаю, что моя функция обработки события должна возвратить значение.
Пробовал возвратить true, но это не изменило ситуацию.

Логика у меня следующая - при использовании метода click событие обрабатывается. Получается событие присваивается - делаю вывод, что сигнатура правильная.
см. в коде:
Код: vbnet
1.
'evtBUT.Click 'проверка события. убрав комментарий событие обрабатывается


Я думаю вот над чем - сигнатура верная, но возможно нужно передать в функцию параметр(-ы). Например, номер события или объект события. Скажем это может быть объект типа event.

В общем, пока склоняюсь к тому, что проблема в следующем - из объекта IE не поднимается событие нажатие кнопки, который в свою очередь не запускает обработчик события. Собственно, изначально я написал свои предположения в самом вопросе (см. о VB).
Но возможно я и усложняю ситуацию и есть возможность сразу вызвать функцию события. Вот как раз думаю над этим.

Но вопросы мне нравятся. Наводящие...
Если так дальше пойдёт, возможно появятся новые идеи.
...
Рейтинг: 0 / 0
04.04.2020, 23:18
    #39944040
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
SERG-S
Я думаю вот над чем - сигнатура верная, но возможно нужно передать в функцию параметр(-ы). Например, номер события или объект события. Скажем это может быть объект типа event.
Мне казалось, мой намек был достаточно непрозрачным. Нужно просто выбрать событие из выпадающего списка, и тогда код обработчика будет создан автоматически и думать о том, какая у него правильная сигнатура, не потребуется.
...
Рейтинг: 0 / 0
05.04.2020, 08:40
    #39944065
SERG-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
Shocker.Pro,
Да, сигнатура верная. Я только на следующий день сообразил о каком списке процедур в модуле ты упоминаешь.

Приятель, давай проясним момент - я же написал, что код пишу руками, в том числе и сигнатуры процедур. Поэтому мои мысли и основывались на предположениях.
Я ценю твоё внимание к моему вопросу, но мне нужен конструктивный диалог, а не "прозрачные намёки". Для этого и выложил рабочий код, чтобы не тратить ни твоё, ни своё время. Пожалуйста, всё в твоих руках.

Если можешь помочь, даже не столько решением, сколько советом - буду признателен. Но не стоит "раздувать" тему "прозрачными намёками".
...
Рейтинг: 0 / 0
05.04.2020, 10:50
    #39944073
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
SERG-S
Для этого и выложил рабочий код, чтобы не тратить ни твоё, ни своё время. Пожалуйста, всё в твоих руках.
Я вчера не попробовал код просто потому, что недосуг было вспоминать, какие там референцы надо подключать, чтобы и выпадающий список появился и код сам запустился, поэтому и спросил про сигнатуру, полагая, что произошла классическая ошибка, ан нет.

Сегодня полез сам и знаешь что... у меня работает :-\
...
Рейтинг: 0 / 0
05.04.2020, 10:53
    #39944074
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
Excel 2013 Pro
...
Рейтинг: 0 / 0
05.04.2020, 12:08
    #39944082
SERG-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
Shocker.Pro,
а вот это уже интересно..

ты хочешь сказать, что запустил программу с закомментированой строкой
Код: vbnet
1.
'evtBUT.Click 'проверка события. убрав комментарий событие обрабатывается


и клик по кнопке из IE у тебя работает?

у меня все необходимые ссылки подключены, без них сам код бы не работал.
Честно сказать, я не подумал протестировать прогу в Excel, сейчас я это сделаю. Но даже если он и будет работать, мне нужно это реализовать в ACCESS.

А ты можешь протестировать программу в ACCESS?
...
Рейтинг: 0 / 0
05.04.2020, 12:36
    #39944087
SERG-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
Shocker.Pro,
в Excel-e у меня тоже не работает..
...
Рейтинг: 0 / 0
05.04.2020, 12:59
    #39944089
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
SERG-S
ты хочешь сказать, что запустил программу с закомментированой строкой
да, код не менял кроме первой строки. Даже не знаю, в какую тут сторону копать. Да, кстати, у меня Win7.
...
Рейтинг: 0 / 0
05.04.2020, 13:30
    #39944093
SERG-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
Shocker.Pro,
у меня win10, но я не думаю, что в этом проблема. хотя..

Теоретически всё возможно, например, блокируется IE объект или его процесс, также возможно доступ к событиям должен быть по другому реализован.
Пока пройдусь ещё по ссылкам, попробую добавить некоторые библиотеки, обновлю браузер IE.. ну и остаётся искать другой способ...
...
Рейтинг: 0 / 0
05.04.2020, 15:27
    #39944111
SERG-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access HTMLButtonElement - связать элемент с событием
Shocker.Pro,
Друг, ты дал мне почву для размышлений. Спасибо.
А за то, что ты потратил на меня своё время расскажу к какому решению я пришёл (возможно будет тебе полезным в решении других, своих задач)..

Решение было на поверхности ещё перед написанием моего вопроса на формах, в т.ч. на этом. Но оооооочень не хотел использовать этот способ.
Ответ кроется в этой строке:
Код: vbnet
1.
'evtBUT.Click 'проверка события. убрав комментарий событие обрабатывается


Картина следующая - пока выполняется процедура запуска в VBA я могу манипулировать как объектом IE и его содержимым, так и обрабатывать события из IE объекта. Но когда процедура завершается, - возможно манипулировать только объектом IE и его содержимым.
Кстати, эта ситуация вполне логична - ведь после запуска IE объекта, я имею его экземпляр и могу на него влиять. Но в обратную сторону - это автономный объект, который не имеет никакой связи с моим кодом vba.

Мысль такая - чтобы после завершения процедуры startProgramm была возможность обращаться к обработчику событий VBA, нужно при открытии IE, в его документ внедрить скрипт, который будет обращаться к библиотеке и вызывать соответствующую функцию. Но тогда явно это будет не access или excel с VBA, а серверный JavaScrpt (не уверен, что у клиентского есть такая возможность) или C# с PHP и библиотека DLL.
Я бы так реализовывал, если была бы сильная потребность.

В общем пока я принял такое решение - буду выполнять процедуру запуска с DoEvents, пока IE объект существует. А после его закрытия процедура будет завершаться.
Недостаток в том, что пока существует IE, будет выполняться проверка, что может повлиять на производительности. Только пока не знаю в какой степени будет "жрать" ресурсы этот способ. Также, среда разработки будет занята. Но других вариантов пока нет.
Буду пытаться оптимизировать код насколько возможно путём исключения лишних процессов и тестировать на возможность задействования других процессов ACCESS при выполнении этого кода.

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


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