Greetings.
I have a form loaded and in this form, I have a listbox plus a button.
When the button is clicked, a dialog box will appear alongside with the form.
In the dialog box, there is a combo box, in which the user must select something from.
Once the OKbutton is clicked, the value that is selected in the dialog box would be displayed in the form's listbox.
After that, this process can go on repeatedly such that, if I'd like to add 3 new values, I'd activate the dialog box 3 times.

My problem is, where can I place my function call to get the values from the dialog box. Initially, I placed it in the Form_Paint() function which is totally wrong, because the value duplicates everytime i move the form/minimize&maximize it.
After that, I placed it in Form_Activate() function & Form_GotFocus & both cannot work.
Please advice. :sad:

Recommended Answers

All 19 Replies

when you call your second form do.
formblah.show vbmodal

then call your function right after that statment.

vbmodal will hold exectuion of the parent window while the child window is open. This is why you can retrieve the value as the next statment in your code.

Greetings.
Thanks for the input.
Hey, it works! Hooray! Thanks.

Glad to be of assistance :p

Greetings.
You are indeed of great assistance.
By the way, regarding the Private Sub Form_Activate(), is it true that it is better to store initializations there instead of Private Sub Form_Load()?
I remember I've read somewhere that it is more efficient to store into Form_Activate().
What's the difference?

I'm trying to solve this problem - passing data between 2 forms. The 2nd Form has to take a value stored in a String from the 1st Form.
I have made the String variable in the 1st Form as Public. At the start of execution, it works fine. When I press 'Back' on the 2nd Form, I go to the 1st Form. There I insert a different value & when I click to go on to the 2nd Form, it takes the value from the previous value. At the 3rd try, it takes the value that I have inserted during the 2nd try as if it is slowed down by 1 step. LOL. I can't figure out which is wrong.
Is it because of the Load form2 & Unload form1 sequence of execution?
Please advise.

#1: the only diffrence between the 2 is form load, gets called every time you call Load formblah, while Form_Activate gets called every time you do formblah.show. that's the only diffrence.

#2 create a public function in a module, also if you wish to pass data between the 2 create the public variables you need outside the fucntion. then have the function call the second window formblah.show, vbmodal. right before you exit this window make sure you dump any information you want shared into the public variables you have created. when control is passed back to the module you then make your function return the value of the public variables!

Greetings.
#1 : Got what you meant. Thanks.
#2 : Not sure if I fully understand. But, I'll give it a try and return with questions if I'm stuck.
Thanks a lot. ;)

haha, I didn't think so... its really late for me, and my mind is half shutoff. (2:35am) Ill repost again tom with an example and explain it better.... goodnight!

Greetings.
Woah, it's really late, dude. Good nite! ;)
Thanks for the effort. Looking forward to gain something from your lecture tomorrow. :-)

Greetings.
Bringing back an old topic.
But not dialog box this time around.
Same problem: passing variables between forms.
Issue: Form Load & Unload.
Previously, without proper testing of each and every cases, the output was like what I have expected, so I thought I would have no problem.

[1] Again, on the arrangement of Load Form1 vs. Unload Form2
Initially, I thought it doesn't matter but not until I found that it actually matters!
I realise that when I put Unload Form1 before Load Form2, I would not be able to
use the Public variables in Form1. And so, I placed Load Form2 before Unload
Form1.

The problem arises here when I did step [1]. I load Form3 from Form2. I deem that the error occurs because although in Form2, I have Load Form3 followed by Unload Form2, when Form3 is showed Form1 & Form2 is still loaded in the memory because everything goes in a sequence:

Load Form1
Load Form2
Load Form3
Unload Form3
Unload Form2
Unload Form1

Actually, the real scenario goes like this:
Forms: Form1, Form2, Form3.
Form3 can be loaded by Form1 and Form2.
Therefore, in Form3, I'd like to code for different activities for different form that loaded Form3. How can I achieve that?
I did ->

