为什么Forms集合的行为会根据表单的不同而实例化或只是打开?

时间:2017-03-13 20:10:02

标签: access-vba

我有一个名为“FindCustomerCode”的表单,该表单由许多其他表单(订单处理,计费,会计等)调用。 此表单通常如下所示:

    DoCmd.OpenForm "FindCustomerCode", , , , , acDialog, Me.Name & "." & "NameOfFunctionIntentedToReceiveTheCustomerCodeChosenByUser"

“FindCustomerCode”中的重要代码是:

    ArgV = Split(Me.OpenArgs, ".", -1)
    Calling_Form = ArgV(0)
    Return_Method = ArgV(1)
    (...)
    Ret = CallByName(Forms(Calling_Form), Return_Method, VbMethod, CustomerCodeChosenByUser)

当Docmd.Openform打开CALLING表单时,此代码非常有效。

问题是:当CALLING表单被实例化时,CallByName失败并出现错误2450:找不到表单“CallingForm”(法语错误消息的近似翻译)。

用于实例化调用表单的代码是(感谢Gustav):

    Public collForms As New Collection

    Dim fForm As Form_CallingForm
    Set fForm = New Form_CallingForm
    collForms.Add Item:=fForm, Key:=fForm.Hwnd
    fForm.SetFocus

这很奇怪。一旦出现错误2450:

    ?Forms(1).Name
    CallingForm
    if forms(1).Name = Calling_Form then ? "==="
    ===

但是

    ?Forms(Calling_Form).Name
    --> error 2450

解决方法并不优雅,但显而易见。基本上:

Dim ii 
For ii = 0 To Forms.Count - 1
    If Forms(ii).Name = Calling_Form Then 
        Ret = CallByName(Forms(ii), Return_Method, VbMethod, CustomerCodeChosenByUser)
        Exit For
    End If
Next ii

如果有人以更优雅的解决方法回答我会很高兴,但我的问题是:为什么表单(Calling_Form)不起作用?

由于

1 个答案:

答案 0 :(得分:0)

据我记忆(很长一段时间没有使用过这个),罪魁祸首是,表单的所有实例在Forms的集合中都被命名为相同。所以你的循环只捕获表单的第一个实例。

这是集合试图解决的一个任务:能够通过hWnd是自然选项的唯一键来识别表单的特定实例。