Нужна помощь...

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

Нужна помощь...

Сообщение АндрейБ » 30.01.2005 (Вс) 22:17

Есть форма.
В ней 3 кнопки, 3 поля, 2 флажка.
По табуляции я установил перевод между 1 кнопкой и 3 полями и 2 флажками. Кроме того я прописал код на каждый этот элемент перевод в том же порядке как при при табуляции, после нажатия ЕНТЕР.
Но есть загвоздка. Когда я нахожусь на кнопке (которая учавствует в переходе) и решил нажать на ней не Ентер и не Таб, а клавишу ВВЕРХ, ВЛЕВО, ВНИЗ, ВПРАВО (те что на клаве обычно крестиком), то происходит переход поочередно между этой клавшей и еще одной, которая не должна участвовать в переходе (переход только между ними двумя).
Хочется что бы такого не было. Просто та клавиша должна быть доступка только через мышь. ЕСТЕТИКА ПОНИМАЕШЬ М.Е.
Помогите сделать, что бы не было этого дурачкого перехода!
:twisted:
Кто ищет, тот всегда найдет ...

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 30.01.2005 (Вс) 23:22

При нажатии клавиш со стрелками на CommandButton не возникает событие KeyDown. Воспользуйся этим. Например, добавь переменную

Dim Foc As Boolean

На всех клавишах (кроме стрелок) она будет принимать True.
Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer)
Foc = True
End Sub

А теперь на кнопке с запрещенным переходом
Private Sub Command2_GotFocus()
If Not Foc Then Command1.SetFocus ' вертаем прицел назад
End Sub

Остается только в нужный момент сбрасывать Foc в False

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Сообщение АндрейБ » 31.01.2005 (Пн) 10:46

Я уже понял что события КеуPress не возникает. Я сразу хотел перехватывать нажатие этих клавиш. Но облом.
Спасибо за совет - попробую, я бы долго не додумался.
Кто ищет, тот всегда найдет ...

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Сообщение АндрейБ » 31.01.2005 (Пн) 12:20

Вроде все ок, да не тут то было.
Загвоздка здесь:
Остается только в нужный момент сбрасывать Foc в False :D

Как здесь распознать, что переход идет с помощью мыши, а не с помощью этих клавиш. А то получается если я находясь на кливише, решил перейти с помощью мыши на непереходную клавишу, меня автоматом перебрасывает обратно.
Так уже лучше, но все равно не совсем правильно. У меня эт оприложение для конечного пользователя, и если будут такие гвозди, он может осерчать на меня :D
Помогите...
Кто ищет, тот всегда найдет ...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 31.01.2005 (Пн) 12:53

может TabStop ?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Сообщение АндрейБ » 31.01.2005 (Пн) 12:59

ТабСтоп - это уже я писал что все равно переходит при нажатии этих клавиш. Читай текст!
Почему то у элемена COMMAND - нажатия этих клавиш вызывает свой порядок перехода? А перехватить через KeyPress не получается.
Помогите справиться с этой проблемой.
Что никто никогда не сталкивался с этим?
:?
Кто ищет, тот всегда найдет ...

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

Сообщение alibek » 31.01.2005 (Пн) 13:02

Поставь на форме KeyPreview и обрабатывай нажатия кнопок в Form_KeyDown.
Lasciate ogni speranza, voi ch'entrate.

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Сообщение АндрейБ » 31.01.2005 (Пн) 13:39

Поставил.
Но как обрабатывать нажатие клавиш (ВВЕРХ, ВНИЗ, ВЛЕВО, ВПРАВО)?
Я ставлю KeyAscii, что бы уловить код этих клавиш, но это бесполезно, т.к. событие КуеDown при надатии этих клавиш не просиходит! Смотрите переписку!!!
:?
Кто-нибудь может разобраться в этом?
Кто ищет, тот всегда найдет ...

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

Сообщение alibek » 31.01.2005 (Пн) 14:59

Хм... И правда.
Ну тогда GetKeyState.
Lasciate ogni speranza, voi ch'entrate.

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Сообщение АндрейБ » 31.01.2005 (Пн) 15:17

