Переход между TextBox с MaxLength>0

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Переход между TextBox с MaxLength>0

Сообщение Денис » 26.06.2008 (Чт) 12:36

Пишу утилиту, в которой есть поля для ввода IP. Для собственного удобства сделал эти поля масивами TextBox (1 to 4) переходы удобные по Tab, выставил им свойство MaxLength = 3. Но теперь возникла проблема, как сделать, чтобы при наборе трех символов, фокус переходил к следующему октету (текстбоксу) :?:
_________
Поиск юзал. Ничего не нашел.
И еще вопрос: в оригинальных контролах, в которых вводится IP-адрес, можно перемещаться между октетами не только Tab'ом, но и стрелками. Как можно это реализовать? Например, как узнать, что курсор стоит в конце текста/в начале текста?
_______________
Сейчас попробовал MaskEdit и сделал вывод, что он не подойдет. По многим причинам. Во-первых это OCX, а утилита пишется "дискеточная", во вторых слишком замороченно придется реализовывать проверку диапазона 0-255. В третьих у меня при помощи GotFocus/LostFocus реализована довольно симпатичная подсветка, которую в MaskEdit тоже не реализуешь. И еще - в маске, как я понимаю фиксированное число знаков, придется записывать адреса примерно так 192.168.001.001
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сообщение Demonx » 26.06.2008 (Чт) 13:45

Отлавливай события клавиш в текстбоксе и делай нужные действия... :roll:

Например отлавливай tab и делай следующему текстбоксу фокус
Изображение

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 26.06.2008 (Чт) 13:54

Demonx
Зачем отлавливать Tab если по нему и так нормально переходит?
Мне нужно знать, когда курсор в TextBox'e стоит в конце или начале текста. Тогда можно "отлавливать" нажатие стрелок враво-влево и менять фокус.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.06.2008 (Чт) 14:08

1. MaxLength=4
2. В событии Change проверять значение. Если не число, либо меньше 0, либо больше 255, то выделить весь текст.
3. Если в KeyPress нажата точка, то проверить п.2, если проверка пройдена, то на следующий текстбокс.
4. Если в KeyPress нажата цифра, то запомнить код символа в переменной, включить флаг. В Change при включенном флаге проверять значение и длину, если введено три символа, перейти в следующий текстбокс.

Но еще лучше сделать UserControl.

А еще лучше создать окно с классом SysIPAddress32 и прикрутить к нему WindowProc.
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 26.06.2008 (Чт) 14:23

alibek
Сейчас буду копать в сторону SysIPAddress32. Это самое реальное. Родной контрол винды. 8)
_____________
...А если решать без API, то позиция курсора записывается в SelStart, таким образом: при нажатии стрелки влево проверяем SelStart=0 и если да, то переходим на предыдущий контрол, и также при нажатии стрелки вправо проверяем SelStart=3 (не 2!) и если да, то переходим на следующий контрол.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 26.06.2008 (Чт) 19:17

Господа, не лезьте в дебри!
Нужно просто в реакции на нажатие клавиш (любых) в TextBox'е выполнять проверку позиции курсора в нем. Или, что там еще нужно проверять?
Знание английского языка - затрудняет понимание кода

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 27.06.2008 (Пт) 9:06

Zenitchik, вот что у меня
Для каждого текстбокса есть события
    Change - проверка позиции курсора и автопереход к следующему/предыдущему
    GotFocus - фон серый, текст выделен
    LostFocus - фон белый
    KeyUp - проверка нажатия клавиш и переходы влево/вправо
    Validate - проверка диапазона 0-255

При переходе по стрелкам не выполняется событие Validate и его приходится вызывать дополнительно.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 27.06.2008 (Пт) 11:41

Не понял суть.
Вы вводите IP?
Значит, по событию KeyUp, в зависимости, от того, что, собственно, нажато, нужно:
если цифра - проверять значение и, возможно, удалять последний символ, кроме того, проверять позицию курсора и, возможно, переходить к следующему полю;
если стрелка - проверять позицию крусора и, возможно, переходить к следующему полю;
если точка - переходить к следующему полю;
если посторонний символ - удалять последний символ.
Знание английского языка - затрудняет понимание кода

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.06.2008 (Пт) 11:50

А кто мне объяснит, почему KeyUp?
Lasciate ogni speranza, voi ch'entrate.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 27.06.2008 (Пт) 12:08

Х.З. Традиция. Наверно, потому же, почему MouseUp.
Знание английского языка - затрудняет понимание кода

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.06.2008 (Пт) 12:26

Я имею ввиду, почему не KeyDown?
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 27.06.2008 (Пт) 13:57

alibek
KeyDown слишком быстр. Получается - я нажимаю клавишу стрелку, а курсор уже в конце последнего октета...
Zenitchik
Мне не надо удалять посторонние символы ибо при загрузке формы всем октетам сообщается ES_NUMBER
Так же не нужно удалять лишние символы, потому что (в сабже указано) MaxLength фиксирован и равен 3. При потере фокуса вызывается _validate где дополнительно проверяется соответствие интервалу 0-255
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.06.2008 (Пт) 14:05

Значит делаешь что-то неправильно.
Для обработки нажатий на клавиши надо использовать KeyDown.
Lasciate ogni speranza, voi ch'entrate.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 27.06.2008 (Пт) 21:53

Денис
Ну, вот и прекрасно. Удалите из моего алгоритма лишнее и всего делов.
Только проверку значений нужно производить ДО потери фокуса, при вводе каждой цифры.
А я просто предложил как свести все к одной процедуре (если у вас массив контролов).

alibek
почему не KeyDown?

Привычка. Железная логика, что KeyUp обязательно произойдет вслед за KeyDown (если, конечно между ними не выполнится какая-нибудь бажная процедура, чего в конечном варианте быть не должно)
А почему KeyDown?
Знание английского языка - затрудняет понимание кода

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 30.06.2008 (Пн) 7:21

Спасибо, короче, за советы. Все работает.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 30.06.2008 (Пн) 20:03

Денис
Покажи код, если не секрет, конечно.
Интересно, что получилось.
Знание английского языка - затрудняет понимание кода

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.07.2008 (Вт) 7:20

Zenitchik писал(а):Железная логика, что KeyUp обязательно произойдет вслед за KeyDown (если, конечно между ними не выполнится какая-нибудь бажная процедура, чего в конечном варианте быть не должно)
А почему KeyDown?

Порочная логика.
В обработчиках KeyUp и KeyDown сделай вывод в Debug, затем запусти программу, нажми кнопку и подержи ее.
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 01.07.2008 (Вт) 7:53

А нечего там показывать. Надо было показать человеку, как перебрать IP-адреса. Я порекомендовал через переобразование в hex. И даже наклепал код для примера. А сейчас вот взял и оформил его в полноценную утилиту. :roll: Бесполезную утилиту.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50

    TopList