В догадка, вы можете захотеть, чтобы показать другие формы и, возможно, с разные задержки. Вы можете сделать это с помощью Sub, который принимает форму и задерживает в качестве параметров.
Предполагая, что вы используете VS2010 или позже, ваш код может выглядеть примерно так:
Private Sub ShowNextForm(formToShow As Form, secondsDelay As Double)
Dim tim As New System.Windows.Forms.Timer
tim.Interval = CInt(secondsDelay * 1000)
tim.Start()
AddHandler tim.Tick, Sub(sender As Object, e As EventArgs)
tim.Stop()
tim.Dispose()
Me.Hide()
formToShow.Show()
End Sub
End Sub
Private Sub btnAnswerA_Click(sender As Object, e As EventArgs) Handles btnAnswerA.Click
Dim bn = DirectCast(sender, Button)
bn.Enabled = False
bn.BackColor = Color.Green
Dim nextForm As New Q2
ShowNextForm(nextForm, 10)
End Sub
Тогда, если вы имели другую кнопку, которую вы хотели сделать то же самое, скажем, «btnAnswer99» с формой Z99 и задержка 2,5 секунды, вам нужно будет только написать код
Private Sub btnAnswer99_Click(sender As Object, e As EventArgs) Handles btnAnswer99.Click
Dim bn = DirectCast(sender, Button)
bn.Enabled = False
bn.BackColor = Color.Blue
Dim nextForm As New z99
ShowNextForm(nextForm, 2.5)
End Sub
становится немного более продвинутые ... Может быть что-то, чтобы смотреть на потом ...
Вы можете заметить, что вы повторяете много кода для каждой кнопки. На этом этапе пришло время рассмотреть рефакторинг вашего кода, чтобы вы могли написать основной код только один раз и задать параметры, которые определяют, что он делает.
Итак, вы смотрите на то, что общего между всеми обработчиками щелчков кнопок, такими как все они имеют форму, в которой они находятся, форму для отображения, некоторые BackColor для изменения и задержку до отображения следующей формы, и, конечно, они относятся к a.
Это идеальная возможность для создания класса инкапсулировать все части, возможно, как-нибудь так:
Friend Class SetButtonToShowForm
Property thisForm As Form
Property nextForm As Form
Property buttonRef As Button
Property buttonBackColor As Color
Property secondsDelay As Double
Friend Sub ShowNextForm(currentForm As Form, formToShow As Form, secondsDelay As Double)
Dim tim As New System.Windows.Forms.Timer
tim.Interval = CInt(secondsDelay * 1000)
tim.Start()
AddHandler tim.Tick, Sub(sender As Object, e As EventArgs)
tim.Stop()
tim.Dispose()
currentForm.Hide()
formToShow.Show()
End Sub
End Sub
Friend Sub bnClick(sender As Object, e As EventArgs)
Dim bn = DirectCast(sender, Button)
bn.Enabled = False
bn.BackColor = Me.buttonBackColor
ShowNextForm(thisForm, nextForm, secondsDelay)
End Sub
Public Sub New()
' empty constructor
End Sub
Public Sub New(sourceForm As Form, targetForm As Form, buttonRef As Button, backColor As Color, secondsDelay As Double)
Me.thisForm = sourceForm
Me.nextForm = targetForm
Me.buttonRef = buttonRef
Me.buttonBackColor = backColor
Me.secondsDelay = secondsDelay
AddHandler Me.buttonRef.Click, AddressOf bnClick
End Sub
End Class
, а затем вы можете настроить все кнопки в одной процедуре вдоль линий
Private Sub SetButtonHandlers()
Dim b1 As New SetButtonToShowForm(Me, Q2, btnAnswerA, Color.Green, 5)
Dim b2 As New SetButtonToShowForm(Me, z99, btnAnswer99, Color.Blue, 2.3)
End Sub
Таким образом, вы можете видеть, что с мало немного больше усилий, вы можете сделать это гораздо легче положить и p больше кнопок.
Используйте вместо этого таймер. 'Sleep' блокирует поток пользовательского интерфейса, так что ничего не происходит – Plutonix
Позвольте мне дать вам совет - событие' Click' не происходит, когда выбрана кнопка. Это когда он щелкнут. Конечно, нет. Сначала вам нужно вызвать 'Application.DoEvents', поэтому ваша кнопка завершает перекраску –
@ T.S. Использование 'Application.DoEvents' почти всегда является способом скрытия того, что вы делаете что-то неправильно в программе. –