Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB6: Posicionamento e Redimensionamento de Controlos

O VB.NET tem uma  propriedade nos controlos que permite-os redimensionar e posicionar no formulário através da opção Anchor. Este ancoramento permite que um controlo aumente/diminua ou desloque-se quando o formulário é redimensionado, melhorando bastante esteticamente e funcionalmente a aplicação.

O Visual Basic 6 não tem esta possibilidade de uma forma automática sendo necessário recorrer a cálculos para o fazer. Uma das opções mais comuns que os programadores utilizam para ultrapassar este processo demorado e normalmente complexo é retirar a possibilidade de aumentar o tamanho do formulário. Mas isto não é algo que o utilizador esteja habituado em ambiente Windows nem é algo que traga valor acrescentado à aplicação.

Uma das hipóteses que resolve este problema é utilizando as classes clsAutoPositioner.cls e clsAutoPositionerItem.cls. Estas classes são de código livre, encontram-se disponíveis na Internet e permitem efectuar com grande facilidade este processo. Podem ver o exemplo inicial (Figura 1) e o resultado final (Figura 2) .

 
   (Figura 1)



    (Figura 2)

Para as utilizarem é necessário criar duas classes com o seguinte código:

clsAutoPositioner.cls

‘ ***
‘ *** Início da classe clsAutoPositioner
‘ ***
Option Explicit

Dim m_oAssignments As New Collection

Public Function AddAssignment(ctl As Object, ctlRelative As Object, tPosType As tPOSITION_TYPE)

Dim x As New clsAutoPositionerItem
Set x.oCTL = ctl
Set x.oREL = ctlRelative
x.tPosType = tPosType

Select Case x.tPosType
    Case tCONTAINER_RELATIVE_POS_RIGHT
            x.lValue = x.oREL.Width - x.oCTL.Left
    Case tCONTAINER_RELATIVE_POS_BOTTOM
            x.lValue = x.oREL.Height - x.oCTL.Top
    Case tCONTAINER_WIDTH_DELTA_RIGHT
            x.lValue = x.oREL.Width - (x.oCTL.Left + x.oCTL.Width)
    Case tCONTAINER_HEIGHT_DELTA_BOTTOM
            x.lValue = x.oREL.Height - (x.oCTL.Top + x.oCTL.Height)
    Case tCONTROL_RELATIVE_SAME_POS_VERTICAL
            x.lValue = x.oCTL.Left - x.oREL.Left
    Case tCONTROL_RELATIVE_SAME_POS_HORIZONTAL
            x.lValue = x.oCTL.Top - x.oREL.Top
End Select

m_oAssignments.Add x

End Function

     

Public Function RefreshPositions()
Dim i As Long
Dim x As clsAutoPositionerItem
Dim erg As Long

For i = 1 To m_oAssignments.Count
    Set x = m_oAssignments.Item(i)

    Select Case x.tPosType
        Case tCONTAINER_RELATIVE_POS_RIGHT
            erg = x.oREL.Width - x.lValue
            If (erg > 0) Then x.oCTL.Left = erg
        Case tCONTAINER_RELATIVE_POS_BOTTOM
            erg = x.oREL.Height - x.lValue
            If (erg > 0) Then x.oCTL.Top = erg
        Case tCONTAINER_WIDTH_DELTA_RIGHT
            erg = x.oREL.Width - x.oCTL.Left - x.lValue
            If (erg > 0) Then x.oCTL.Width = erg
        Case tCONTAINER_HEIGHT_DELTA_BOTTOM
            erg = x.oREL.Height - x.oCTL.Top - x.lValue
            If (erg > 0) Then
                x.oCTL.Height = erg
            Else
                erg = erg
            End If           

        Case tCONTROL_RELATIVE_SAME_POS_VERTICAL
            erg = x.oREL.Left + x.lValue
            x.oCTL.Left = erg
        Case tCONTROL_RELATIVE_SAME_POS_HORIZONTAL
            erg = x.oREL.Top + x.lValue
            x.oCTL.Top = erg
    End Select
Next

End Function     

clsAutoPositionerItem.cls

‘ ***
‘ *** Início da classe clsAutoPositionerItem
‘ ***
Public Enum tPOSITION_TYPE
    tCONTAINER_RELATIVE_POS_RIGHT
    tCONTAINER_RELATIVE_POS_BOTTOM
    tCONTAINER_WIDTH_DELTA_RIGHT
    tCONTAINER_HEIGHT_DELTA_BOTTOM
    tCONTROL_RELATIVE_SAME_POS_VERTICAL
    tCONTROL_RELATIVE_SAME_POS_HORIZONTAL
End Enum

Public oCTL As Object
Public <?xml namespace="" ns="urn:schemas-microsoft-com:office:smarttags" prefix="st1" ?>oRELAs Object
Public tPosType As tPOSITION_TYPE
Public lValue As tPOSITION_TYPE



Para as implementar, e após a criação destas classes num projecto, deverão utilizar o seguinte código (com as adaptações necessárias):

‘ Declaração de uma variável a nível do form privada
Private m_oAutoPos As New clsAutoPositioner     

‘ No evento load do form define-se quais os controlos e que são afectados
‘ e que acção é efectuada (posicionamento e/ou redimensionamento)
Private Sub Form_Load()

  With m_oAutoPos
  ‘ posição relativo à direita
  .AddAssignment Me.Command1, Me, tCONTAINER_RELATIVE_POS_RIGHT

   ' Redimensionamento horizontal
  .AddAssignment Me.Command2, Me, tCONTAINER_WIDTH_DELTA_RIGHT

  ‘ Redimensionamento vertical
 .AddAssignment Me.Command3, Me, tCONTAINER_HEIGHT_DELTA_BOTTOM

 ' Posição relativo em baixo
.AddAssignment Me.Command4, Me, tCONTAINER_RELATIVE_POS_BOTTOM

   ' Redimensionamento horizontal e vertical
 .AddAssignment Me.Command5, Me, tCONTAINER_WIDTH_DELTA_RIGHT
 .AddAssignment Me.Command5, Me, tCONTAINER_HEIGHT_DELTA_BOTTOM
 End With

End Sub

‘ Quando é alterado o tamanho do form
Private Sub Form_Resize()
    m_oAutoPos.RefreshPositions
End Sub

‘ Limpa da memória a variável
Private Sub Form_Unload(Cancel As Integer)
    Set m_oAutoPos = Nothing
End Sub

Estas classes e este processo permitem melhorar a aplicação e dar ao utilizador algo que normalmente está habituado em ambiente Windows. É verdade que no VB.NET esta funcionalidade está disponível através de uma das propriedades dos controlos, mas no VB6, e com poucas linhas de código, pode-se também implementar.


PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

2 comentários:

Thiago disse...
Este comentário foi removido pelo autor.
Rengaw Lerom disse...

Prezado Jorge Paulino,
Parabéns pela sua dica como redimensionar formulários e controles no VB6. Gostaria de saber se você pode me ajudar. Estou desenvolvendo algo em VBA para Word 2007 onde o usuário final precisa digitar muitas informações em um formulário. Como a quantidade de controles no formulária vai variar de acordo com as respostas do usuário, gostaria de saber como devo fazer para redimensionar o tamanho do formulário de acordo com a quantidade de controles que o mesmo venha a ter. Ou seja, coloquei uma barra de rolagem vertical no form, todavia, o form precisa crescer ou diminuir, dinâmicamente, de acordo com a quantidade de controles que o mesmo tenha.

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico