Путешествуя по контролам

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

Путешествуя по контролам

Сообщение Sun07 » 24.03.2006 (Пт) 17:21

Подскажите лучший способ передачи фокуса на контрол с tabindex меньше или больше на 1 от активного. Хотя у меня в проге при удалении контролов остаются разрывы между tabindex больше 1 :) Нужна навигация по контролам textbox и др. с помощью клавиш -стрелок.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 24.03.2006 (Пт) 17:27

Код: Выделить всё
function passfocus(optional direction as long=1) as boolean
on error goto errhdl
passfocus=true
for each ctl in controls
if ctl.tabindex=activecontrol.tabindex+direction then
ctl.setfocus
exit function
end if
next ctl
exit function
errhdl:
passfocus=false
end function




Вот так. Вернет true если смогла отдать фокус. Если указать direction =-1 то отдаст предыдущему. Можно, указать -2 или +3 и перескочить через несколько контролов :)

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 24.03.2006 (Пт) 17:49

А может быть такая ситуация, что ваша функция передает фокус контролу с TabIndex=2, а его не существует, а существуют только контролы с TabIndex=1 и TabIndex=3, которому и надо передать фокус? Неужели нет функции или метода для определения или передачи фокуса следующему (предыдущему) контролу? Неужели надо всех перебирать в цикле?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 25.03.2006 (Сб) 7:12

его не может не существовать. При удалении элемента, меняются TabIndex'ы у оставшихся элементов
Весь мир матрица, а мы в нем потоки байтов!

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 25.03.2006 (Сб) 16:54

При удалении элемента, меняются TabIndex'ы у оставшихся элементов

Че-то ни разу не замечал... Не проще ли в цикле с опцие On Error Resume Next перебирать?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 27.03.2006 (Пн) 10:07

Sun07

Это легко можно сделать на основе моей функции.

Она возвращает False если не смогла отдать фокус. Почему бы это не проверить и не вызвать ее еще разок? :)

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

Сообщение alibek » 27.03.2006 (Пн) 10:19

Функция с багом.
Если в коллекции контролов встретится, например, Label или Menu, то она вернет False еще до того, как дойдет до контрола с нужным TabIndex.
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 27.03.2006 (Пн) 10:57

Неа. Там не такой foreach :)

Она просто ищет нужный tabid. А потом пытается, дать элементу фокус.

Если такого элемента нет, или элемент фокус принять не может - функция, просто вернет False и все.

Код: Выделить всё
function passfocus(optional direction as long=1) as long
on error resume next
passfocus=0
for each ctl in controls
if ctl.tabindex=activecontrol.tabindex+direction then
ctl.setfocus
if err.number=438 then passfocus=-1
exit function
end if
next ctl
errhdl:
passfocus=-2
end function




Вот теперь она вернет:

0 если все окей;

-1 если элемент не принял фокус;

-2 если элемента просто нет.

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

Re: Путешествуя по контролам

Сообщение Andrey Fedorov » 27.03.2006 (Пн) 16:27

Sun07 писал(а):Подскажите лучший способ передачи фокуса на контрол с tabindex меньше или больше на 1 от активного. Хотя у меня в проге при удалении контролов остаются разрывы между tabindex больше 1 :) Нужна навигация по контролам textbox и др. с помощью клавиш -стрелок.


Нафиг думать.
Просто подменяй в KeyPress стрелки на vbKeyTab...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 27.03.2006 (Пн) 16:31

Andrey Fedorov

Вот именно, что думать то нафиг.

А если мне надо в edit box текстан поправить? Тоже отправишь меня, по контролам прыгать?

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

Сообщение Andrey Fedorov » 27.03.2006 (Пн) 16:35

RayShade писал(а):Andrey Fedorov
Вот именно, что думать то нафиг.
А если мне надо в edit box текстан поправить? Тоже отправишь меня, по контролам прыгать?


Вообще-то думать надо перед тем как это в принципе делать.
Но если задание ставится как в самом начале, то и имеем:

Код: Выделить всё
Private Sub tx_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case vbKeyUp
            KeyCode = 0
            SendKeys "+{TAB}"
        Case vbKeyDown
            KeyCode = 0
            SendKeys "{TAB}"
    End Select
End Sub


P.S Человек пытается сделать а-ля DOS.
IMHO - не стоит...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 28.03.2006 (Вт) 12:22

Спасибо за отклики. Хотел сделать перемещение по контролам с помощью клавиш-стрелок, но благодаря наличию у меня таких контролов как текстбокс с мультистроками, комбобоксов, где стрелки используются для перемещения или выбора значения, идея встала под сомнение. Если как-то(?) отключить реакцию указанных контролов на клавиши стрелки, потеряю перемещение в мультитекстбоксе и выбор значений комбобоксов с помощью клавиатуры, что не представляется разумным. Мало кто из юзеров знает про перемещение с помощью TAB и Shift+TAB, обычно используют стрелки. А так как перемещение надо в режиме редактирования значений контролов, то имею вот такую беду. А как бы было красиво бегать стрелками и быстро редактировать! Единственным выходом вижу прямо указать юзеру про навигацию по TAB и Shift+TAB в лейбеле :)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 29.03.2006 (Ср) 11:11

Что ж это за пользователи такие, что не знают про навигацию при помощи TAB и Shift+TAB?
Весь мир матрица, а мы в нем потоки байтов!

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 29.03.2006 (Ср) 12:29

обычные пользователи, которые используют компьютер, как развлечение, которых большинство.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 01.04.2006 (Сб) 19:47

!Viper! писал(а):Что ж это за пользователи такие, что не знают про навигацию при помощи TAB и Shift+TAB?
Это ты наверное мой прикол про звездочки не знаешь... Пользователи бывают ОЧЕНЬ разные :mrgreen:
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!


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

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

Сейчас этот форум просматривают: SemrushBot и гости: 33

    TopList