Если вызвано из подчиненной формы, Screen.PreviousControl
возвращает имя субфома mainforms- control (так как mainform должна быть активной, чтобы активировать элемент управления подчиненной формы (вложенный в mainform)), а не подчиненную форму (но они могут иметь одно и то же имя, просто измените имя элемента управления, и вы не получите возвращенное имя подчиненной формы, а имя элемента подчиненной формы!).
Теперь, как получить предыдущий элемент управления подчиненной формы? По своему свойству .ActiveControl
, поскольку форма была активной ранее, ее активный элемент управления должен быть предыдущим элементом управления. (если вы хотите получить предыдущий элемент управления, когда вы остаетесь в той же подчиненной форме, вам необходимо сохранить ее в переменной модуля)
Поскольку внутри подчиненных форм может быть несколько подчиненных форм, мы просто l oop, в то время как элемент управления является подчиненной и устанавливает его до следующей подчиненной формы .ActiveControl
до завершения.
Зачем беспокоиться об именах, если вы можете использовать ссылки? Это позволяет использовать несколько экземпляров формы. Просто сохраните ссылку на элемент управления в Form_Activate и используйте ее в MouseUp
:
'On top of forms code module
Option Explicit
Private PreviousFormControl As Access.Control
Private Sub Form_Activate()
On Error Resume Next ' ignore error if no previous control availible
Set PreviousFormControl = Application.Screen.PreviousControl ' this stores the reference not the name!
If Err.Number <> 0 Then
'Handle error here, e.g. disable controls, show msg, ...
End If
On Error GoTo 0 'Reset error handler (not needed only to remind you not just to ignore all errors!
Do While TypeOf PreviousFormControl Is SubForm ' Loop till control is not subform
Set PreviousFormControl = PreviousFormControl.Form.ActiveControl ' if subform, previous control of it is its current ActiveControl
Loop
End Sub
Private Sub Toggle1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Add a 1 to the currently selected control
PreviousFormControl.Text = PreviousFormControl.Text & "1" ' concat "1" to controls text, no need to handle empty text as it can only be an vbNullString(""), even if Null, then Null & "1" => "" & "1" => "1"
PreviousFormControl.SetFocus
End Sub
, однако, если кто-то знает, где я могу найти код для настраиваемой цифровой клавиатуры, которая записывает непосредственно в любое окно active
Конечно, вы можете использовать любой Virtual Keyboard
на windows, который соответствует вашим потребностям. Но тогда вам, возможно, придется справиться с такими вещами, как вывести клавиатуру вперед в нужном положении. numpad emulator было первым приложением с открытым исходным кодом, которое я обнаружил при быстром поиске, но просматривал товары в коротком тесте. Конечно, могут быть лучшие решения, просто найдите и протестируйте.