Как проверить, закрыта ли пользовательская форма кнопкой «X» Windows? - PullRequest
1 голос
/ 26 января 2020

Существует подпрограмма, она создает CourtForm пользовательскую форму и затем берет данные из нее. Проблема возникает, когда указанная форма закрывается преждевременно, при нажатии кнопки окна «X», и я получаю ошибку во время выполнения где-то позже. Для справки, это то, о чем я говорю:

enter image description here В своем коде я попытался выполнить проверку для выхода из sub:

Private Sub test()

    'Create an exemplar of a form
    Dim CourtForm As New FormSelectCourt
    CourtForm.Show

    'The form is terminated at this point

    'Checking if the form is terminated. The check always fails. Form exists but without any data.
    If CourtForm Is Nothing Then
        Exit Sub
    End If

    'This code executes when the form proceeds as usual, recieves 
    '.CourtName and .CourtType variable data and then .hide itself.

    CourtName = CourtForm.CourtName
    CourtType = CourtForm.CourtType
    Unload CourtForm


    'Rest of the code, with the form closed a runtime error occurs here

End Sub

Видимо Образец формы существует, но без каких-либо данных. Вот скриншот часов:

enter image description here

Как правильно проверить форму, если она преждевременно закрыта?

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Добавьте следующий код в вашу пользовательскую форму

    Private m_Cancelled As Boolean

    ' Returns the cancelled value to the calling procedure
    Public Property Get Cancelled() As Boolean
        Cancelled = m_Cancelled
    End Property

    Private Sub UserForm_QueryClose(Cancel As Integer _
                                           , CloseMode As Integer)

        ' Prevent the form being unloaded
        If CloseMode = vbFormControlMenu Then Cancel = True

        ' Hide the Userform and set cancelled to true
        Hide
        m_Cancelled = True

    End Sub

Код взят из здесь . Я действительно рекомендовал бы прочитать там, поскольку вы найдете довольно хорошее базовое объяснение, как использовать форму пользователя.

1 голос
/ 26 января 2020

Одно из возможных решений - передать словарь в пользовательскую форму и сохранить в нее все введенные данные. Вот пример:

Код модуля пользовательской формы:

' Add reference to Microsoft Scripting Runtime
' Assumed the userform with 2 listbox and button

Option Explicit

Public data As New Dictionary

Private Sub UserForm_Initialize()

    Me.ListBox1.List = Array("item1", "item2", "item3")
    Me.ListBox2.List = Array("item1", "item2", "item3")

End Sub

Private Sub CommandButton1_Click()

    data("quit") = False
    data("courtName") = Me.ListBox1.Value
    data("courtType") = Me.ListBox2.Value
    Unload Me

End Sub

Стандартный код модуля:

Option Explicit

Sub test()

    Dim data As New Dictionary

    data("quit") = True
    Load UserForm1
    Set UserForm1.data = data
    UserForm1.Show

    If data("quit") Then
        MsgBox "Ввод данных отменен пользователем"
        Exit Sub
    End If
    MsgBox data("courtName")
    MsgBox data("courtType")

End Sub

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

Другой способ - проверить, действительно ли загружена пользовательская форма:

Sub test()

    UserForm1.Show

    If Not isUserFormLoaded("UserForm1") Then
        MsgBox "Ввод данных отменен пользователем"
        Exit Sub
    End If

End Sub

Function isUserFormLoaded(userFormName As String) As Boolean

    Dim uf As Object

    For Each uf In UserForms
        If LCase(uf.Name) = LCase(userFormName) Then
            isUserFormLoaded = True
            Exit Function
        End If
    Next

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