Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница:

 

  Вопрос: Обнаружен глюк у контрола ImageCombo Добавлено: 29.09.02 21:37  

Автор вопроса:  Comanche

Обнаружен глюк у контрола ImageCombo (компонента "MS Windows Common Controls 6.0 (SP4)", файл MSCOMCTL.OCX; точная версия - 6.00.8862), который заключается в "торможении" генерации события _Change, которое отрабатывается иногда асинхронно. Иногда - потому что замечено при отладке громоздкого проекта; при попытке сэмулировать ситуацию в "лысом" проекте всё было нормально. Сообщаю об этом, чтобы кто-нибудь не встал на эти грабли, как я (убил 2 часа времени, чтобы найти решение!).

Поясняю:

Пусть есть форма с контролом cboSystemSounds (типа ImageCombo), у которого в событии Click стоит какой-то код (допустим, воспроизведение выбранного из списка звука), а в событии Change - то же самое или просто строчка Call cboSystemSounds_Click). Через Click ловим ввод юзера, а через Change - изменения из кода, типа "cboSystemSounds.ComboItems(2).Selected = True" (изменения из кода не вызывают Click - только Change, поэтому дублировать и приходится).

Также для сравнения поместим на форму какой-нибудь "нормальный" контрол - например, txtBox1.

Пишем такой код для какой-нибудь CommandButton (на нажатие):
[code]
soundNumber = 5
Debug.Print "[1] Сейчас будем менять cboSystemSounds и txtBox1 из нашего кода..."
txtBox1.Text = "Тра-ля-ля"
cboSystemSounds.ComboItems(soundNumber).Selected = True
Debug.Print "[4] Изменили cboSystemSounds и txtBox1 из нашего кода. Это должно было вызвать 2 события _Change."
[/code]

для события txtBox1_Change - вот такой:
[code]
Debug.Print "[2] Вот генерация первого события - txtBox1_Change."
' Какой-то код события
[/code]

а для события cboSystemSounds_Change - такой код:
[code]
Debug.Print "[3] А вот и генерация второго события - cboSystemSounds_Change!!!"
' Какой-то код события, например - воспроизведение выбранного из списка звука
[/code]

Понятно, что при нажатии кнопки CommandButton должны появиться 4 сообщения от дебаггера, причём - в порядке возрастания своих номеров (которые в квадратных скобках).

ОДНАКО... они появляются вот в таком порядке:
[code]
[1] Сейчас будем менять cboSystemSounds и txtBox1 из нашего кода...
[2] Вот генерация первого - события txtBox1_Change.
[4] Изменили cboSystemSounds и txtBox1 из нашего кода. Это должно было вызвать 2 события _Change.
[3] А вот и генерация второго события - cboSystemSounds_Change!!!
[/code]

Очевидно, такого быть не должно, - ведь, во-первых, другой тип контрола (TextBox) этим не страдает (как видно выше), а во-вторых, всё то же самое, но в легковесном ("лысом") проекте вроде как работает без этой самой ошибки.

=================================================================================

Проблема решается, если сразу после "cboSystemSounds.ComboItems(soundNumber).Selected = True" поставить строчку со спасительным DoEvents.

Я не уверен, что если вы сделаете этому примеру "copy & paste", то у вас произойдёт эта ошибка. Как-то это связано с "громоздкостью" проекта, по-моему: числом контролов на форме, проходами по стеку вызовов процедур и т.п., - когда я свой громоздкий проект упростил (скопировал в другую папку и изрядно "облегчил"), то проблема исчезла. В исходном же - осталась.

Имейте этот глюк в виду.

Ответить

  Ответы Всего ответов: 0  

Нет ответов

Страница:

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам