Как заставить свойство пользовательской формы сохранять значение между вызовами экземпляра - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть пользовательская форма, содержащая элементы управления, которые должны сохранять свои состояния.Кто-то на этом форуме научил меня, что пользовательские формы в VBA должны рассматриваться как классы.Итак, как вы можете заставить его сохранять свои значения между вызовами экземпляра?Я хочу делать правильное кодирование и избегать глобальных переменных.Этому меня научил и другой разработчик на этом форуме.Вот моя попытка заставить uf сохранить сделанный выбор:

Private Sub UserForm_Initialize()

Static Schalter As Boolean
Me.ToggleButton1 = Schalter

End Sub

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Основная проблема заключается в том, что вы, вероятно, создаете новые экземпляры, которые будут сбрасывать значения.Что вы на самом деле хотите сделать, так это удержать экземпляр, переключаясь между скрытым и показанным.Таким образом, тот же экземпляр обнаруживается со значением, которое все еще запоминается.

Это прекрасно работает, если вам нужен только один экземпляр, но если вам нужно несколько экземпляров или если вы не хотите продолжать работать с этим экземпляром, то вам нужно отделить модель от представления.,Строго говоря, Schalter никак не связан с формой - это всего лишь пользовательский интерфейс для манипулирования логическим значением, верно?Так что рассматривайте его как модель и предоставьте модель для формы (или представления), тогда вы можете легко отклонить экземпляр формы и получить необходимые данные.И если вы решите показать форму (или, может быть, даже другую форму), у вас уже есть модель со всем настроенным.

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

0 голосов
/ 22 декабря 2018

Public vs Static

Это работает.Почему это не должно быть правильно?

UserForm1

Option Explicit
Private Sub ToggleButton1_Click()
  Schalter = ToggleButton1.Value
  Debug.Print "ToggleButton1 = " & Schalter
End Sub
Private Sub UserForm_Initialize()
  Me.ToggleButton1 = Schalter
  Debug.Print "Userform Initialize Schalter = " & Schalter
End Sub

Module1

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