Что такое GetKeyState?
Можешь написать поподробнне, я не такой асс, только недавно стал писать на VB, до этого долго ковырял Access.
Напиши пример...
Кто ищет, тот всегда найдет ...

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

Сообщение alibek » 31.01.2005 (Пн) 15:25

API-Guide; Key Spy писал(а):
Код: Выделить всё
'In a module
Public Const DT_CENTER = &H1
Public Const DT_WORDBREAK = &H10
Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Declare Function DrawTextEx Lib "user32" Alias "DrawTextExA" (ByVal hDC As Long, ByVal lpsz As String, ByVal n As Long, lpRect As RECT, ByVal un As Long, ByVal lpDrawTextParams As Any) As Long
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Global Cnt As Long, sSave As String, sOld As String, Ret As String
Dim Tel As Long
Function GetPressedKey() As String
    For Cnt = 32 To 128
        'Get the keystate of a specified key
        If GetAsyncKeyState(Cnt) <> 0 Then
            GetPressedKey = Chr$(Cnt)
            Exit For
        End If
    Next Cnt
End Function
Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
    Ret = GetPressedKey
    If Ret <> sOld Then
        sOld = Ret
        sSave = sSave + sOld
    End If
End Sub

'In a form
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Me.Caption = "Key Spy"
    'Create an API-timer
    SetTimer Me.hwnd, 0, 1, AddressOf TimerProc
End Sub
Private Sub Form_Paint()
    Dim R As RECT
    Const mStr = "Start this project, go to another application, type something, switch back to this application and unload the form. If you unload the form, a messagebox with all the typed keys will be shown."
    'Clear the form
    Me.Cls
    'API uses pixels
    Me.ScaleMode = vbPixels
    'Set the rectangle's values
    SetRect R, 0, 0, Me.ScaleWidth, Me.ScaleHeight
    'Draw the text on the form
    DrawTextEx Me.hDC, mStr, Len(mStr), R, DT_WORDBREAK Or DT_CENTER, ByVal 0&
End Sub
Private Sub Form_Resize()
    Form_Paint
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'Kill our API-timer
    KillTimer Me.hwnd, 0
    'Show all the typed keys
    MsgBox sSave
End Sub


API-Guide; Keyboard Animation писал(а):
Код: Выделить всё
Const VK_CAPITAL = &H14
Const VK_NUMLOCK = &H90
Const VK_SCROLL = &H91
Const VK_USED = VK_SCROLL
Private Type KeyboardBytes
     kbByte(0 To 255) As Byte
End Type
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Long
Private Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
Private Declare Function SetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim kbArray As KeyboardBytes, CapsLock As Boolean, kbOld As KeyboardBytes
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'Get the current keyboardstate
    GetKeyboardState kbOld
    'Hide the form
    Me.Hide
    MsgBox "Keep your eyes on the little num-, shift- and scrolllock lights on the keyboard."
    TurnOff VK_CAPITAL
    TurnOff VK_NUMLOCK
    TurnOff VK_SCROLL
    Sleep 1000
    TurnOn VK_NUMLOCK
    Sleep 100
    TurnOn VK_CAPITAL
    Sleep 100
    TurnOn VK_SCROLL
    Sleep 300
    TurnOff VK_NUMLOCK
    Sleep 100
    TurnOff VK_CAPITAL
    Sleep 100
    TurnOff VK_SCROLL
    Sleep 500
    TurnOn VK_NUMLOCK
    TurnOn VK_SCROLL
    Sleep 200
    TurnOff VK_NUMLOCK
    TurnOff VK_SCROLL
    Sleep 200
    TurnOn VK_NUMLOCK
    TurnOn VK_SCROLL
    Sleep 200
    TurnOff VK_NUMLOCK
    TurnOff VK_SCROLL
    Sleep 200
    TurnOn VK_CAPITAL
    Sleep 200
    TurnOff VK_CAPITAL
    Sleep 200
    TurnOn VK_CAPITAL
    Sleep 200
    TurnOff VK_CAPITAL
    Sleep 200
    TurnOn VK_NUMLOCK
    TurnOn VK_SCROLL
    Sleep 200
    TurnOff VK_NUMLOCK
    TurnOff VK_SCROLL
    Sleep 200
    TurnOn VK_NUMLOCK
    TurnOn VK_SCROLL
    Sleep 200
    TurnOff VK_NUMLOCK
    TurnOff VK_SCROLL
    Sleep 200
    TurnOn VK_CAPITAL
    Sleep 400
    TurnOff VK_CAPITAL
    Sleep 200
    TurnOn VK_NUMLOCK
    Sleep 100
    TurnOn VK_CAPITAL
    Sleep 100
    TurnOn VK_SCROLL
    Sleep 300
    TurnOff VK_SCROLL
    Sleep 100
    TurnOff VK_CAPITAL
    Sleep 100
    TurnOff VK_NUMLOCK
    Sleep 1000
    Unload Me