' Form3
Private Sub Form_Load()
  If Form1.cmdGo Then
    ' Do something
  ElseIf Form2.cmdGo Then
    ' Do something
  End If
End Sub

However, I realised later that this is not right, because when I clicked on the navigation menu on the left hand side of the form to go to Form2, then Form3, it works fine. Continue with clicking on Form1, then Form3 -> output was not as expected, because, it doesn't go to the ElseIf all the time when at the beginning Form1.cmdGo is evaluated True. :-|
Sorry, I know it's a bit confusing there, but I hope someone would understand my problem.

You're going to have to restate your question here as it really doesn't make sense. Anyway here's something to think about when working with lots of forms like this. Let's say you have 3 forms, Form1,Form2,Form3. There is a button on Form1 that pops up Form2 and a button on Form2 that pops up Form3. Lets say the buttons are called btnForm2Pop and btnForm3Pop

'
'Form1 Code
'
Private Sub btnForm2Pop_Click()
  Form2.Show
  MsgBox "I just popped Form2"
End Sub
'
'Form2 Code
'
Private Sub btnForm2Pop_Click()
  Form3.Show vbModal, Me
  MsgBox "I just popped Form3"
End Sub

When you click the button on Form1 the message box will be popped up as Form2 does not have exclusive control. So any code after showing the Form will be executed after the form load event of Form 2. However, when you click the button on Form2 execution of Form2 code is held up until Form3 is unloaded or hidden. So, the message box will not pop up until you close Form 3.

I don't know if this answers your question, but I hope it helps around the edges a bit.

Greetings. Morning!
Thanks for your reply and sorry for making you confused.
I guess I got you.
So, vbModal is very important here.
What about the sequence of coding for:-

Load Form1
Form1.show

Unload Form2

Do I put the Load command first before Unload or vice-versa?
Or it really doesn't matter?

You're going to have to ask a better question, again I don't really understand what you are asking.

Hi everyone,
For you to transfer information from form 3 to form 1 or what ever way you like declare an appropriate variable as global(outside all onclick events) and pass your local variable(inside your onclick events) to that global variable thus enabling any of the forms to get the information.

Form.Show (to show the form)


Yours Sincerely

Richard West

Greetings.
Thanks a lot for all your replies.
Mnemtsas, I think I now truly understood the usage of vbModal and using it solved my problems.
However, one more small problem here.
I decided to upload a few screenshots to avoid confusions.

You see, in Form1, I only have 1 candidate in the list, initially.
[IMG]http://redevolve.bravehost.com/Form1.jpg[/IMG]

When I click "Add Candidate", another form (Form2) would appear.
I then select a candidate to add from there.
In Form2, after selecting a candidate, I click "Add Candidate".
[IMG]http://redevolve.bravehost.com/Form2.jpg[/IMG]

Form2 will be unloaded and the name of the selected candidate would then appear in Form1's list. The code is alright.
[IMG]http://redevolve.bravehost.com/Form1-b.jpg[/IMG]

The problem is here:- Just before the lines where the new candidate is added to the list, I added a MsgBox "test" to see where goes wrong.
When I do that, after clicking the OK button in MsgBox, the candidate's name appeared in the list. When I remove the msgbox, the name won't appear.
What's wrong here? I suggest there should have some "return 0;" statements like in C for this? Hehe...I don't know. Can someone please advise me on this? :-|

Try putting this code

Form1.Refresh
DoEvents

Just after the code where you add the item to the list.

If this doesn't work perhaps you could email me the code and I'll take a look offline.

Greetings.
Hey, thanks a lot for your advice.
Btw, just to let you know, I insert those 2 lines after the list.additem but there wasn't any signs.
I tried inserting them just before the list.additem and it worked.
Any idea whether the effect or whatever that's working in the background would be different? Could you please explain what does doevents do?
Thanks.

Snipped from MSDN

Using DoEvents


