| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка Windows Forms > Помогите с контролом |
| Автор: Ch0bits 24.1.2006, 22:02 | ||||
| Решил написать контрол SpinEdit, который должен содержать число, ограниченное верхним и нижним пределом, а также умеет его изменять колёсиком мыши и кнопками вверх и вниз. Не пойму почему такие глюки: 1. При установке значения Digit, оно всё равно сбрасывается на 0, хотя MaxDigit и MinDigit работают нормально. 2. Не перехватывается нажатие клавиши!
|
| Автор: Ch0bits 25.1.2006, 12:13 | ||
Теперь осталась только первая ошибка. Да! Да! Я знаю какой я ламер! |
| Автор: mr.DUDA 25.1.2006, 22:06 |
| Похоже на рекурсию: при изменении текста срабатывает OnTextChanged, в котором присваивается значение свойству Digit; в set-е этого свойства устанавливается новое значение у textBox1.Text, что опять приводит к вызову OnTextChanged - и так далее по кругу, до переполнения стека... Проверь, не валится ли какое-нибудь исключение в отладке. |
| Автор: Ch0bits 25.1.2006, 22:49 |
| mr.DUDA Если бы была рекурсия, то GUI бы заметно подвисал и загрузке проца, но такого не происходит. Под отладкой: OnTextChange срабатывает только если текст изменился, т.е. если текст меняется на тот же самый OnTextChange не срабатывает. |
| Автор: mr.DUDA 26.1.2006, 13:22 | ||||
| Во-первых, все свойства, которые видны в дизайнере, должны проверять режим, в котором находится контрол: в DesignMode или нет. Иначе будут непонятные глюки при работе в дизайн-тайме Во-вторых, текст в текстбоксе вначале всегда "0", даже если поставить в дизайнере Digit в другое значение. Это просходит потому, что порядок инициализации компонентов следующий: 1) InitializeComponent() у SpinEdit, с установкой дефолтных значений MinDigit = MaxDigit = Digit = 0 2) InitializeComponent() у формы, присвоение свойств spinEdit1:
Как видно, сначала присваивается Digit, и срабатывает ограничение на макс. значение, т.к. MaxDigit всё ещё не проинициализирован и равен 0. В итоге имеем Digit=0. Чтобы этого не происходило, можно поддержать в своём контроле интерфейс ISupportInitialize, и в методах BeginInit / EndInit устанавливать и сбрасывать некий флаг, который использовать вместе с DesignMode. При добавлении SpinEdit на форму, в коде InitializeComponent формы будут автоматически добавлены вызовы BeginInit вначале и EndInit в конце. Вот код, который получился в результате:
|