我有一个名为“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)不起作用?
由于
答案 0 :(得分:0)
据我记忆(很长一段时间没有使用过这个),罪魁祸首是,表单的所有实例在Forms的集合中都被命名为相同。所以你的循环只捕获表单的第一个实例。
这是集合试图解决的一个任务:能够通过hWnd是自然选项的唯一键来识别表单的特定实例。