http://allenbrowne.com/ser-35.html
以下代码是Allen Browne的代码,用于打开同一表单的多个实例。问题是我需要每个表单数据都基于“#”中的下拉列表。形式,而不是第一个。他有一个表作为表单上的记录源,我在表单中嵌入了以下SQL。我认为关键是where语句,或者可能删除where语句并使用过滤。现在,所有打开的表单都基于第一个表单数据。
我的SQL Where声明 -
WHERE(((tbl_buyer_column.aels_id)= [表格]![frm_baseline]![ael]))
艾伦的代码
Option Compare Database
Option Explicit
Public clnClient As New Collection
Function OpenAClient()
Dim frm As Form
Set frm = New Form_frm_baseline
frm.Visible = True
frm.Caption = "New Form Opened " & Now()
clnClient.Add Item:=frm, Key:=CStr(frm.Hwnd)
Set frm = Nothing
End Function
Function CloseAllClients()
Dim lngKt As Long
Dim lngI As Long
lngKt = clnClient.Count
For lngI = 1 To lngKt
clnClient.Remove 1
Next
End Function
答案 0 :(得分:1)
你走在正确的轨道上。这里的技巧是在打开表单时跟踪表单。这就是我这样做的方式。您可以看到我在创建新实例时传递的参数指定了我想在该表单上使用的记录集。您也可以将其更改为过滤器。
这是标准模块中的代码
Public multiInstanceDic As Dictionary
'returns the window handle (long)
Public Function OpenNewMyFormSheetInstance(queryForRecordSource As String, Optional inputCaption As String) As Long
If multiInstanceDic Is Nothing Then
Set multiInstanceDic = New Dictionary
End If
Dim frm As Form
Set frm = New Form_MyForm
frm.Caption = inputCaption
frm.SetRecordSource queryForRecordSource
multiInstanceDic.Add frm.Hwnd, frm 'required to keep form alive after function exits
frm.SetFocus
OpenNewDynamicDataSheetInstance = frm.Hwnd
End Function
Public Function GetMyFormInstance(frmHandle As Long) As Form_MyForm
Set GetDynamicDataSheetInstance = multiInstanceDic(frmHandle)
End Function
我在整个应用程序中都这样使用它
Dim createdWindowHandle As Long
createdWindowHandle = Windows.OpenNewMyFormInstance("VW_SomeView", "A wonderful informative caption")
然后,每当我需要更改有关在创建时未处理的表单的其他内容时,我都会使用hwnd
,因为我在创建表单时将其返回给调用者。
Dim dMyForm As Form_MySheet
Set dMyForm = Windows.GetMyFormInstance(createdWindowHandle)
dMyForm.[change any public property]
这一切对我来说都很好。我可以使用不同的数据同时打开同一表单的许多实例。传递查询/记录集时,此特定表单将动态创建绑定控件。但是,我认为你不需要那样做。您只需要显示两个具有不同过滤器的表单。完全可能。