Notifications
Clear all

Anular Botão (X) de fechar não funciona!

6 Posts
3 Usuários
0 Reactions
2,010 Visualizações
(@sagrado7)
Posts: 0
New Member
Topic starter
 

Saudações,
Estou tentando fazer com que o botão de fechar (X) do Formulário fique desabilitado, para que o usuário não feche o FrmCadastro clicando no botão de fechar (X). Vasculhei a internet e achei um monte de códigos, porém nenhum funcionou. Estou pondo o código no Form.
Testei Esse:

Private Sub FrmCadastro_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then
Cancel = True
End If
End Sub

E esse:
Private Sub FrmCadastro_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Cancel = True
MsgBox "Favor sair do programa clicando no botão 'Sair'" _
, vbCritical _
, "Erro"
End If
End Sub

 
Postado : 24/11/2014 7:55 am
(@sagrado7)
Posts: 0
New Member
Topic starter
 

Descobri qual era o problema! Estava usando o nome do Formulario em vez de UserForm. Mas para sumir o botão X da janela ainda não consegui, estou usando Excel 2007 com Windows 7 64 bits.
Talvez o código abaixo só funcione para sistemas 32bits:

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Public Sub RemoverBotaoFechar(ByVal hwnd As Long)
Const SC_CLOSE = &HF060
Const MF_BYCOMMAND = 0
Dim hMenu As Long
' Menu handle
hMenu = GetSystemMenu(hwnd, 0)
' Remover Botão Fechar
RemoveMenu hMenu, SC_CLOSE, MF_BYCOMMAND
End Sub

 
Postado : 24/11/2014 8:14 am
(@trindade)
Posts: 0
New Member
 

Bom dia, sagrado7.

Tenta utilizar assim:

Modulo

' ### INSERIR EM UM MODULO ### '
Private Declare PtrSafe Function FindWindow Lib "user32" _
                 Alias "FindWindowA" _
                       (ByVal lpClassName As String, _
                        ByVal lpWindowName As String) _
                        As Long

Private Declare PtrSafe Function GetWindowLong Lib "user32" _
                  Alias "GetWindowLongA" _
                        (ByVal hWnd As Long, _
                         ByVal nIndex As Long) _
                         As Long

Private Declare PtrSafe Function SetWindowLong Lib "user32" _
                  Alias "SetWindowLongA" _
                        (ByVal hWnd As Long, _
                         ByVal nIndex As Long, _
                         ByVal dwNewLong As Long) _
                         As Long
Const GWL_STYLE = (-16)
Const WS_SYSMENU = &H80000

Sub EscondeX(xForm)
    Dim hWnd As Long
    Dim GetStyle As Long
    Dim StApp As String
    Select Case Int(Val(Application.Version))
           Case 8
             'Formulario em MSExcel97
              StApp = "ThunderXFrame"
           Case Is > 8
             'Formulario em MSExcel200x
              StApp = "ThunderDFrame"
    End Select
    hWnd = FindWindow(StApp, xForm.Caption)
    GetStyle = GetWindowLong(hWnd, GWL_STYLE)
    'foi-se o X
    SetWindowLong hWnd, GWL_STYLE, GetStyle And Not WS_SYSMENU
End Sub

UserForm

' ### NO USERFORM FICA ASSIM ### '
Private Sub UserForm_Initialize()
    EscondeX Me
End Sub

Tenho um arquivo que utiliza esse código no Excel 64 bit testei tanto na versão 2010 e 2013 esta funcionando normal.

 
Postado : 24/11/2014 8:16 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Esse assunto temos de sobra em nossa base de dados, lembre se de usar a pesquisa do fórum!!

Att

 
Postado : 24/11/2014 8:50 am
(@sagrado7)
Posts: 0
New Member
Topic starter
 

O problema não era falta de pesquisa, e sim erro de sintaxe. Agradeço pela ajuda.

 
Postado : 01/12/2014 6:58 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

sagrado

Se o tópico foi resolvido, clique no botão V ( após o botão editar e X) da resposta que te atendeu para dar o tópico como resolvido.

Clique na mãozinha que fica do lado da ferramenta Citar os colaboradores que te ajudaram.

[]s

 
Postado : 01/12/2014 12:15 pm