Dúvida no botão de ...
 
Notifications
Clear all

Dúvida no botão de minimizar

7 Posts
4 Usuários
0 Reactions
1,402 Visualizações
(@joao0212)
Posts: 28
Eminent Member
Topic starter
 

Galera, boa tarde!!
Estou com um formulário em vba que contém 11 forms.
Andei pesquisando sobre o botão de minimizar e vi que tem que criar uma API em um módulo de classe.
Até ai tudo bem, achei a API e na teoria estava tudo certo...
Porém, não vi em nenhum caso de um formulário com muitos forms como o meu, ai surge a minha dúvida.
É possível isso?
Se sim, poderiam me ajudar?
Desde já agradeço.

 
Postado : 14/01/2014 12:30 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

joao0212,

Boa Tarde!

Do meu conhecimento (que não é lá essas coisas), creio não ser possível o que você está querendo. Se entendi corretamente, você diz que em seu formulário você outros 11 forms... ao que você está se referindo exatamente? Eu entendi que você tem um Formulário Pai (MDI Form)e 11 formulários Filhos Child Fomr). É isso? Se for, eu gostaria, inclusive, de saber como se faz isso com VBA pois, como disse, meu conhecimento sobre isso é insuficiente. Sei fazer em VB mas não em VBA.

Em VBA, inclusive, ao que tudo indica, não é possível. Veja a matéria abaixo:
http://stackoverflow.com/questions/1061 ... orm-in-vba

 
Postado : 14/01/2014 1:01 pm
(@bilokas)
Posts: 168
Reputable Member
 

