powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Фоновый опрос кнопок модальной UserForm. Как реализовать?
16 сообщений из 16, страница 1 из 1
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38527643
Игорь_777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Есть код на VBA, который производит конвертацию одного вида данных в другой. Я сделал модальную UserForm с информационным окном, чтобы в нем отображать процесс конвертации.Форма содержит статусбары выполнения задачи и кнопки управления конвертором, типа "Выбрать файлы", "Пуск/Стоп".

Суть вопроса в том, что пока фокус находится на Форме, я могу нажимать кнопки, запуская выполнения нужных процедур кода. Но как только основной код стартует (нажал кнопку "Пуск"), кнопки становятся неактивными до окончания процедур. Т.к. конвертация может занимать продолжительное время, я хочу иметь возможность нажатием кнопки "Стоп" на UserForm прервать процесс.
Однако во время выполнения основного кода фокус UserForm не передается, тк код выполняется последовательно после события Button_Click(). Кнопка "Пуск" остается нажатой до окончания процедур.

Вопрос:Как реализовать процесс так, чтобы основной код стартовал, но кнопки Формы оставались активны? В основном коде я мог бы циклически анализировать их статус и управлять кодом.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38527655
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_777,

DoEvents в коде выполнения процедур.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38527664
Игорь_777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как я понимаю, я должен сделать нечто такое:

1.создать "вечный" цикл с DoEvents;
2. Перед запуском цикла я должен отобразить свою UserForm с кнопами;
3. На события кноп навесить какой-то маркер-например для первой кнопки событие ButtonSTART_Click() установит маркер PressKey="START";
4. В теле "вечного" цикла мониторить маркер кноп:
Select Case PressKey
Case "START"
MsgBox "нажал кнопку СТАРТ"
Call Start_Macros
...

Я правильно понял идею? С таким обработчиком событий я еще не работал... ))

Прочел также тут: www.codenet.ru/progr/vbasic/5/7.php

Так на UserForm при этом кнопки всегда будут активными для тырканья? ))
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38527670
Игорь_777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Провел эксперимент:


' Это в модуль

Public PressKey As String

Sub EternalLoop()
' организуем вечный цикл

With UserForm1
.Show vbModless
.Label1.Caption = "цикл запущен"
End With

Do While DoEvents()
'Код, работающий в процессе цикла ожидания

Select Case PressKey
Case "СТАРТ"
UserForm1.Label1.Caption = "Нажал кнопку СТАРТ"
Case "СТОП"
UserForm1.Label1.Caption = "Нажал кнопку СТОП"
Case "ВЫХОД"
Exit Do
End Select


Loop
End Sub

' Это в код формы:

Private Sub Bt_START_Click()
PressKey = "СТАРТ"
End Sub

Private Sub Bt_STOP_Click()
PressKey = "СТОП"
End Sub

Private Sub UserForm_Terminate()
PressKey = "ВЫХОД"
End Sub



Все работает как надо!
Вопрос по теме: Я ведь могу вызывать DoEvent не только в цикле, но и в любом месте выполняемого основного кода, чтобы проверить события?
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38527725
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoEvents - это не обработчик событий.
Это процедура, позволяющая выйти из треда исполняемого процесса VBA, и передать управление ОС. Обратно управление вернётся либо по завершению цикла обработки процессов ОС, либо при возникновении нового события в приложении. Так что использование DoEvents требует понимания взаимодействия установленных в данный момент обработчиков событий...
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38527844
AndreTM DoEvents - это не обработчик событий.
Это процедура, позволяющая выйти из треда исполняемого процесса VBA, и передать управление ОС. Обратно управление вернётся либо по завершению цикла обработки процессов ОС, либо при возникновении нового события в приложении. Так что использование DoEvents требует понимания взаимодействия установленных в данный момент обработчиков событий...Полнейшая бредятина.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38527854
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13-й кварталПолнейшая бредятина.Ну и написал бы сам тогда.

DoEvents приостанавливает выполнение текущей процедуры и выполняет все те события VBA, которые успели встать в очередь, после чего возвращает управление приостановленной процедуре.

