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
TemujinAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

fnizetCommented:
You can disable the calling form.
Let's say MainForm calls ModalForm (which is not modal at all), you'll do
ModalForm.Show
MainForm.enabled = false

Then in ModalForm, you can do to call your DropDownForm :
DropDownForm.Show
ModalForm.enabled = false

When you close your "modal-est" form, you just enable the calling form. Let's say you have a button to close the DropDownForm :
Sub CloseDropDown_Click()
    Me.Hide
    ModalForm.enabled = true
End Sub

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
fnizetCommented:
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.
0
TemujinAuthor Commented:
your first method worked fine in my project.

Thank you very much mr fnizet.
0
fnizetCommented:
you're welcome and thanks for the A grade.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic Classic

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.