将参数传递给使用"New"创建的Access Forms

use*_*932 3 forms ms-access vba access-vba

我有一个名为'detail'的表单,它显示了所选记录的详细视图.该记录从称为"搜索"的不同形式中选择.因为我希望能够打开多个'detail'实例,每个实例都显示不同记录的详细信息,所以我使用了以下代码:

Public detailCollection As New Collection    

Function openDetail(patID As Integer, pName As String)
'Purpose:    Open an independent instance of form
Dim frm As Form
Debug.Print "ID: " & patID

'Open a new instance, show it, and set a caption.
Set frm = New Form_detail
frm.Visible = True
frm.Caption = pName


detailCollection.Add Item:=frm, Key:=CStr(frm.Hwnd)

Set frm = Nothing
End Function
Run Code Online (Sandbox Code Playgroud)

PatID是我希望在这个新的'detail'实例中显示的记录的主键.调试打印行打印出正确的PatID,所以我可以使用它.如何将其传递给表单的新实例?

我试图设置新表单的OpenArgs,但是我收到一条错误,指出OpenArgs是只读的.经过研究,OpenArgs只能由DoCmd设置(这将不起作用,因为那时我没有得到表单的独立实例).创建Form对象时,我找不到有关允许参数的文档.显然,微软并不认为构造函数是一种方法,至少根据文档.我该怎么处理?(请不要告诉我把它设置成一个看不见的文本框或者其他东西)谢谢你们,你们是网上最好的回答这些问题的人.我爱你们!

多实例表单的源代码取自:http://allenbrowne.com/ser-35.html

Rub*_*uck 9

在Form_detail中,创建一个自定义属性.

Private mItemId As Long

Property Let ItemID(value as Long)
    mItemId = value
    ' some code to re query Me
End Property

Property Get ItemId() As Long
    ItemId = mItemId
End Property
Run Code Online (Sandbox Code Playgroud)

然后,在创建表单的代码中,您可以执行此操作.

Set frm = New Form_detail

frm.ItemId = patId

frm.Visible = True
frm.Caption = pName
Run Code Online (Sandbox Code Playgroud)

这将允许您将ID传递给新的表单实例,并确保在将其显示之前将其重新获取.如果您总是New通过它打开表单,则无需每次都加载所有结果.您让属性加载数据而不是传统Form_Load事件.

这是有效的,因为Access Form模块只不过是荣耀的类.希望这可以帮助.