Как я могу проверить, открыт ли экземпляр формы Access 2010? - PullRequest
0 голосов
/ 02 декабря 2011

Предисловие

Мне нужно создать несколько копий формы поиска (в Access 2010 ), которая возвращает значение вызывающему (который также является формой, создавшей экземпляр).формы).

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

  • Нажмите «выбрать компанию» и откройте экземпляр экрана поиска компании
  • Затем откройте редактор компании (оставив открытым экран поиска / выбора компании), когда они заметят, что у компании есть родительская компания, которая не былаеще не добавлено.
  • Затем они нажимают кнопку «Выбрать родительскую компанию», которая открывает ДРУГОЙ экземпляр поиска и экран выбора
  • Они находят родительскую компанию
  • Выберите ее, которая закрываетсявторой экран поиска и родительская компания добавляется к первой компании.
  • Затем пользователь выбирает измененную компанию, используя исходнуюЭкран поиска, который снова закрывает исходный экран поиска и возвращает выбранную компанию в ту форму, в которой они первоначально инициализировали первый поиск ...

Все это позволяет пользователям обновлять и исправлять данные, как и когда онинайти ошибку, которая уменьшает вероятность того, что они забудут, и делает это намного быстрее!

МНОГО этого сейчас хорошо, но у меня было много проблем с экземплярами формы, которые не открывались как "acDialog"таким образом останавливая вызывающий код, выполняемый до тех пор, пока поиск не будет завершен (см. этот вопрос для получения дополнительной информации), и решение, с которым я столкнулся, состоит в том, чтобы смоделировать приостановку вызывающего кода с помощью бесконечного цикла и проверки,Мгновенный экран поиска все еще виден.Затем, когда пользователь выбирает что-то на экране поиска, он помещает значение в скрытое поле на экране поиска и скрывает себя (не закрывая).Затем вызывающая функция видит, что она скрыта, получает значение из скрытого поля и выгружает мгновенное сообщение.

Проблема

Я могу проверить, скрыта ли форма, используя FormInstant.Visable , но если пользователь закрывает форму, это вызывает ошибку, и код, который я обычно использую, чтобы проверить, существует ли форма, требует имя формы, и, поскольку это мгновенный вид формы, все формы имеют одно и то же имя!У меня есть ссылка на форму, так как она хранится в локальном объекте "формы" ... Код, который я обычно использую:

CurrentProject.AllForms("FormName").IsLoaded

Так как я могу проверить на мгновение формузагружается еще?

Ответы [ 4 ]

0 голосов
/ 13 января 2014

Попробуйте также

Function IsLoaded(strFrmName As String) As Boolean

    '  Determines if a form is loaded.

    Const conFormDesign = 0
    Dim intX As Integer

    IsLoaded = False
    For intX = 0 To Forms.Count - 1
        If Forms(intX).FormName = strFrmName Then
            If Forms(intX).CurrentView <> conFormDesign Then
                IsLoaded = True
                Exit Function  ' Quit function once form has been found.
            End If
        End If
    Next

End Function

Вы можете вызвать вышеуказанную функцию в вашем проекте, например, так:

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

Мне нравится твой ответ.Что касается идеи цикла / ожидания?Лучший способ - всегда включать ссылку в каждую форму.Я обычно объявляю переменную модуля формы с именем frmPrevious.

Create instance of form
Instance.frmPrevious = me

Так что теперь у нас есть форма, вызывающая некоторый код, когда форма закрывается вместо некоторого "видимого" + параметра циклического кода.

Таким образом, в закрытом коде формы мы имеем:

frmPrevious.FunctionCodeToRun

Вышеприведенное решает множество проблем, но одна из них - вам не нужен диалог (который, как вы заметили, использовать нельзя) И вы такжеизбавиться от необходимости написания кода «цикл + ожидание» из вызывающего кода.

Это, однако, означает, что ваш код продолжается в новой функции в вызывающей форме.Поэтому я обычно помещаю эту функцию прямо под кодом вызова в форме вызова.Я также склонен использовать стандартное имя для этой функции.Я считаю, что это компромисс стоит, а не цикл / ожидание и продолжение в той же самой подпрограмме кода (я согласен, что «продолжить» в коде часто предпочтительнее, но опять же, необходимость писать цикл и код ожидания на самом деле не так уж чиста).

0 голосов
/ 19 апреля 2013

Старый вопрос, но вот чему научил меня опыт: если One, Two, ... открыты экземпляры FormDefn, то пользователь закрывает One (Master, который является единственным, который может быть спроектирован), Forms (FormName) выдает ошибку, Форма (Форма) дает неправильный объект, но формы (NumberIndex) все еще существуют с .Name = FormName!

OpenForm создает объект Forms (FormName). После закрытия формы (FormName) выдает ошибку. Любой «Set xForm = New Form_xxx» создает формы в коллекции форм, к которым может обращаться только индекс номера коллекции, и не может быть спроектирован.

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

Dim FormIdx     As Integer
Dim lForm       As Access.Form
For FormIdx = 0 To Application.Forms.Count - 1
    Set lForm = AccessFunc.Appl.Forms(FormIdx)
    If lForm.Name = pFormName Then
        IsFormOpened = True
        Set rForm = lForm
        GoTo IsFormOpened_Exit
    End If
Next
0 голосов
/ 02 декабря 2011

LOL Я только что понял, перечитывая мое сообщение, что я могу перехватить ошибку, чтобы определить, открыта ли форма или нет!

Я быстро написал это, и, кажется, работает нормально:

Public Function IsFormLoaded(ByRef FormToTest As Form, _
                            Optional ByRef bIsVisable As Boolean = False) As Boolean
    Dim lErrorNum As Long
    bIsVisable = False
    On Error Resume Next
        bIsVisable = NewFormClone.Visible
        lErrorNum = Err.Number
    On Error GoTo 0

    If (lErrorNum = 0) Then
        IsFormLoaded = True
    Else
        IsFormLoaded = False
    End If
End Function

Думаю, что вопрос не имеет значения, если он отвечает на вопрос, если на него есть ответ, и следующий парень / гал может его использовать! :)

Я оставлю это открытым немного, и если никто не найдет лучшего ответа, я отмечу это как ...

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