Флажок в UserForm при запуске не работает

Если вы хотите увеличить шрифт меток гистограммы при установке меток = TRUE

bp=hist(values, labels = FALSE, 
 main='Histogram',
 xlab='xlab',ylab='ylab',  cex.main=2, cex.lab=2,cex.axis=2)

text(x=bp$mids, y=bp$counts, labels=bp$counts ,cex=2,pos=3)
1
задан Cindy Meister 26 March 2019 в 06:09
поделиться

1 ответ

Состояние элементов управления на UserForm при его первом отображении будет, по умолчанию, независимо от состояния времени разработки; давайте назовем это «состоянием по умолчанию».

Вы можете определить, что это за состояние по умолчанию , настроив индивидуальные свойства каждого элемента управления, используя окно инструментов properties конструктора (F4).

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

UserForm1.Show

... если только экземпляр не будет сброшен - что может легко случиться, если вы Unload, или если пользователь нажимает красную кнопку «Х», чтобы закрыть его: экземпляр уничтожается, а поскольку формы имеют предварительно объявленный идентификатор (он же экземпляр по умолчанию), объект автоматически воссоздается при следующем ссылка - с любым состоянием по умолчанию (время разработки). Если вы обрабатываете событие QueryClose и программно Hide форму, когда CloseMode равно VbQueryClose.vbFormControlMenu (и задаете для параметра Cancel значение True, чтобы предотвратить уничтожение экземпляра формы и ее состояние), то состояние будет сохранено ... и это может привести к неожиданному или противоречивому поведению.

Решение состоит в том, чтобы вы всегда отображали новый новый экземпляр формы вместо стандартного:

With New UserForm1
    .Show
End With

Таким образом, гарантируется, что состояние формы всегда будет заданным по умолчанию / заданным дизайном. -time состояние каждый раз, когда оно отображается, и вы можете получить доступ к состоянию формы между .Show и End With. Все, что вам нужно сделать, это обработать QueryClose и отменить уничтожение формы, когда пользователь нажимает «меню управления формой» или «кнопку X».

Инициализация формы вызовет событие Initialize; если вы используете экземпляр формы по умолчанию (например, UserForm1.Show), тогда вы не сможете точно контролировать, когда это произойдет, но если вы будете каждый раз показывать новый новый экземпляр (например, With New UserForm1), то вы уверены, что это событие будет вызвано ровно один раз, каждый раз, когда вам нужно показать форму.

Событие Initialize вызывается, как только объект создан, и это происходит до того, как первый вызов члена будет выполнен с ним (т.е. когда возвращается New UserForm1, событие уже выполнено). Если вам нужно установить флажок , а затем инициализировать форму соответствующим образом, вы можете вместо этого обработать событие Activate, которое будет вызвано, когда форма фактически отображается (т.е. когда .Show вызывается метод):

With New UserForm1 'UserForm_Initialize runs
    .CheckBox1.Value = foo 'form state is accessible here
    .Show 'UserForm_Activate runs
    'UserForm_QueryClose runs
    foo = .CheckBox1.Value 'form state is accessible here
End With 'UserForm_Terminate runs

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

Решение состоит в том, чтобы вытянуть логику в Public Sub, вызвать эту процедуру из клиентского кода, и вызвать ее из флажка ':

Public Sub InitializeFormState()
    Dim isChecked As Boolean
    isChecked = CheckBox1.Value
    ActiveDocument.Bookmarks("KurbeitragKinder") _
                  .Range.Font.Hidden = isChecked
    Label8.Enabled = isChecked
    Label8.Visible = isChecked
    Label9.Enabled = isChecked
    Label9.Visible = isChecked
    ComboBox6.Enabled = isChecked
    ComboBox6.Visible = isChecked
    ComboBox7.Enabled = isChecked
    ComboBox7.Visible = isChecked
End Sub

Private Sub CheckBox1_Click()
    InitializeFormState
End Sub

И теперь ваш код клиента может выглядеть следующим образом:

With New UserForm1
    .InitializeFormState
    .Show
    'consume form state here
End With

Или, при необходимости, вы можете вызывать InitializeFormState из обработчика формы Initialize или Activate:

Private Sub UserForm_Initialize()
    InitializeFormState
End Sub

Или [ 1151]

Private Sub UserForm_Activate()
    InitializeFormState
End Sub

В этом случае процедуру, вероятно, следует выполнить Private, и нет необходимости вызывать ее из кода клиента перед методом .Show.

0
ответ дан Mathieu Guindon 26 March 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: