Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: Waldo en Junio 27, 2014, 04:42:32 pm
-
Hola amigos, .net tiene una funcion, o mejor dicho propiedad, que permite setear a un control del form, que quede "anclado" (anchor) a algun borde del form, esta bueno, porque si anclamos a los 4 bordes, tenemos un resize automatico del control.
Bueno, en vb6 esto siempre lo hice a manopla, pero el otro dia cansado dije... haber si me sale algo un poco mas prolijo, y me salio una clase que permite hacer esto.
Permite elegir a que lado queremos anclar, tal vez solo derecha, o tambien abajo
Para usarlo hay que agregar cada control a dimensionar asi:
Private Sub Form_Load()
Set oResize = New cAnchor
'agregar controles para resize
oResize.AddAnchorCtrl Me.Picture1, , , True, True
oResize.AddAnchorCtrl Me.Picture2, False, True, True, True
oResize.AddAnchorCtrl Me.Command1, False, False, True, True
oResize.AddAnchorCtrl Me.Frame1, True, True, True, False
End Sub
Y en el resize del Form, hay que llamar a ReSizeCtrls:
Private Sub Form_Resize()
oResize.ReSizeCtrls Me
End Sub
Les dejo algunas capturas:
(http://oi58.tinypic.com/2q2k08j.jpg)
(http://oi60.tinypic.com/262nuvt.jpg)
(http://oi60.tinypic.com/1gqbl3.jpg)
El codigo:
'---------------------------------------------------------------------------------------
' Module : cAnchor
' Author : Waldo
' Date : 27/06/2014
' Purpose : Resize de controles, simulando la propiedad "Anchor" de vb.net
'---------------------------------------------------------------------------------------
Option Explicit
'coleccion de controles para resize
Private colCtrls As Collection
Public Sub AddAnchorCtrl(ByRef oCtrol As Control, _
Optional bAnchorTop As Boolean = True, _
Optional bAnchorLeft As Boolean = True, _
Optional bAnchorBottom As Boolean = False, _
Optional bAnchorRight As Boolean = False)
Dim NewCtrl As cCtrl
Set NewCtrl = New cCtrl
'guardar las propiedades del control actual en la clase
With NewCtrl
Set .ControlRef = oCtrol
.AnchorBottom = bAnchorBottom
.AnchorLeft = bAnchorLeft
.AnchorRight = bAnchorRight
.AnchorTop = bAnchorTop
End With
'agregar este control a la coleccion de controles
colCtrls.Add NewCtrl, oCtrol.Name
Set NewCtrl = Nothing
End Sub
'llamar cada vez que hace resize el form
Public Sub ReSizeCtrls(ByRef oForm As Form)
Dim xCtrol As cCtrl
For Each xCtrol In colCtrls
RePosCtrl xCtrol, oForm
Next
End Sub
Private Sub RePosCtrl(ByRef oCtrl As cCtrl, ByRef oForm As Form)
Dim oContRef As Control
Dim lNewWidth As Long
Dim lNewHeight As Long
Set oContRef = oCtrl.ControlRef
'anclar TOP
If oCtrl.AnchorTop Then
oContRef.Top = oCtrl.Top
Else
oContRef.Top = oForm.Height - oContRef.Height - oCtrl.Bottom
End If
'anclar LEFT
If oCtrl.AnchorLeft Then
oContRef.Left = oCtrl.Left
Else
oContRef.Left = oForm.Width - oContRef.Width - oCtrl.Right
End If
'anclar Right
If oCtrl.AnchorRight Then
lNewWidth = oForm.Width - oContRef.Left - oCtrl.Right
If lNewWidth < 0 Then lNewWidth = 0
oContRef.Width = lNewWidth
End If
'anclar Bottom
If oCtrl.AnchorBottom Then
lNewHeight = oForm.Height - oContRef.Top - oCtrl.Bottom
If lNewHeight < 0 Then lNewHeight = 0
oContRef.Height = lNewHeight
End If
Set oContRef = Nothing
End Sub
Private Sub Class_Initialize()
Set colCtrls = New Collection
End Sub
Private Sub Class_Terminate()
Set colCtrls = Nothing
End Sub
'---------------------------------------------------------------------------------------
' Module : cCtrl
' Author : Waldo
' Date : 27/06/2014
' Purpose : guarda posiciones originales de un control
'---------------------------------------------------------------------------------------
Option Explicit
'propiedades publicas
'definen lado para anclar
Public AnchorTop As Boolean
Public AnchorLeft As Boolean
Public AnchorBottom As Boolean
Public AnchorRight As Boolean
'privadas de las propiedades
Private m_oControlRef As Object 'control origen
Private m_oForm As Form 'form containner
Private m_lLeft As Long 'posiciones de control original
Private m_lTop As Long
Private m_lHeight As Long
Private m_lWidth As Long
Private m_lRightMargin As Long 'margen calculado right
Private m_lBottomMargin As Long 'margen calculado bottom
Public Property Get ControlRef() As Object
Set ControlRef = m_oControlRef
End Property
Public Property Set ControlRef(ByRef oControlRef As Object)
Dim xContainer As Object
Set m_oControlRef = oControlRef
m_lLeft = oControlRef.Left
m_lTop = oControlRef.Top
m_lHeight = oControlRef.Height
m_lWidth = oControlRef.Width
'obtener el contenedor del control
Set xContainer = oControlRef.Container
'calcular margen right y bottom del control orig
m_lRightMargin = xContainer.Width - oControlRef.Width - oControlRef.Left
m_lBottomMargin = xContainer.Height - oControlRef.Height - oControlRef.Top
End Property
Public Property Get Left() As Long
Left = m_lLeft
End Property
Public Property Let Left(ByVal lLeft As Long)
m_lLeft = lLeft
End Property
Public Property Get Top() As Long
Top = m_lTop
End Property
Public Property Let Top(ByVal lTop As Long)
m_lTop = lTop
End Property
Public Property Get Height() As Long
Height = m_lHeight
End Property
Public Property Let Height(ByVal lHeight As Long)
m_lHeight = lHeight
End Property
Public Property Get Width() As Long
Width = m_lWidth
End Property
Public Property Let Width(ByVal lWidth As Long)
m_lWidth = lWidth
End Property
Public Property Get Right() As Long
Right = m_lRightMargin
End Property
Public Property Let Right(ByVal lRight As Long)
m_lRightMargin = lRight
End Property
Public Property Get Bottom() As Long
Bottom = m_lBottomMargin
End Property
Public Property Let Bottom(ByVal lBottom As Long)
m_lBottomMargin = lBottom
End Property
y aca todo el proyecto
http://www.mediafire.com/download/l5d37ybda74cqz9/cAnchor.rar
-
Guau que interesante, gracias por el aporte, de noche lo bajo para darle una checada. Bien alli.
Saludos
-
muy bueno ;D gran aporte
-
Hola Waldo Antes que nada de nuevo gran aporte al igual que todo lo que hay en este foro, tengo una pregunta y es que mis conocimientos son basicos en vb6 y estube tratando pero no doy con la solución.
pregunta: es posible bueno que hal llegar a cierto width y height no haga Resize que el form quedara un ejemplo en border style fixed single
ejemplo tamaño del form original width 8700 height 9300 y que apartir de ahi generara el resize pero menos de esos valores quedara estatico.
bueno de antemano agradecere sus comentarios saudos y gracias
-
hmm, no está pensado asi, se podria modificar, pero si el form hace resize con un tamaño menor a xx, y segun tu caso no deberia hacer resize de los controles, el control no se veria completo en el form, por ej si es un textbox, alguien reduce el ancho del form y el textbox, ya no se veria, entendi bien?
-
Hola waldo gracias por contestar en efecto en efecto va encaminado a eso, entiendo tu punto de la funcion anchor esta perfecta, mi pregunta va encamiada a en mi duda es que si hacen un resize manual al formulario haciendolo mas pequeño se pierden algunos controles, es algo que no pierde funcionalidad el aplicativo claro, pero quisiera saber si sera posible obvio no necesario dentro dela misma clase claro, que si el usuario intenta un resize al form si este es menor al width < xx o heigth < xx no lo haga solo si es width > xx o heigth > xx de antemano gracias waldo por tu comentario saludos
-
Si en realidad queres que no puedan achicar el form a menos de xxx pixels, eso lo tendrias que manejar vos directamente en el resize del form.
-
Gracias Waldo
-
Buen Aporte!
En cuanto pueda lo pruebo
Hola Waldo Antes que nada de nuevo gran aporte al igual que todo lo que hay en este foro, tengo una pregunta y es que mis conocimientos son basicos en vb6 y estube tratando pero no doy con la solución.
pregunta: es posible bueno que hal llegar a cierto width y height no haga Resize que el form quedara un ejemplo en border style fixed single
ejemplo tamaño del form original width 8700 height 9300 y que apartir de ahi generara el resize pero menos de esos valores quedara estatico.
Creo que lo que buscas es esto: Limitar tamaño formulario (http://leandroascierto.com/foro/index.php?PHPSESSID=d794257c7e5f0521f320e30bbc0179f8&topic=276.msg1420#msg1420)
Más info aca: 139 - Hook para impedir el cambio de tamaño de una ventana - formulario (http://www.recursosvisualbasic.com.ar/htm/listado-api/139-hook-size-window.htm)
Lo que hace el codigo es limitar el tamaño minmo, tambien se puede limitar el maximo (uno / ambos a la vez) :P
-
hola raul338 muchas gracias