Tenta colocar isso num Módulo de classe:

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function EnableWindow Lib "user32" (ByVal hWnd As Long, ByVal fEnable As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function SetFocus Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long

Private Const GWL_STYLE As Long = (-16)
Private Const GWL_EXSTYLE As Long = (-20)
Private Const WS_CAPTION As Long = &HC00000
Private Const WS_SYSMENU As Long = &H80000
Private Const WS_THICKFRAME As Long = &H40000
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const WS_POPUP As Long = &H80000000
Private Const WS_VISIBLE As Long = &H10000000

Private Const WS_EX_DLGMODALFRAME As Long = &H1
Private Const WS_EX_APPWINDOW As Long = &H40000
Private Const WS_EX_TOOLWINDOW As Long = &H80

Private Const SC_CLOSE As Long = &HF060

Private Const SW_HIDE As Long = 0
Private Const SW_SHOW As Long = 5

Private Const WM_SETICON = &H80

Dim hWndForm As Long, mbSizeable As Boolean, mbCaption As Boolean, mbIcon As Boolean, miModal As Integer
Dim mbMaximize As Boolean, mbMinimize As Boolean, mbSysMenu As Boolean, mbCloseBtn As Boolean
Dim mbAppWindow As Boolean, mbToolWindow As Boolean, msIconPath As String
Dim moForm As Object
Public Property Let Modal(bModal As Boolean)
    miModal = Abs(CInt(Not bModal))

    'Make the form modal or modeless by enabling/disabling Excel itself
    EnableWindow FindWindow("XLMAIN", Application.Caption), miModal
End Property

Public Property Get Modal() As Boolean
    Modal = (miModal <> 1)
End Property

Public Property Set Form(oForm As Object)

    If Val(Application.Version) < 9 Then
        hWndForm = FindWindow("ThunderXFrame", oForm.Caption)  'XL97
    Else
        hWndForm = FindWindow("ThunderDFrame", oForm.Caption)  'XL2000
    End If

    Set moForm = oForm

    AtualizarEstiloForm

    AtualizarIcone
    
End Property

Private Sub AtualizarEstiloForm()

    Dim iStyle As Long, hMenu As Long, hID As Long, iItems As Integer

    If hWndForm = 0 Then Exit Sub

    iStyle = GetWindowLong(hWndForm, GWL_STYLE)

    iStyle = iStyle Or WS_CAPTION
    iStyle = iStyle Or WS_SYSMENU
    iStyle = iStyle Or WS_THICKFRAME
    iStyle = iStyle Or WS_MINIMIZEBOX
    iStyle = iStyle Or WS_MAXIMIZEBOX
    iStyle = iStyle And Not WS_VISIBLE And Not WS_POPUP

    SetWindowLong hWndForm, GWL_STYLE, iStyle

    iStyle = GetWindowLong(hWndForm, GWL_EXSTYLE)

    iStyle = iStyle And Not WS_EX_DLGMODALFRAME
    iStyle = iStyle Or WS_EX_APPWINDOW

    SetWindowLong hWndForm, GWL_EXSTYLE, iStyle

    hMenu = GetSystemMenu(hWndForm, 0)
    
    ShowWindow hWndForm, SW_SHOW
    DrawMenuBar hWndForm
    SetFocus hWndForm

End Sub

Private Sub AtualizarIcone()

    Dim hIcon As Long

    On Error Resume Next
    
    If hWndForm <> 0 Then

    msIconPath = "C:Meus documentosEUFabioNovo.ico"  'Coloque aquí o seu ícone
        Err.Clear
        If msIconPath = "" Then
            hIcon = 0
        ElseIf Dir(msIconPath) = "" Then
            hIcon = 0
        ElseIf Err.Number <> 0 Then
            hIcon = 0
        ElseIf Not mbIcon Then
            hIcon = ExtractIcon(0, msIconPath, 0)
        Else
            hIcon = 0
        End If

        SendMessage hWndForm, WM_SETICON, True, hIcon
    End If

End Sub

E isso nos formulários:

Option Explicit

Dim nAtualizaForm As New ClasseForm


Private Sub btnOK_Click()
End
End Sub

Private Sub cbModal_Change()
nAtualizaForm.Modal = cbModal.Value
End Sub

Private Sub UserForm_Activate()
Set nAtualizaForm.Form = Me
'Me.cbModal.Value = False
End Sub
 
Postado : 14/01/2014 1:09 pm
(@bilokas)
Posts: 168
Reputable Member
 

Só uma observação. Na hora de declarar a variável no código do formulário, declare ela sempre com o nome que você deu ao módulo de classe.
Se você criou um módulo com o nome Classe1 (nome padrão para o Office idioma PT-BR), então altere tipo da variável para Classe1.
Exemplo:

onde está: Dim nAtualizaForm As New ClasseForm
Deverá ficar: Dim nAtualizaForm As New Classe1 ou o nome que você tiver dado para o se Módulo de classe.

 
Postado : 14/01/2014 1:28 pm
(@joao0212)
Posts: 28
Eminent Member
Topic starter
 

Só uma observação. Na hora de declarar a variável no código do formulário, declare ela sempre com o nome que você deu ao módulo de classe.
Se você criou um módulo com o nome Classe1 (nome padrão para o Office idioma PT-BR), então altere tipo da variável para Classe1.
Exemplo:

onde está: Dim nAtualizaForm As New ClasseForm
Deverá ficar: Dim nAtualizaForm As New Classe1 ou o nome que você tiver dado para o se Módulo de classe.

Bilokas, mto obrigado!!
Deu certinho dessa maneira e enfim entreguei o formulário.
Abraço.

 
Postado : 14/01/2014 2:47 pm
(@joao0212)
Posts: 28
Eminent Member
Topic starter
 

joao0212,

Boa Tarde!

Do meu conhecimento (que não é lá essas coisas), creio não ser possível o que você está querendo. Se entendi corretamente, você diz que em seu formulário você outros 11 forms... ao que você está se referindo exatamente? Eu entendi que você tem um Formulário Pai (MDI Form)e 11 formulários Filhos Child Fomr). É isso? Se for, eu gostaria, inclusive, de saber como se faz isso com VBA pois, como disse, meu conhecimento sobre isso é insuficiente. Sei fazer em VB mas não em VBA.

Em VBA, inclusive, ao que tudo indica, não é possível. Veja a matéria abaixo:
http://stackoverflow.com/questions/1061 ... orm-in-vba

Wagner Morel,
É um formulário com 11 forms e eu podia navegar entre eles..
Form1 pro Form2, Form2 pro Form1, Form2 pro Form3 ... era uma pesquisa que eu tinha que fazer com umas 90 questões e eu distribuir isso em 11 páginas.
( Não sei se deu pra entender direito ), mas enfim, desse jeito que o amigo biloka postou aqui, deu certinho!!
Abraço ...

 
Postado : 14/01/2014 2:51 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Caso seja necessário reabrir o tópico, o autor poderá enviar uma MP para um dos moderadores solicitando o desbloqueio.

 
Postado : 14/01/2014 3:22 pm