MS Access: скрытие вспомогательной формы, когда фокус теряется для любых других элементов управления, кроме самого себя

Разрабатываю базу данных доступа MS (2016).

У меня есть основная форма (с именем MF), которая имеет большое количество элементов управления, включая одну подчиненную форму. Эта подчиненная форма называется SF и связана с двумя элементами управления на MF. Эти элементы управления называются C1 и C2.

Когда загружен MF, SF не отображается.

Когда C1 или C2 находятся в фокусе, видимость SF устанавливается на True.

Теперь мне нужно:

1. Чтобы установить видимость SF на False, когда C1 или C2 потеряли фокус для других элементов управления, кроме SF.

2. Чтобы установить для SF видимость False, когда он теряет фокус для любых элементов управления на MF, кроме C1 и < сильный> C2.

Вначале это казалось простым и казалось прямым, но это не так.

Я использовал:

Private Sub C1_GotFocus()
    Me.SF.Visible = True
End Sub

Private Sub C2_GotFocus()
    Me.SF.Visible = True
End Sub

Private Sub C1_LostFocus()
    Me.SF.Visible = False
End Sub

Private Sub C2_LostFocus()
    Me.SF.Visible = False
End Sub

Private Sub SF_LostFocus()
    Me.SF.Visible = False
End Sub

Теперь, если C1 или C2 теряет контроль над SF, он исчезает, и я не могу выбрать нужную мне информацию для C1 и C2.

Также, если SF теряет фокус для C1 и C2, он исчезает.

Казалось, что это легко исправить с помощью нескольких операторов if, однако это не так.

Проблема в том, что новый элемент управления, который получает фокус, НЕ предсказуем по событию LostFocus(). Следовательно, сделать это так сложно.

Я поискал в сети решение и не нашел ничего, что можно было бы использовать.

обходным путем было бы опустить события LostFocus() для C1, C2 и SF и установить для всех остальных элементов управления значение MF который получает фокус, чтобы скрыть SF.

Хотя это работает так, как мне нужно, это не практическое решение.

Есть ли более простой и рациональный способ добиться этого?

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

Спасибо.


person Shadi    schedule 07.11.2017    source источник


Ответы (1)


Я бы подумал об использовании события OnCurrent для MF, которое запускается при установке новой записи или при переходе к новой записи. Я не уверен, можно ли редактировать C1 или C2. Если их нет, то все просто. Если они есть, вам просто нужно убедиться, что оба имеют значение, прежде чем устанавливать видимость SF. В коде MF должна быть одна функция, не привязанная к какому-либо событию, с именем типа SetSubformVisibility. В нем проверьте значение C1 и C2 и соответственно отобразите / скройте SF. Убедитесь, что вы установили видимость, только если это еще не так. Например:

If Me.SF.Visible = true THEN Me.SF.Visible = False

Таким образом, вы не всегда устанавливаете это, поскольку Access будет мерцать в зависимости от того, как работает его модель событий. Таким образом, если он работает больше, чем должен, на самом деле ничего не происходит. Затем вы можете вызвать эту единственную функцию в OnFocus, OnLostFocus, OnCurrent и т. Д. Формы. В зависимости от редактируемости C1 и C2 OnCurrent может быть достаточно.

Вы также можете перенести некоторую логику в SF, такую ​​как OnLoad. Вы можете ссылаться на родительскую форму и программно изменять SF RecordSource по мере необходимости. Использование свойств LinkChild / Master элемента управления подчиненной формы может быть трудным для понимания.

Удачи!

person DanielG    schedule 07.11.2017
comment
Спасибо @DanielG, C1 и C2 доступны для редактирования и используются для фильтрации содержимого SF. когда требуемое значение отображается в SF, его можно выбрать, дважды щелкнув по нему. Проблема в том, как сохранить видимую подчиненную форму SF только, если активным элементом управления является C1, C2 или SF. В противном случае его следует скрыть. Проблема возникает, когда фокус теряется с C1 или C2, потому что код потери фокуса скрывает SF. Как я могу сказать C1 и C2, чтобы они не скрывали SF, если фокус перемещается на сам SF. - person Shadi; 08.11.2017
comment
Может быть, событие AfterUpdate для C1 и C2 будет работать лучше? Другими словами, нужно что-то делать, только если это значение изменилось. Кроме того, может быть, в вашем коде рассмотрите возможность включения свойства Screen.ActiveControl, и если это либо C1, C2, либо SF, закоротите свойство hide? - person DanielG; 08.11.2017
comment
Еще одна идея - иметь кнопку «Применить фильтр», которая запрашивает подчиненную форму. Если C1 и C2 являются несвязанными элементами управления фильтрами (не привязанными к полю), возможно, пользователь может ввести один или несколько параметров, а затем нажать кнопку «Применить». Код, стоящий за этой кнопкой, может управлять вашей логикой, и одновременно могут применяться два параметра. - person DanielG; 08.11.2017