Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перемещение между Text с помощью стрелок  (Прочитано 16168 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Доцент
Участник

ru
Offline Offline

« : 05-10-2009 15:17 » 

Подскажите, кто с этим сталкивался:

У меня на форме несколько объектов типа "Text", каким образом можно перемещать фокус курсора между ними с помощью стрелок клавиатуры. Вполне будет достаточно перемещения "вверх" и "вниз". Если возможно, приведите пример кода для трех-четырех таких объектов.
« Последнее редактирование: 05-10-2009 15:23 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-10-2009 02:37 » 

за VB пример не покажу, но суть должна быть в том, что надо перехватить события клавиш и подменить сообщение:
1) "вверх" - на "shift+tab"
2) "вниз" - на "tab"

тогда всё произойдёт автоматически
Записан

Доцент
Участник

ru
Offline Offline

« Ответ #2 : 06-10-2009 04:53 » 

спасибо. попробую.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 06-10-2009 05:07 » 

даже гоню: если прыгать надо между конкретными окошками, то : ловим клавишу, определяем на каком окошке фокус, потом в зависимости от ситуации ставим фокус на другое окошко Улыбаюсь
Записан

Доцент
Участник

ru
Offline Offline

« Ответ #4 : 06-10-2009 18:30 » 

вариант 1 - для пробы эмитацию нажатия клавишь я поместил в timer, работает нормально.
            но когда идет перехват нажатия стрелок с последующей эмитацией нажатых клавишь,
            происходит станная штука - фокус переходит произвольно по объектам.
вариант 2 - если много объектов, скажет 20 и более, получается слишком большой код.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 07-10-2009 02:44 » 

Цитата
вариант 2 - если много объектов, скажет 20 и более, получается слишком большой код.
тут нужем массив с элементами. Либо с их ID, либо с указателями на контролы(насчёт последних в VB не знаю)
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #6 : 07-10-2009 04:35 » 

Подскажите, кто с этим сталкивался:

У меня на форме несколько объектов типа "Text", каким образом можно перемещать фокус курсора между ними с помощью стрелок клавиатуры. Вполне будет достаточно перемещения "вверх" и "вниз". Если возможно, приведите пример кода для трех-четырех таких объектов.

если только вверх и вниз и элементы находятся друг под другом, то ничего вообще не надо писать, ВАСИК всё сделает сам
чтобы переход можно было осуществлять и в сторону и не писать громоздкий код, то лучше, ИМХО, элементы объединить в массив элементов
(св-во Index вроде) и для всех достаточно будет написать один обработчик в котором и отслеживать нажатие клавиш и делать нужное действие

Цитата: Доцент
но когда идет перехват нажатия стрелок с последующей эмитацией нажатых клавишь,
 происходит станная штука - фокус переходит произвольно по объектам.

надо просто запретить этим элементам переход по Tab (св-во Tabstop установить в FALSE)
Записан

I Have Nine Lives You Have One Only
THINK!
Доцент
Участник

ru
Offline Offline

« Ответ #7 : 07-10-2009 07:26 » 

программа уже написана. сейчас я хочу ее просто доработать. создавать массивы не хотелось бы.
А если установить False по TAB, то как фокус будет передаваться этим объектам? С эмитацией нажатия TAB фокус переходит с первого на третитй и д.т., кроме того он двигается и в обратном направлении. А если эмитировать нажатие Shift+Tab то происходит странная штука - выделение содержимого объекта и случайная передача фокуса как "вниз", так и "вверх".
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #8 : 07-10-2009 08:37 » 

массив контролов создается очень просто
всем однотипным (в данном случае текстбоксам) элементам присваивается одно имя, изменяя у них св-во index

если есть и другие элементы, которым нужно передавать фокус по ТАБ, то
создайте массив элементов
для все элементов создайте один обработчик KeyUp в котором выставляйте фокус нужному элементу
примерно так


Код:
Private Sub Text1_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = ... Then 'нажата клавиша ВВЕРХ
  NewIndex = Index + 1 'вычисляется следующий по индексу TextBox
  On Error Resume Next 'если достигнут последний индекс, это позволит избежать ошибки
  Text1(NewIndex).SetFocus 'операция получения ввода следующего ТекстБокса
ELSE
  ...
End If
End Sub
Записан

I Have Nine Lives You Have One Only
THINK!
Доцент
Участник

