Страницы: 1
RSS
"проскальзывание" кода на форме во время выполнения, срабатывают не все строки кода, при ручном проходе всё ок
 
Добрый день, коллеги.
Столкнулся с такой странной, вроде бы, проблемой.
По мотивам вот этой темы Как отследить изменения Чекбокса ? набросал простенькую форму
На форме - SpinButton, два Checkbox'а и Label.

Суть модельки - показать, как можно сохранять и отображать историю чекбоксов при переходе от одного значения спина к другому.
Чекбоксы привязаны к ячейкам через ControlSource. При изменении SpinButton происходит замена ControlSource у чекбокса (номер строки задается спином), и проверяется - если ячейка ControlSource пустая, то чекбокс устанавливается False.
При инициализации формы чекбоксы устанавливаются в False, спин = 1

Запускаем форму. Первая строка отрабатывается нормально.
Щелкаем спин, переходим к другой строке. Первый чекбокс отрабатывает нормально, второй становится в положение triplestate - затененная галочка. Повторяем - картина та же, первый чекбокс и его ControlSource исправно принимает значение False на пустых ячейках, второй - по-прежнему игнорирует попытки вразумить его и ControlSource
Идем по спину в обратном направлении - всё отрабатывает замечательно, второй чекбокс срабатывает как надо - пустой заполняется False, если ранее был установлен - так же отлавливает.

Выгружаем форму, запускаем ее в ручном пошаговом режиме - все работает нормально.
Такое ощущение, что код "проскальзывает", по какой-то причине не успевая отработать изменения двух чекбоксов сразу.
Менял порядок строк в коде, давало обратные эффекты (пролетал мимо первый вместо второго), но стабильной работы добиться не удалось. Устраивал проверку не только на "", но и на Null, и на Empty - ничего.

Что это может быть за причина и как с этим бороться? Встречался с подобными проблемами и в других формах.

код тут
F1 творит чудеса
 
Причина, по-видимому, в задержке обработки ячеек ControlSource, а именно при попытке поместить туда новое значение чекбокса (False) - первая проходит, остальные стопорятся. Как бороться - 2 варианта: 1) после каждого присвоения значения связанному с ячейкой чекбоксу юзать DoEvents; 2) присваивать программно значение не чекбоксу, а ячейке-источнику.
 
Влад, спасибо, оба варианта срабатывают
F1 творит чудеса
Страницы: 1
Наверх