Как я могу создать новый экземпляр класса формы, а затем открыть его как поле acDialog (приостановка другого кода)? - PullRequest
3 голосов
/ 01 декабря 2011

Задача

У меня есть сложная форма поиска, которую мне нужно открыть несколько раз (одновременно), чтобы позволить пользователям выполнять несколько поисков одновременно. Я нашел возможность открыть экземпляр формы (как это класс), используя:

Option Compare Database
Option Explicit

'Array to hold Form Instances
Private MyFormCollection(1 To 4) As Form_frmTest

Private Sub cmd_CloneMe_Click()
    Dim intCounter As Integer

    For intCounter = 1 To 4
        Set MyFormCollection(intCounter) = New Form_frmTest
        MyFormCollection(intCounter).Caption = "Form #" & intCounter
        MyFormCollection(intCounter).Visible = True
    Next intCounter

    Forms!frmTest.SetFocus
End Sub

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

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

Call DoCmd.OpenForm("SomeForm", acNormal, , , , acDialog)

Вопрос

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

Спасибо

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Вы можете использовать этот код, чтобы проверить, видна ли форма:

Private Function IsVisible(intObjType As Integer, strObjName As String) As Boolean
    Dim intObjState As Integer
    intObjState = SysCmd(acSysCmdGetObjectState, intObjType, strObjName)
    IsVisible = intObjState And acObjStateOpen
End Function

Если да, ничего не делать, только подождать:

Do While IsVisible(acForm, "frmInfo")
    DoEvents
Loop

==================

Хорошо, еще одна идея: у вас есть выбор: открыть модальное диалоговое окно и остановить код в вызывающей функции, или жить с другими диалоговыми окнами и запустить вызывающую функцию.

Я думаю, что единственным способом решения этой проблемы является счетчик открытых диалогов и отказ от выполнения каких-либо действий в вызывающей функции, когда счетчик все еще> 0.

0 голосов
/ 01 декабря 2011

Вы можете написать публичную функцию в вызываемой форме, и пока эта функция не вернет (закрыв форму), вызывающий метод будет заблокирован. В приведенном ниже примере нажатие кнопки «Готово» может установить возврат

Option Explicit
Private m_dlgResult As VbMsgBoxResult

Public Function ShowDialog() As VbMsgBoxResult

    m_dlgResult = vbCancel
    Me.Show vbModal
    ShowDialog = m_dlgResult

End Function

Private Sub Done_Click()

    m_dlgResult = vbOK
    Unload Me

End Sub
...