具有隔离记录集的相同表单的多个实例

时间:2014-07-17 13:20:24

标签: sql ms-access

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

1 个答案:

答案 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]  

这一切对我来说都很好。我可以使用不同的数据同时打开同一表单的许多实例。传递查询/记录集时,此特定表单将动态创建绑定控件。但是,我认为你不需要那样做。您只需要显示两个具有不同过滤器的表单。完全可能。