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

Не могу обработать событие 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
Access HTMLButtonElement - связать элемент с событием
    #39944025
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG-S
Код: vbnet
1.
Private Function evtBUT_OnClick() As Boolean

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

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

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


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

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

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

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

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

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

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


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

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

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

Теоретически всё возможно, например, блокируется IE объект или его процесс, также возможно доступ к событиям должен быть по другому реализован.
Пока пройдусь ещё по ссылкам, попробую добавить некоторые библиотеки, обновлю браузер IE.. ну и остаётся искать другой способ...
...
Рейтинг: 0 / 0
Access HTMLButtonElement - связать элемент с событием
    #39944111
SERG-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
14 сообщений из 14, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Access HTMLButtonElement - связать элемент с событием
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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