End Sub
Private Sub TurnOn(vkKey As Long)
    'Get the keyboard state
    GetKeyboardState kbArray
    'Change a key
    kbArray.kbByte(vkKey) = 1
    'Set the keyboard state
    SetKeyboardState kbArray
End Sub
Private Sub TurnOff(vkKey As Long)
    'Get the keyboard state
    GetKeyboardState kbArray
    'change a key
    kbArray.kbByte(vkKey) = 0
    'set the keyboard state
    SetKeyboardState kbArray
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'restore the old keyboard state
    SetKeyboardState kbOld
End Sub
Lasciate ogni speranza, voi ch'entrate.

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Сообщение АндрейБ » 31.01.2005 (Пн) 17:52

Ясно. Код не малый и все ради того что бы одну клавишу поймать!
Будем думать, либо воспользуюсь твоим супер кодом.
:D
Кто ищет, тот всегда найдет ...

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 31.01.2005 (Пн) 18:56

Установи на чистую форму три кнопки и попробуй так:
Код: Выделить всё
Dim Foc1 As Boolean
Dim Foc2 As Boolean
Dim Foc3 As Boolean

Private Sub Form_Load()
Command1_Click
End Sub

Private Sub Command1_Click()
    Foc1 = True
    Foc2 = False
    Foc3 = False
End Sub

Private Sub Command2_Click()
    Foc1 = False
    Foc2 = True
    Foc3 = False
End Sub

Private Sub Command3_Click()
    Foc1 = False
    Foc2 = False
    Foc3 = True
End Sub

Private Sub Command1_GotFocus()
    If Not Foc1 Then Command3.SetFocus
End Sub

Private Sub Command2_GotFocus()
    If Not Foc2 Then Command1.SetFocus
End Sub

Private Sub Command3_GotFocus()
    If Not Foc3 Then Command2.SetFocus
End Sub

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Foc1 = True
End Sub

Private Sub Command2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Foc2 = True
End Sub

Private Sub Command3_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Foc3 = True
End Sub


Недостаток кода - на ТАБ тоже не реагирует, токмо на мышь.

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Сообщение АндрейБ » 31.01.2005 (Пн) 21:26

Спасибо.
Идея ясна. Я думаю вопрос исчерпан.
:D
Кто ищет, тот всегда найдет ...

AstSV
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 14.01.2007 (Вс) 15:37

Re: Нужна помощь...

Сообщение AstSV » 20.07.2009 (Пн) 18:29

Столкнулся с такой же проблемой. Конечно, немного поздновато, :D но всё же...
Сделал так:
На форме Check1 и Text1
Код: Выделить всё
'
Option Explicit
'
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Long
'
Private Sub Check1_LostFocus()
    If GetAsyncKeyState(40) < 0 Then
        Text1.Text = "Вниз"
    ElseIf GetAsyncKeyState(39) < 0 Then
        Text1.Text = "Вправо"
    ElseIf GetAsyncKeyState(38) < 0 Then
        Text1.Text = "Вверх"
    ElseIf GetAsyncKeyState(37) < 0 Then
        Text1.Text = "Влево"
    End If
End Sub


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

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

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

    TopList