ru
Offline Offline

« Ответ #9 : 07-10-2009 15:21 » 

программа уже есть и работает, в ней сотни обращений к text-боксам, поэтому делать массив и переименовывать в тексте все text не имеет никакого смысла. если писать программу заново, тогда согласен по поводу массива.
чтобы не быть голословным приведе пример кода, может я что-то упустил. на форме для примера разместил 10 text-боксов (без массива) и две обычные кнопки (если заработат, стрелки поставить не проблема):
Private Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const KEYEVENTF_KEYUP = &H2 ‘отпустить кнопку
Const VK_TAB = &H9
Const VK_SHIFT = &H10
'нажимаем кнопку TAB
Private Sub ShowStartMenu1()
Call keybd_event(VK_TAB, 0, 0, 0) 'нажимаем TAB
Call keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0) 'отпускаем TAB
End Sub
'нажимаем кнопки TAB+SHIFT
Private Sub ShowStartMenu2()
Call keybd_event(VK_SHIFT, 0, 0, 0) 'нажимаем SHIFT
Call keybd_event(VK_TAB, 0, 0, 0) 'нажимаем TAB
Call keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0) 'отпускаем TAB
Call keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0) 'отпускаем SHIFT
End Sub
Private Sub Command1_Click() 'вниз
ShowStartMenu1
End Sub
Private Sub Command2_Click() 'вверх
ShowStartMenu2
End Sub
Записан
Доцент
Участник

ru
Offline Offline

« Ответ #10 : 07-10-2009 19:21 » 

придется воспользоваться массивом, муторно, но деваться не куда. спасибо HandKot!
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #11 : 08-10-2009 04:37 » 

программа уже есть и работает, в ней сотни обращений к text-боксам, поэтому делать массив и переименовывать в тексте все text не имеет никакого смысла. если писать программу заново, тогда согласен по поводу массива.
чтобы не быть голословным приведе пример кода, может я что-то упустил. на форме для примера разместил 10 text-боксов (без массива) и две обычные кнопки (если заработат, стрелки поставить не проблема):
Private Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const KEYEVENTF_KEYUP = &H2 ‘отпустить кнопку
Const VK_TAB = &H9
Const VK_SHIFT = &H10
'нажимаем кнопку TAB
Private Sub ShowStartMenu1()
Call keybd_event(VK_TAB, 0, 0, 0) 'нажимаем TAB
Call keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0) 'отпускаем TAB
End Sub
'нажимаем кнопки TAB+SHIFT
Private Sub ShowStartMenu2()
Call keybd_event(VK_SHIFT, 0, 0, 0) 'нажимаем SHIFT
Call keybd_event(VK_TAB, 0, 0, 0) 'нажимаем TAB
Call keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0) 'отпускаем TAB
Call keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0) 'отпускаем SHIFT
End Sub
Private Sub Command1_Click() 'вниз
ShowStartMenu1
End Sub
Private Sub Command2_Click() 'вверх
ShowStartMenu2
End Sub


ну скорее всего надо так (хотя с АПИ не дружу)

Код:
Private Declare Sub MapVirtualKey Lib "user32" (ByVal uCode As Byte, ByVal uMapType As Byte)
...
'нажимаем кнопки TAB+SHIFT
Private Sub ShowStartMenu2()
    Call keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), 0, 0) 'нажимаем SHIFT
    Call keybd_event(VK_TAB, 0, 0, 0) 'нажимаем TAB
    Call keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0) 'отпускаем TAB
    Call keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_KEYUP, 0) 'отпускаем SHIFT
End Sub

только этот код работать не будет, точнее будет, но не как Вы ожидаете
перемещение будет между всеми элементами, а не только текстбоксами, в соответствии с их TabOrder
Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 08-10-2009 05:19 » 

Доцент, да почему ты считаешь массивы муторными то ? )) Эхъ, васиковая душа...
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #13 : 08-10-2009 08:13 » 

Доцент, да почему ты считаешь массивы муторными то ? )) Эхъ, васиковая душа...

наверное, имелось в виду, муторно переделывать.
хотя использовать меню replace  никто не запрещал
Записан

I Have Nine Lives You Have One Only
THINK!
Доцент
Участник

ru
Offline Offline

« Ответ #14 : 09-10-2009 20:16 » 

имено переделывать муторно, а работь с массивом нормально.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines