| 
 | 
| 
 
Фоновый опрос кнопок модальной 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?fid=60&msg=38527664&tid=2156566]:  | 
    0ms | 
get settings:  | 
    8ms | 
get forum list:  | 
    11ms | 
check forum access:  | 
    3ms | 
check topic access:  | 
    3ms | 
track hit:  | 
    48ms | 
get topic data:  | 
    10ms | 
get forum data:  | 
    2ms | 
get page messages:  | 
    54ms | 
get tp. blocked users:  | 
    2ms | 
| others: | 13ms | 
| total: | 154ms | 

| 0 / 0 | 

На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даете согласие с использованием данных технологий.