2017-02-07 5 views
0

Я застрял в очень раздражающем вопросе.MSAccess (2007) - всплывающая и модальная форма - instancing через VBA

Мне нужно открыть форму внутри модуля класса, передав сам класс форме, чтобы форма могла использовать все свойства и методы класса. Я говорю о форме, а не о USERFORM. (В этом втором случае проблема не будет). Форма должна быть как всплывающей, так и модальной.

Так давайте предположим, что этот код в методе вызова класса, который открывает форму:

sub OpenFormMethodOfTheCallingClass 
    set MyForm = new [Form_FormToBeOpened] 
    with MyForm 
     set .MyFatherClass = Me 
     .SetFocus ' ... this opens the form 
     MsgBox "Ok, user has closed the form ..." 
    end with 
end sub 

Таким образом, поток кода НЕ «STOP» ВНУТРИ ФОРМЕ. Я имею в виду, что сообщение «Хорошо, пользователь закрыл форму ...» появляется сразу, «впереди» открытой формы. И тогда, очевидно, метод заканчивается, и форма (опять же, очевидно) исчезает, так как это экземпляр метода закрытия.

В представлении с дизайном для всплывающих и модальных форм установлены значение ИСТИНА.

Установка двух свойств в вызывающую процедуру таким образом:

with MyForm 
    .Modal = True 
    .PopUp = True 
    (...) 

... не помогает вообще, как: - MODAL не влияет на поведение код потока - POPUP может» t быть установленным (!): он возвращает ошибку времени выполнения.

Единственный способ я нашел, чтобы достичь моей целью является открытие так:

DoCmd.OpenForm "FormToBeOpened", WindowMode:=acDialog 

Таким образом, поток кода «заклинивание» в форму, и только тогда, когда пользователь закрывает сам поток формы возвращается к вызывающей процедуре и ее следующей инструкции. Но проблема в том, что я не могу передать вызывающий класс в форму. ОК, кто-то может возразить, что: поскольку моя форма MODAL, никакие множественные экземпляры экземпляра формы не могут быть открыты пользователем, и поэтому я мог бы передать любое свойство вызывающего класса в форму другими способами («bridge- public-variables "или JSON в OpenArgs ...). Но это ... действительно ужасно.

Я боюсь, не знаю почему, это очень глупый вопрос, с простым ответом. :)

Давайте посмотрим.

Thks,

FL

ответ

1

Это дизайн. Доступ запускает один поток, поэтому диалог означает диалог.

Вы можете передать статические значения с помощью OpenArgs в форму диалога, но вы также можете позволить этому - при открытии - вытащить данные и свойства из вызывающей формы.

Этот код не обязательно должен быть уродливым.

Возможно, WinForms .Net и Visual Studio будет лучше соответствовать вашим потребностям.

+0

Да, извините, я имел в виду диалог. Исправленный. – Gustav

+0

Спасибо, Густав: Я полностью согласен с тобой по поводу «философских» замечаний (я имею в виду, что Access не является подходящей средой для структурированного кодирования). Однако моя проблема заключалась в том, что мне не нужно было «извлекать данные и свойства из вызывающей ФОРМЫ», а скорее из вызывающего КЛАССА. Если вы снова прочитаете мой вопрос (не делайте этого !, D), вы увидите, что я не могу подготовить форму CALLED как объект, передающий вызывающий класс в правильном «чистом» виде, но я могу открыть его только с помощью DoCmd, что мешает мне взаимодействовать с ним из вызывающего класса. – Fil

+0

Тогда, я думаю, ваш единственный вариант - сохранить (копию) форму, в которой для Modal и PopUp установлено значение True. – Gustav

0

Создать класс формы Form_Popup с .Modal и .Popup = True.

В модуле Form_Popup в

  • Добавить переменное свойство, propFils_Class типа Fils_Class (или вариант, если не допускается)
  • Добавить Public Sub Let Fils_Class (inputFils_Class as Variant) и Public Sub Get Fils_Class (inputFils_Class as Variant) процедуры для установки и извлечения propFils_Class
    • Я Предполагая, что входные переменные должны быть вариантами, но вы можете передать их как тип Fils_Class, не уверен.
  • В коде, требующих Form_Popup:

    Dim frm as Form, varFils_Class as Fils_Class 
    
    '<set up varFils_Class here> 
    
    Set frm = New Form_Popup 
    'or Docmd.OpenForm "Popup" hidden etc., then you need to directly reference the form, e.g. Set frm = Forms("Popup") 
    
    frm.Fils_Class = varFils_Class 
    
    frm.Visible = True 
    
    Do While frm.Visible 
        Sleep 1 
        DoEvents 
        '<at some point actions on Form_Popup set .Visible to False> 
    Loop 
    
    varFilsClass = frm.FilsClass 
    
    '<do other actions with frm as needed> 
    set frm = Nothing 
    
+0

Вы правы usncahill. В моем вопросе я забыл сказать, что время от времени я использую подход «do-loop», чтобы решить этот вопрос, но мне это действительно не нравится из-за истощения ресурсов, которые он использует. – Fil

Смежные вопросы