Although Timer events are the best tool for background processing, particularly for very long tasks, the DoEvents function provides a convenient way to allow a task to be canceled. For example, the following code shows a "Process" button that changes to a "Cancel" button when it is clicked. Clicking it again interrupts the task it is performing.

' The original caption for this button is "Process".
Private Sub Command1_Click()
   ' Static variables are shared by all instances 
   ' of a procedure.
   Static blnProcessing As Boolean
   Dim lngCt As Long
   Dim intYieldCt As Integer
   Dim dblDummy As Double
   ' When the button is clicked, test whether it's 
    'already processing.
   If blnProcessing Then
      ' If processing is in progress, cancel it.
      blnProcessing = False
   Else
      Command1.Caption = "Cancel"
      blnProcessing = True
      lngCt = 0
      ' Perform a million floating-point 
      ' multiplications. After every
      ' thousand, check for cancellation.
      Do While blnProcessing And (lngCt < 1000000)
         For intYieldCt = 1 To 1000
            lngCt = lngCt + 1
            dblDummy = lngCt * 3.14159
         Next intYieldCt
         ' The DoEvents statement allows other 
         ' events to occur, including pressing this 
         ' button a second time.
         DoEvents
      Loop
      blnProcessing = False
      Command1.Caption = "Process"
      MsgBox lngCt & " multiplications were performed"
   End If
End Sub

DoEvents switches control to the operating-environment kernel. Control returns to your application as soon as all other applications in the environment have had a chance to respond to pending events. This doesn't cause the current application to give up the focus, but it does enable background events to be processed.

The results of this yielding may not always be what you expect. For example, the following Click-event code waits until ten seconds after the button was clicked and then displays a message. If the button is clicked while it is already waiting, the clicks will be finished in reverse order.

Private Sub Command2_Click()
   Static intClick As Integer
   Dim intClickNumber As Integer
   Dim dblEndTime As Double
      ' Each time the button is clicked, 
      ' give it a unique number.
   intClick = intClick + 1
   intClickNumber = intClick
      ' Wait for ten seconds.
   dblEndTime = Timer + 10#
   Do While dblEndTime > Timer
      ' Do nothing but allow other 
      ' applications to process
      ' their events.
      DoEvents
   Loop
   MsgBox "Click " & intClickNumber & " is finished"
End Sub

You may want to prevent an event procedure that gives up control with DoEvents from being called again before DoEvents returns. Otherwise, the procedure might end up being called endlessly, until system resources are exhausted. You can prevent this from happening either by temporarily disabling the control or by setting a static "flag" variable, as in the earlier example.

Avoiding DoEvents When Using Global Data
It may be perfectly safe for a function to be called again while it has yielded control with DoEvents. For example, this procedure tests for prime numbers and uses DoEvents to periodically enable other applications to process events:

Function PrimeStatus (TestVal As Long) As Integer
   Dim Lim As Integer
   PrimeStatus = True
   Lim = Sqr(TestVal)
   For I = 2 To Lim
      If TestVal Mod I = 0 Then
         PrimeStatus = False
         Exit For
      End If
      If I Mod 200 = 0 Then DoEvents
   Next I
End Function

This code calls the DoEvents statement once every 200 iterations. This allows the PrimeStatus procedure to continue calculations as long as needed while the rest of the environment responds to events.

Consider what happens during a DoEvents call. Execution of application code is suspended while other forms and applications process events. One of these events might be a button click that launches the PrimeStatus procedure again.

This causes PrimeStatus to be re-entered, but since each occurrence of the function has space on the stack for its parameters and local variables, there is no conflict. Of course, if PrimeStatus gets called too many times, an Out of Stack Space error could occur.

The situation would be very different if PrimeStatus used or changed module-level variables or global data. In that case, executing another instance of PrimeStatus before DoEvents could return might result in the values of the module data or global data being different than they were before DoEvents was called. The results of PrimeStatus would then be unpredictable.

Greetings.
Thanks a lot for your help all the way through. ;)

Greetings.
Thanks a lot for your help all the way through. ;)

No worries, feel free to ask any time!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.