|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
Доброго времени суток! Есть код на VBA, который производит конвертацию одного вида данных в другой. Я сделал модальную UserForm с информационным окном, чтобы в нем отображать процесс конвертации.Форма содержит статусбары выполнения задачи и кнопки управления конвертором, типа "Выбрать файлы", "Пуск/Стоп". Суть вопроса в том, что пока фокус находится на Форме, я могу нажимать кнопки, запуская выполнения нужных процедур кода. Но как только основной код стартует (нажал кнопку "Пуск"), кнопки становятся неактивными до окончания процедур. Т.к. конвертация может занимать продолжительное время, я хочу иметь возможность нажатием кнопки "Стоп" на UserForm прервать процесс. Однако во время выполнения основного кода фокус UserForm не передается, тк код выполняется последовательно после события Button_Click(). Кнопка "Пуск" остается нажатой до окончания процедур. Вопрос:Как реализовать процесс так, чтобы основной код стартовал, но кнопки Формы оставались активны? В основном коде я мог бы циклически анализировать их статус и управлять кодом. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 00:05 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 00:51 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
Как я понимаю, я должен сделать нечто такое: 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 при этом кнопки всегда будут активными для тырканья? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 01:13 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
Провел эксперимент: ' Это в модуль 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 не только в цикле, но и в любом месте выполняемого основного кода, чтобы проверить события? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 01:51 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
DoEvents - это не обработчик событий. Это процедура, позволяющая выйти из треда исполняемого процесса VBA, и передать управление ОС. Обратно управление вернётся либо по завершению цикла обработки процессов ОС, либо при возникновении нового события в приложении. Так что использование DoEvents требует понимания взаимодействия установленных в данный момент обработчиков событий... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 07:41 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
AndreTM DoEvents - это не обработчик событий. Это процедура, позволяющая выйти из треда исполняемого процесса VBA, и передать управление ОС. Обратно управление вернётся либо по завершению цикла обработки процессов ОС, либо при возникновении нового события в приложении. Так что использование DoEvents требует понимания взаимодействия установленных в данный момент обработчиков событий...Полнейшая бредятина. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 10:39 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
13-й кварталПолнейшая бредятина.Ну и написал бы сам тогда. DoEvents приостанавливает выполнение текущей процедуры и выполняет все те события VBA, которые успели встать в очередь, после чего возвращает управление приостановленной процедуре. С действительно DoEvents надо быть аккуратным, большинство требований к проектированию - как к многозадачному приложению. К примеру, выполняемые вне очереди события могут изменить общие переменные, объекты, закрыть форму, открыть какую-то другую. И когда управление вернется приостановленной процедуре, она может обнаружить для себя очень много неожиданного. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 10:46 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
Shocker.Pro13-й кварталПолнейшая бредятина.Ну и написал бы сам тогда. DoEvents приостанавливает выполнение текущей процедуры и выполняет все те события VBA, которые успели встать в очередь, после чего возвращает управление приостановленной процедуре.Тоже 50/50 ерунда. DoEvents передает управление оконной процедуре (а вернее цепочке процедур, окон-то много) потока, в котором исполняется код VBA, и эта процедура обрабатывает оконные сообщения, скопившиеся в буфере за то время, пока управление находилось в VBA-коде. VBA-процедура не "приостанавливается", она выполняет синхронную процедуру (под названием DoEvents), реализованную в ядре VBA. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 12:50 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
Shocker.Pro К примеру, выполняемые вне очереди событияНикакие события вне очереди не выполняются. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 12:53 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
я написал так, как это выглядит с прикладной точки зрения, этого достаточно для понимания и программирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 14:22 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
Стоп-стоп-стоп!!!))))) Вроде все правы! А теперь с практической точки зрения имею вот что: К примеру, я нажал на форме кнопку, когда основной код во всю работает. По DoEvents VBA в какой-то момент передал управление событию Button_Click() . А там стоит всего лишь процедурка, которая устанавливает некий глобальный маркер, указывающий, какая кнопка была нажата. После этого основная процедура продолжает работать и где-то там я опросил маркер нажатой кнопки и убежал делать соответствующее действие.... Вроде так я попробовал и все так и работает. Но вот вопрос: А если я тыркнул на кнопку пять раз? Все пять тырканий система отлаживает в буфер, чтобы потом при опросе событий обработать их? Я понимаю, DoEvents это нечто типа прерывания (как в Ассемблере на Спектруме? Вспомнилось чтото))...) Как избежать множественных событий? Создать процедурку типа триггера, чтобы не плодить нескольких одинаковых событий? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 15:38 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
Игорь_777Все пять тырканий система отлаживает в буфер, чтобы потом при опросе событий обработать их?да Игорь_777Как избежать множественных событий?а в чем проблема, сделай флаг Boolean ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 16:13 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
Shocker.ProИгорь_777Все пять тырканий система отлаживает в буфер, чтобы потом при опросе событий обработать их?даНет. Одна итерация цикла, в который вообще имеет смысл вставлять DoEvents, занимает десятые и сотые доли секунды. Пол-секунды уже ни в какие ворота — как называется интерфейс, который оживает раз в пол-секунды на миг? Слайд-шоу. Попробуй быстрее, чем за пол-секунды накликать 5 раз, чтобы все клики попали в одну итерацию DoEvents. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 16:56 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
AntonariyShocker.ProИгорь_777Все пять тырканий система отлаживает в буфер, чтобы потом при опросе событий обработать их?даНет.Нет да! Рассуждение на тему, с какой частотой вызывать Doevents чисто прикладное. Но если пять раз тыкнуть в кнопку - будет пять событий. Проверка приложена. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 17:46 |
|
Фоновый опрос кнопок модальной UserForm. Как реализовать?
|
|||
---|---|---|---|
#18+
Ребята, я смотрю, дискуссия развернулась нешуточная! )) Я так понимаю, что все зависит от задачи и ее реализации в каждом конкретном случае. Скорее всего, правильно настроенный код решит многие потенциальные проблемы. Спасибо вам за советы. В каждом из них есть полезная информация. Я уже получил ожидаемый результат. Осталось его отшлифовать. Вот тут и могут быть нюансы. Но DoEvents наконец-то применяется в моем коде!) Ура. Спасибо Вам, ушел экспериментировать дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2014, 19:40 |
|
|
start [/forum/topic.php?desktop=1&fid=60&tid=2156566]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 273ms |
total: | 423ms |
0 / 0 |