ADN Club > Inventor API

KeyboardEvents.OnKeyPress Event

(1/4) > >>

R.I.Chernov:
Доброго времени суток, уважаемые форумчане. Помогите пожалуйста разобраться, как  программно выполнить какое-нибудь действие, при нажатии на какую-нибудь клавишу клавиатуры. Например как сделать так, чтобы при нажатии "Esc" закрывалась открытая ранее форма. Сам разобраться с синтаксисом не смог :(

Виктор Чекалин:
R.I.Chernov,
попробую ответить. Хоть я ни разу с Inventor API не работал, но вопрос по сути общего характера.
Речь идет о VBA или VB.NET? В любом случае, нужно подписаться на событие KeyPress. В обработчике события, одним из параметров будет нажатая клавиши. Нужно сверить нажатую клавишу с Esc и если условие выполняется, закрыть форму.
На VBA это будет выглядеть вот так:

--- Код - Visual Basic [Выбрать] ---Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)    If (KeyAscii = 27) Then        Me.Hide    End IfEnd SubНа VB.NET:

--- Код - vb.net [Выбрать] ---    Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress        If (e.KeyChar = Chr(27)) Then            Close()        End If    End Sub
Не трудно заметить, что в данном случае необходимо использования числового кода клавиши Esc, что не слишком явно, так как число 27 нужно еще как-то получить.
Поэтому конкретно для описанного варианта лушче использовать событие KeyDown или KeyUp возникающее при нажатии клавиши или при отпускании соответственно.
В параметрах этих событий, нужно использовать уже не числовой код, а предопределенный.
VBA:

--- Код - Visual Basic [Выбрать] ---Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)    If (KeyCode = KeyCodeConstants.vbKeyEscape) Then        Me.Hide    End IfEnd Sub
VB.NET:

--- Код - vb.net [Выбрать] ---    Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown        If e.KeyCode = Keys.Escape Then            Close()        End If    End Sub
В VB.NET есть еще один, более элегантный способ закрытия формы по Esc. Если все же используется он, то опишу в другом сообщении.

R.I.Chernov:
Спасибо, Виктор! Код  работает (по крайней мере для VBA :) ).
Если этот топик вдруг читают такие же "высококвалифицированные" программисты как я, то стоит пояснить,  что
--- Код: ---Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
--- Конец кода ---
это событие,и его надо поместить в код формы :)

Но если честно, то, помимо помощи в решении, вы создали в моей голове огромную кучу вопросов и ощущение еще большего непонимание этой темы :)
Попробую сформулировать некоторые из них:
1. в справке VBA в инвентор написано:
   
--- Код: ---Private Sub object_KeyDown( ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As fmShiftState)
--- Конец кода ---
Почему в вашем примере "ByVal Shift As Integer" работает, а "ByVal Shift As fmShiftState" из справки нет?

2. Как использовать событие инвентора: KeyboardEvents.OnKeyPress Event?
Я вроде бы понял, как можно до него "добраться":
 
--- Код - Visual Basic [Выбрать] ---Dim KeyEvent As KeyboardEventsSet KeyEvent = ThisApplication.CommandManager.CreateInteractionEvents.KeyboardEventsНо как ни пыхтел, я так и не смог понять, что делать дальше, чтобы вернуть какую либо переменную и воспользоваться ее значением для создания условия. В примерах справки, к сожалению, аналога нет :(

Буду очень признателен за любую помошь!

R.I.Chernov:
У меня появился еще один вопрос... Виктор, Ваш код работает у меня при пустой форме (нет ни текстбоксов, ни кнопок и т.п.), если поместить в форму хотя бы один текст бокс, то при загрузке формы он становится активным, и нажатие клавиши "Esc" внутри него приводит к удалению значения внутри текст бокса, но не к активации события. Не могли бы вы подсказать, как я могу сделать текстбоксы неактивными, например при нажатии на форму, ну или еще как-нибудь, в общем как сделать так, чтобы код работал? :)

Виктор Чекалин:
R.I.Chernov, быстрое гугление показало, что единственный способ, это подписаться на событие KeyPress для каждого контрола на форме.
Т.е. помимо
--- Код - Visual Basic [Выбрать] ---Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)    If (KeyAscii = 27) Then        Me.Hide    End IfEnd Sub вам еще понадобиться обработка события нажатия клавиши в текстовом поле.

--- Код - Visual Basic [Выбрать] ---Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)    If (KeyAscii = 27) Then        Me.Hide    End IfEnd SubИ так для каждого контрола, который может иметь фокус на форме.

Возможно есть какое-то более изящное решение, но с VBA я уже лет 8 не работал...)

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии