VB - Formulários revisitados


No artigo - Usando Formulários no VB - abordei as principais propriedades e métodos dos formulários. Em continuação vou mostar algumas aplicações práticas da utilização dos formulários que podem ser úteis no seu dia a dia de programador VB.

Em todos os exemplos você deverá iniciar um novo projeto padrão EXE no VB e usar o formulário padrão.

1- Ficando sempre por cima

Quer manter o seu formulário sempre por cima de qualquer outro formulário Windows ?

- Insira um novo módulo no seu projeto e digite o código abaixo no módulo : Nele temos a declaração das constantes , da API - SetWindowPos - e da função SemprePorCima(frm As Form) usada para manter seu form sempre por cima.

Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40

Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)


Public Sub SemprePorCima(frm As Form)
SetWindowPos frm.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOZORDER + SWP_NOMOVE + SWP_NOSIZE
End Sub

- Agora no formulário que você deseja por sempre por cima basta inserir o código : O código invoca a função SemprePorCima e passa como argumento o formulário atual (Me).

SemprePorCima Me
Ao executar o projeto e abrir qualquer outra janela , seu form sempre estará por cima.
2- Como impedir que o usuário altere o tamanho do meu formulário ?

Vamos supor que o seu formulário tenha as seguintes medidas de altura e largura : 2415(Height) e 3840(Width). No evento Resize do formulário insira o código abaixo:

Private Sub Form_Resize()   )
Select Case Me.Height
   Case Is < 2415
      Me.Height = 2415
   Case Is > 2415
      Me.Height = 2415
End Select
Select Case Me.Width
  Case Is < 3840
    Me.Width = 3840
  Case Is > 3840
    Me.Width = 3840
End Select
End Sub
No evento Resize do formulário insira o código ao lado .

-Ele não permite que as medidas do formulário seja alterada pelo usuário

-Se as medidas forem alteradas além da altura e largura definida elas voltam ao valor padrão.

3- Como impedir que o seu formulário seja fechado quando o usuário clicar no 'botão' (X) do formulário ?
Para impedir que o formulário seja fechado apenas inclua o código abaixo no evento QueryUnload() :
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Cancel = -1
End Sub
4-  Como mover um formulário que não possua a barra de título ?
Para mover uma formulário você clica na barra de título do formulário e arrasta o form para onde quiser , certo ??
E se o formulário não tiver a barra de título ? Então faça o seguinte:

- Declare as APIs -SendMessage- e - ReleaseCapture - e as constantes na seção General Declarations do formulário:

Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Sub ReleaseCapture Lib "User32" ()

Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2

- No evento - MouseMove - do formulário insira o código abaixo que permite que você mova o formulário:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lngReturnValue As Long
If Button = 1 Then
Call
ReleaseCapture
lngReturnValue =
SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End If
End Sub

5- Como mover um controle em tempo de execução ?

Usando as mesmas API´s podemos mover um controle em tempo de execução no formulário , é só fazer a referência ao controle que deseja mover na API SendMessage e usar o evento MouseDown do controle. Vamos supor que o formulário tenha um controle Picture - Picture1 - que você quer mover , então faça assim :

Na seção General Declarations declare as APIs como acima e as constantes ( elas são diferentes):

Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub
ReleaseCapture Lib "User32" ()

Const
WM_SYSCOMMAND = &H112
Const
SC_MOVE = &HF012

Agora no evento MouseDown do controle - Picture1 - insira o seguinte código :

Private Sub PICTURE1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lngReturnValue As Long
If Button = 1 Then
Call ReleaseCapture
lngReturnValue =
SendMessage(Picture1.hWnd, WM_SYSCOMMAND, SC_MOVE, 0)
End If
End Sub

Pronto , agora é so clicar no controle e arrastar para onde quiser.

6- Quer saber se o seu formulário já esta carregado ?

Para saber se o formulário esta carregado basta verificar a coleção de formulários - Forms - conforme o código abaixo:

Private Function AchaFormulario(ByVal form_name As String) As Form
Dim i As Integer

' Assume que não esta carregado
Set AchaFormulario = Nothing

' procura o formulário
For i = 0 To Forms.Count - 1
   If Forms(i).Name = form_name Then
   ' Se achar retorna o nome do formulario
      Set AchaFormulario = Forms(i)
      Exit For
   End If
Next i
End Function

7- Quer desabilitar todos os controles em um formulário ?

Simples !!! basta percorrer os controles no formulário e atribuindo o valor False a propriedade Enabled. Veja código abaixo:

Dim i As Integer

For i = 0 To Form1.Controls.Count - 1
    Form1.Controls(i).Enabled = False
Next i

8- Por que meu formulário não aparece na barra de tarefas ?

Um formulário sempre irá aparecer na barra de tarefas , a menos que qualquer um dos seguintes itens seja verdadeiro :

  1. A propriedade ShowInTaskBar do formulário esta definida como False
  2. O formulário for um formulário MDI filho
  3. A propriedade BorderStyle do formulário estiver definida como :
    1. Fixed Dialog
    2. Fixed ToolWindow
    3. Sizeable ToolWindow
Até o próxima artigo ... Bye...

José Carlos Macoratti