MarkH
lists at theopg.com
Wed Jan 21 10:17:42 CST 2004
Here you go, it's a bit rough as its from a project that's been shelved for a while so it never really got finished... Have fun Mark Option Compare Database Option Explicit ' ' DESCRIPTION: ' Opens a form as a form variable allowing more than one instance of a form ' to be opened ata time. ' ' COMMENTS: ' When working with multiple instances of forms, avoid using criteria in sub ' forms which references prooperties in the parent form (such as using a ref- ' erence to the parent forms key in the subforms datasource). ' ' The form variables name is always that of the form itself so when referring ' to the form in code avoid using the form name (e.g. me.name) ' '----------------------------------------------------------------------- ------- Global frmInst(1 To 12) As Form 'there is a bug with Jet so sometimes only about 18 new instances can be opened. 'This bug relates to max number of open databases / tables and has been apparently 'sorted out in later releases of Jet. See error handler.... ' '---------------------------------------------------------- Function closeInstAll() 'closes all open notes, topics and categories Dim i As Integer For i = 1 To UBound(frmInst) Set frmInst(i) = Nothing Next End Function Function minimizeInstAll() 'minimizes all open notes, topics and categories On Error Resume Next Echo False Dim i As Integer For i = 1 To UBound(frmInst) frmInst(i).SetFocus DoCmd.Minimize Next Forms("frm_treeMenu").SetFocus DoCmd.Restore Echo True End Function Function controlInst(c As String) On Error Resume Next Dim i As Integer Dim X As Integer Dim hw As Long Dim hwX As Variant Dim frm As Form For i = 0 To Forms("frm_TreeMenu").formsList.ListCount If Forms("frm_TreeMenu").formsList.Selected(i) = True Then hw = Forms("frm_TreeMenu").formsList.ItemData(i) For X = 1 To UBound(frmInst) hwX = frmInst(X).hwnd If hwX = hw Then frmInst(X).SetFocus 'fires a form activate event Select Case c Case "R" 'Restore DoCmd.Restore Case "M" 'Minimize DoCmd.Minimize Case "C" 'Close Set frmInst(X) = Nothing End Select End If Next End If Next End Function Function minimizeInst() 'minimizes the first selected instance of a form in the open forms list 'On Error Resume Next controlInst "M" End Function Function restoreInst() 'restores the first selected instance of a form in the open forms list 'On Error Resume Next controlInst "R" End Function Function closeInst() 'Closes selected items on the open forms list 'On Error Resume Next controlInst "C" End Function Function getNextFormVar() As Integer 'returns a reference to the next free form variable On Error GoTo errbit Dim i As Integer Dim X As Long For i = 1 To UBound(frmInst) X = frmInst(i).hwnd tryAgain: Next wayout: getNextFormVar = 0 Exit Function errbit: If Err.Number = 91 Or Err.Number = 2467 Then getNextFormVar = i Else Resume tryAgain End If End Function '======================================================================= ====================== 'Opens new instance of form f using one of the "frm*" globals. ' f = form name ' wc = where clause ' p = parent nodes index Sub openInstance(F As String, wc As String, ni As Integer, addMode As Boolean, Optional parentKey As Integer = 0) On Error GoTo errbit Dim nextFormVar As Integer Dim frm As Form Dim strCap As String Dim ctrl As Control If Not IsLoaded("frm_TreeMenu") Then DoCmd.OpenForm ("frm_TreeMenu") End If If addMode Then strCap = StrConv(Mid(F, 5), vbProperCase) & ": (New Record)" Else strCap = StrConv(Mid(F, 5), vbProperCase) & ": " End If 'check if the record is already open... if so then simply set focus to that record. For Each frm In Forms If frm.name = F Then If frm.Filter = wc Then frm.SetFocus Exit Sub End If End If Next nextFormVar = getNextFormVar noMoreForms: If nextFormVar = 0 Then MsgBox "The system has run out of free form variables. Please close" & Chr(13) & "any unused forms and try again.", vbCritical, "Error" Exit Sub End If Select Case F Case "frm_Category" 'form open event fired next subform then main then main activate then main current Set frmInst(nextFormVar) = New Form_frm_Category Case "frm_Topic" Set frmInst(nextFormVar) = New Form_frm_Topic Case "frm_Note" Set frmInst(nextFormVar) = New Form_frm_note End Select With frmInst(nextFormVar) If addMode Then .AllowAdditions = True .DataEntry = True .Caption = strCap .newRcd = True If parentKey > 0 Then .parentKey = parentKey End If Else .Filter = wc 'next line fires a form current in the subform then main activate and main current .FilterOn = True End If .nodeIndex = ni 'next line triggers activate .SetFocus .formStart For Each ctrl In .Controls If ctrl.Tag = "X" Then ctrl.Visible = True End If Next End With frmInst(nextFormVar).SetFocus DoCmd.Restore listForms wayout: strCap = "" nextFormVar = 0 Exit Sub errbit: DoCmd.Echo True If Err.Number = 2956 Or Err.Number = 3048 Or Err.Number = 2950 Then nextFormVar = 0 Resume noMoreForms Else MsgBox Err.Description Resume wayout End If errLog "multiInstance", Err.Number, Err.Description End Sub