Навигация по форме стрелками

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jSergey
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 01.09.2005 (Чт) 6:34

Навигация по форме стрелками

Сообщение jSergey » 01.09.2005 (Чт) 6:37

На форме расположено множество коммандных кнопок (CommandButton) по
принципу матрицы. При навигации по кнопкам клавишами со стрелками
нажатие Right обрабатывается также как и Down, а Left - как Up.
А мне надо, чтобы, скажем, при нажатии клавиши Right активировалась
кнопка правее, а не внизу активной (имеющая следующее значение TabIndex).
Процедуры типа Form_KeyDown, Form_KeyPress, Command[i]_KeyDown,
Command[i]_KeyPress, API-функция GetAsyncKeyState не помогли.
Может кто подскажет как это сделать и возможно ли вообще такое сделать?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Навигация по форме стрелками

Сообщение Andrey Fedorov » 01.09.2005 (Чт) 7:50

jSergey писал(а):Может кто подскажет как это сделать и возможно ли вообще такое сделать?


Может немножко неожиданное решение - заменить всю эту кучк кнопок одним Grid-ом. Перемещение по его ячейкам так и работает. И отобразить кнопку в ячейке тоже проблем нет...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 01.09.2005 (Чт) 8:02

взято из моего проекта
я думаю разберешься
Код: Выделить всё

Private Sub txtKod_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)

Select Case KeyCode
Case vbKeyDown 'вниз
If Index = 33 Then Exit Sub
txtKod(Index + 1).SetFocus

Case vbKeyUp 'вверх
If Index = 0 Then Exit Sub
txtKod(Index - 1).SetFocus

Case vbKeyRight 'вправо
txtPartia(Index).SetFocus

Case vbKeyF11 '=предыдущему
If Index = 0 Then Exit Sub
txtKod(Index).Text = txtKod(Index - 1).Text
If Index = 33 Then Exit Sub
txtKod(Index + 1).SetFocus

Case vbKeySeparator 'вниз
If Index = 33 Then Exit Sub
txtKod(Index + 1).SetFocus

Case vbKeyReturn 'вниз
If Index = 33 Then Exit Sub
txtKod(Index + 1).SetFocus

Case vbKeyF12 'стереть
For v = Index To 33
txtKod(v).Text = ""
Next v

End Select

End Sub
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

jSergey
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 01.09.2005 (Чт) 6:34

Сообщение jSergey » 02.09.2005 (Пт) 7:08

lord0n писал(а):
Код: Выделить всё
взято из моего проекта
я думаю разберешься

Спасибо за ответ, но к сожалению, так работать не будет. Дело в том, что если
активирован элемент управления типа TextBox (как у тебя), то при нажатии
клавиш-стрелок процедура KeyDown вызывается, а если CommandButton (как у меня) -
то нет. Что интересно, в моем случае эта процедура вызывается, если клавиша-
стрелка нажимается при нажатой клавише-модификаторе (Ctrl, Shift или Alt),
при этом KeyCode равно VbKey нажатой клавиши-стрелки. Но такой способ навигации
по форме (нажимать помиммо Right или Left еще и клавишу-модификатор) меня не
устраивает. Спасибо Andrey Fedorov за предложение с Grid-ом. Пока еще не
пробовал, но обязательно попробую.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 02.09.2005 (Пт) 8:53

jSergey писал(а):Пока еще не пробовал, но обязательно попробую.


Это кстати, по собственному опыту - реализовать того-же минера (игрушка такая, входила в состав Windows) - можно без проблем на Grid-e. Таблицу символов (аналогичную Windows-ской) также делал на нем-же. Про различные календарики я уж не говорю...

Это все было от лени, ибо все это можно было и просто рисовать, но все-же так было чуть попроще...

P.S Я не имел в виду стандартный Grid (идущий в поставке VB) - с ним я ни разу не работал, к счастью...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.09.2005 (Пт) 11:18

jSergey писал(а):Спасибо за ответ, но к сожалению, так работать не будет. Дело в том, что если
активирован элемент управления типа TextBox (как у тебя), то при нажатии
клавиш-стрелок процедура KeyDown вызывается, а если CommandButton (как у меня) -
то нет.

Задай Form.KeyPreview = True - заработает.
Изображение

jSergey
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 01.09.2005 (Чт) 6:34

Сообщение jSergey » 03.09.2005 (Сб) 6:31

tyomitch писал(а):Задай Form.KeyPreview = True - заработает.


Пробовал и так, но у меня (Microsoft Visual Basic 6 SP 6) при
нажатии клавиш-стрелок функция Key_Down не вызывается
независимо от значения параметра Form.KeyPreview. Проблему,
обсуждаемую в этой теме, уже решил. С помощью API-процедуры
keybd_event при загрузке формы программно нажимаем Shift:
Call keybd_event(VK_SHIFT, 0, 0, 0)
а при выгрузке отпускаем:
Call keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)
Чтобы пользователь не мог выключить режим нажатого Shift
нажатиями физической клавиши Shift вешаем на форму таймер
с интервалом 1 мс и в его процедуру записываем:

Private Sub Timer1_Timer()
If GetAsyncKeyState(vbKeyShift) Then
Call keybd_event(VK_SHIFT, 0, 0, 0) 'Hажимаем Shift
End If
End Sub

Чтобы нормально можно было работать с клавишами-стрелками
на правой (цифровой) части клавиатуры аналогичным образом
при загрузке формы выключаю NumLock, с помощью таймера
делаю, чтобы пользователь не мог его включить. При выгрузке
формы Numlock включаю.

И все отлично работает!


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

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

Сейчас этот форум просматривают: Google-бот, SemrushBot, Yandex-бот и гости: 90

    TopList  
cron