Использование свойства PreviousControl с вложенными подчиненными формами и элементами управления - PullRequest
1 голос
/ 13 марта 2020

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

Private Sub Form_Activate()
  FocusForm = Application.Screen.PreviousControl.Parent.Name
  FocusControl = Application.Screen.PreviousControl.Name
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
  Dim refControl As Control
  If FocusForm = "" Then End
  Set refControl = Forms(FocusForm).Controls(FocusControl)

  If (IsNull(refControl)) Then
    refControl = "1"
  Else
    refControl.Text = refControl.Text & "1"
  End If
  refControl.SetFocus
End Sub

Однако, если я перехожу в подчиненную форму, свойства Screen.PreviousControl возвращают имя главной формы и имя подчиненной формы, но тогда я не могу ссылаться на имя элемента управления подчиненной формы. В основном я ищу строку, которая выполняет следующее

FocusForm = Application.Screen.PreviousControl.Parent.Name
FocusSubform = Application.Screen.PreviousControl.Name
FocusSubformControl = ?????

Аналогично, моя подчиненная форма имеет собственную вложенную подчиненную форму, и я хотел бы сделать то же самое с этой

FocusForm = Application.Screen.PreviousControl.Parent.Name
FocusSubform = Application.Screen.PreviousControl.Name
FocusSubform2 = ?????
FocusSubform2Control = ?????

. встроенная плавающая цифровая клавиатура на планшетах очень удобна в использовании, поэтому мой код этой пользовательской кодировки, однако, если кто-то знает, где я могу найти код для настраиваемой цифровой клавиатуры, которая записывает непосредственно в любое активное окно, это будет аналогично очень признателен!

1 Ответ

1 голос
/ 18 марта 2020

Если вызвано из подчиненной формы, 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 было первым приложением с открытым исходным кодом, которое я обнаружил при быстром поиске, но просматривал товары в коротком тесте. Конечно, могут быть лучшие решения, просто найдите и протестируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...