С действительно DoEvents надо быть аккуратным, большинство требований к проектированию - как к многозадачному приложению. К примеру, выполняемые вне очереди события могут изменить общие переменные, объекты, закрыть форму, открыть какую-то другую. И когда управление вернется приостановленной процедуре, она может обнаружить для себя очень много неожиданного.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38528072
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro13-й кварталПолнейшая бредятина.Ну и написал бы сам тогда.

DoEvents приостанавливает выполнение текущей процедуры и выполняет все те события VBA, которые успели встать в очередь, после чего возвращает управление приостановленной процедуре.Тоже 50/50 ерунда. DoEvents передает управление оконной процедуре (а вернее цепочке процедур, окон-то много) потока, в котором исполняется код VBA, и эта процедура обрабатывает оконные сообщения, скопившиеся в буфере за то время, пока управление находилось в VBA-коде.

VBA-процедура не "приостанавливается", она выполняет синхронную процедуру (под названием DoEvents), реализованную в ядре VBA.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38528081
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro К примеру, выполняемые вне очереди событияНикакие события вне очереди не выполняются.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38528266
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я написал так, как это выглядит с прикладной точки зрения, этого достаточно для понимания и программирования.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38528450
Игорь_777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Стоп-стоп-стоп!!!))))) Вроде все правы! А теперь с практической точки зрения имею вот что:

К примеру, я нажал на форме кнопку, когда основной код во всю работает. По DoEvents VBA в какой-то момент передал управление событию Button_Click() . А там стоит всего лишь процедурка, которая устанавливает некий глобальный маркер, указывающий, какая кнопка была нажата.
После этого основная процедура продолжает работать и где-то там я опросил маркер нажатой кнопки и убежал делать соответствующее действие....
Вроде так я попробовал и все так и работает. Но вот вопрос: А если я тыркнул на кнопку пять раз? Все пять тырканий система отлаживает в буфер, чтобы потом при опросе событий обработать их?
Я понимаю, DoEvents это нечто типа прерывания (как в Ассемблере на Спектруме? Вспомнилось чтото))...)

Как избежать множественных событий? Создать процедурку типа триггера, чтобы не плодить нескольких одинаковых событий?
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38528492
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_777Все пять тырканий система отлаживает в буфер, чтобы потом при опросе событий обработать их?да
Игорь_777Как избежать множественных событий?а в чем проблема, сделай флаг Boolean
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38528560
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИгорь_777Все пять тырканий система отлаживает в буфер, чтобы потом при опросе событий обработать их?даНет.

Одна итерация цикла, в который вообще имеет смысл вставлять DoEvents, занимает десятые и сотые доли секунды. Пол-секунды уже ни в какие ворота — как называется интерфейс, который оживает раз в пол-секунды на миг? Слайд-шоу.

Попробуй быстрее, чем за пол-секунды накликать 5 раз, чтобы все клики попали в одну итерацию DoEvents.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38528649
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyShocker.ProИгорь_777Все пять тырканий система отлаживает в буфер, чтобы потом при опросе событий обработать их?даНет.Нет да! Рассуждение на тему, с какой частотой вызывать Doevents чисто прикладное. Но если пять раз тыкнуть в кнопку - будет пять событий. Проверка приложена.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38528802
Игорь_777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, я смотрю, дискуссия развернулась нешуточная! )) Я так понимаю, что все зависит от задачи и ее реализации в каждом конкретном случае. Скорее всего, правильно настроенный код решит многие потенциальные проблемы.
Спасибо вам за советы. В каждом из них есть полезная информация.

Я уже получил ожидаемый результат. Осталось его отшлифовать. Вот тут и могут быть нюансы. Но DoEvents наконец-то применяется в моем коде!) Ура.

Спасибо Вам, ушел экспериментировать дальше.
...
Рейтинг: 0 / 0
Фоновый опрос кнопок модальной UserForm. Как реализовать?
    #38529159
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНо если пять раз тыкнуть в кнопку - будет пять событий. Проверка приложена.Я с этим и не спорил.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Фоновый опрос кнопок модальной UserForm. Как реализовать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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