ADN Club > Inventor API
KeyboardEvents.OnKeyPress Event
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 не работал...)
Навигация
Перейти к полной версии