hi all,

I have one problem with resizing forms.

I am developing our application in vb and i gave code for resizing forms in resize event of form. First i save the sizes of all controls in forms in form load event and then in resize event i resizes all controls of form. So that my application can run on any screen resolution.
My problem is i am using tab control for what is happening is whatever tab is active at the time of running application that controls are visible to me but other tabs controls are not visible.
When i debug the application i found that other controls left value is coming in minus that is -68940.
That's why control is not visible to user after resizing it. I am getting the problem.
Can anybody tell me what is the problem with solution.

Thanks in advance.


7 Years
Discussion Span
Last Post by guest11

In a form_resize event your form will resize. What will not resize and relocate automatically are your controls. They will remain at the locations originally specified in the design view.

So your problem is how do I write code to resize and relocate my controls?

Use ratios. Use ratios. Use ratios. Use ratios. Use ratios. Use algebra. Use algebra. Use Equations.

This is one example.

Find the new left position:

Ratio Formula
Original Width/ New Width = Original Left/ New Left

You know the original width of your form. Let's say it is 2200. After a resize event, it changes to 2800. And you know the current left position of your control:

Dim lngLeft as long
 lngLeft = MyControl.Left

Use your formula:
2200 / 2800 = lngLeft / New Left
The only value you don't know is New Left.

Cross Multiply to solve a ratio Equation: Multiply tops * bottoms. If you know algebra, then you should be able to figure this out.

But in the example it works like this:

2200 * New Left = 2800 * lngLeft

To solve this equation isolate NewLeft:

NewLeft = (2800 * lngLeft) / 2200

You have just solved for the left position of one control.

MyControl.left  = NewLeft

Use the same principle for solving for the top value, but use a different formula:

Original Height / New Height = lngTop / NewTop

In the resize event, you first extract the New Height. extract the current top value of your control. and then use the formula to figure out the NewTop value.

Do the same for Width and Height values of the control.

Original Width / NewWidth = MyControl.Width / NewControlWidth

Isolate the only unknown value in the above equation (New Control Width) as above and set the width as before
Mycontrol.Width = NewControlWidth

Same for Height:

I'll let you figure that out equation.

But another problem that you'll face is how do I deal with 50 controls of different types?

I personally use the Controls Collection in VB6. You can stick this code inside your form in the appropriate places.

Option Explicit
Dim lngCurrentWidth as long,  lngCurrentHeight as long

Private Sub Form_Load
   lngCurrentWidth = Me.Width
   lngCurrentHeight = Me.Height
End Sub

Private Sub Form_Resize()
On error Resume Next
Dim ctl as Control
dim strName as string
dim lngNewWidth as long, lngNewHeight as long

lngNewWidth = Me.Width
lngNewHeight = Me.Height

For each ctl in Me ' Me would refer to the form
   ' Find out which control with the TypeName function
   strName = TypeName(ctl)
   '  You can deal with different controls in the same
   '  way or differently to suit your program using a 
   '  Select Case Logic structure.

   Select Case strName
   Case "CommandButton", "Label", "TextBox"
       ' Code to deal with left, height, Width, and Height
       lngLeft = ctl.left
       lngTop = ctl.Top
       lngWidth = ctl.Width
       lngHeight = ctl.Height
       ' Solve your formulas here and assign the values to the control
       ctl.left = WhateverVariable you've declared for this
       ctl.Top =  '[ ...... 
       ctl.Width = ' ..................
       ' etc.
   Case "PictureBox"
       ' Code to deal with left, height, Width, and Height
   Case Else
   End Select

lngCurrentWidth = lngNewWidth
lngCurrentHeight = lngNewHeight

End Sub

I use the same concept. But when i calculate the current left value then i got that value in minus(value i got is -68550). So whenever i try to calculate the new position using current left value i got that value in minus that is less than zero value and that's why it is not visible to user.


I don't know. It's hard to tell from the info you've given, but really the only 2 values you need to keep track of are the current width and the current height of the form. You notice I track them immediately upon the Form_Load event and at the end of the resize event.

And you should also notice that there is an On Error Resume Next statement at the beginning of the Form_Resize event. Usually, those negative values come from minimizing the window or coming up with a value that doesn't make sense. You may have to write an error loop to catch those negative values in the resize event and make sure that the current width and current height values of the form are not negative. Once they change to negative, you may have problems changing them back.


hi hkdani,

thanks for your support i got my problem. Actually i had taken all controls on tab control, and that's why i am facing that negative value problem. But now i got the solution thanks alot for your support.


This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.