Link to home
Start Free TrialLog in
Avatar of Temujin
Temujin

asked on

How to Emulate a Modal Form in VB

Showing Drop-Down Forms from Modal Forms.

One problem with this technique is that you cannot use it directly from a form shown with modally in VB, otherwise you get the error message "Can't show non-modal form when modal form is displayed". There 'must' be a workaround for this problem by which you can emulate showing the form modally.
 
Can anybody help me out with this problem ?
Thanks
ASKER CERTIFIED SOLUTION
Avatar of fnizet
fnizet

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of fnizet
fnizet

To work properly, you may need to define 2 functions, one to call a modal form, the other to return from a modal form. You need to manage an array of the forms you locked, because several forms may need to be locked :

Dim lockedForms(1, 3)

Sub callModal ( calledForm as Form, caller as Form)
for each f in Forms
  if (f.hwnd<>calledForm.hwnd) ' prevent from self locking in case called form is already loaded
     And (f.enabled) then
    f.enabled = false
    i = Ubound(lockedForms(1))
    Redim Preserve lockedForms(i+1, 3)
    lockedForms(i, 1) = calledForm.hwnd 'save ID of calledForm, prevents unlocking of previously lock forms
    lockedForms(i, 2) = f.hwnd 'save ID of locked form
    lockedForms(i, 3) = caller.hwnd ' just to know which form to unlock
  end if
next
calledForm.Show

End Sub

Sub unlockForms(modalForm as Form)
  Dim formToShow As Form
  n = Ubound(lockedForms(1))
  do while (n>0 and lockedForms(n, 1) = modalForm.hwnd)
    for each f in Forms
      if f.hwnd = lockedForms(n, 3) then Set formToShow = f
      if f.hwnd = lockedForms(n, 2) then
        f.enabled = true
        exit for
      end if
    next
    n = n - 1
  loop

  Redim Preserve lockedForms(n+1, 3)
  modalForm.hide
  formToSHow.Show
End Sub

I have not tested this code, but the idea is here.
Avatar of Temujin

ASKER

your first method worked fine in my project.

Thank you very much mr fnizet.
you're welcome and thanks for the A grade.