Alguns usuários detectaram problemas relacionados ao processo de importação da Classe, para suas máquinas. Através de algumas esquisas realizadas, foi detectado um erro de configuração do Git, onde o arquivo Cls (que assumem uma estrutura de arquivo texto), estava sendo gravado com caracteres bases do Sistema Operacional Linux, que é padrão no Git.
Com a descoberta da origem do problema, foi possível realizar uma tratativa nos arquivos, através da alteração desse padrão do Linux, para o mesmo padrão utilizado pelo Windows.
Com o intuito de facilitar o desenvolvimento de ferramentas, utilizando o processo de programação em VBA do pacote Microsoft Office, iniciou-se o desenvolvimeno desta Classe.
Seu objetivo é a unificação de várias rotinas que utilizam as Funções dos Windows (API´s), através das quais é possível realizar alterações na estrutura dos Formulários (Userform´s) que utilizamos na estrutura do Visual Basic for Application (VBA).
Esta Classe atenderá as diferentes Arquiteturas do Sistema Operacional Windows (32 bits e 64 bits), como também as Arquiteturas do Pacote Microsoft Office (VBA6 e VBA7).
Nesta versão atual do ApiFunction (v1.0.0), são utilizadas as seguintes Funções/Api´s do Windows:
-
FindWindow (user32.dll): A função FindWindow recupera o identificador da janela que possui o nome da classe e da janela combinando com textos específicos. Esta função não pesquisa janelas dependentes.
-
GetWindowLong (user32.dll): A função GetWindowLong recupara informação sobre a janela especificada. A função também recupera valores 32-bit (long) específico de uma janela extra da memória de uma janela.
-
SetWindowLong (user32.dll): A função SetWindowLong modifica um atribudo da janela específica. A função também define valores 32-bit (long) específico de uma janela extra da memória de uma janela.
-
ShowWindow (user32.dll): A função ShowWindow define o status específico de exibição da janela.
-
SetFocus (user32.dll): A função SetFocus define o foco do cursor para a janela especificada. A janela deveria estar associada com a fila de mensagens do threads de chamadas.
-
DrawMenuBar (user32.dll): A função DrawMenuBar redesenha a barra de menu da janela especificada. Se a barra de menu for alterada apos o Windows ter creado a janela, esta função deveria ser chamado para desenhar as modificações do menu bar
-
ExtractIcon (shell32.dll): A função ExtractIcon recupera o identificador de um ícone exetutado de um arquivo específicado,de uma biblioteca (DLL) ou de uma imagem do tipo ico.
-
SendMessage (user32.dll): A função SendMessage envia a mensagem especificada para uma janela(s). A função chama o procedimento da janela para a janela especificada e não retorna até que o procedimento da janela tenha processado a mensagem. A função PostMessage, em contrapartida, posta uma mensagem para uma lista de mensagem em thread e retorna imediatamente.
-
SetLayeredWindowAttributes (user32.dll): A função SetLayeredWindowAttributes define a opacidade e cor chave de transparência de uma camada da janela.
-
SetParent (user32.dll): A função SetParent altera a janela pai de uma janela filha especificada.
Caso tenham interesse em conhecer mais sobre as API´s do Windows, podem acessar o site AllAPI.net e acessar a Lista de Api´s.
Com base nas Funções acima, foram criados Propriedades e Métodos para esta Classe, que irá funcionar como um Framework de Projetos VBA, para realizar alterações na estrutura física do Formulário (Userform). Seguem relação e descrição, de todos os recursos que a Classe oferece. Ressaltando que os nomes das Propriedades e Métodos são em Inglês, para seguir o padrão da língua estrangeira, utilizada como base para a Programação VBA.
Essa propriedade nos permite instanciar o Objeto da Classe, definindo o Formulário (Userform) que será manipulado/personalizado. Definindo essa propriedade, todas as demais já estarão direcionando seus resultados para o Formulário (Userform) definido.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
End Sub
Essa propriedade permite que o desenvolvedor insira os botões de Maximizar e Minimizar, sejam individualmente ou ambos. Para isso, é necessário a selação de uma das seguintes opções:
- WS_FULLSIZING: ativa, de uma só vez, os dois botões (Maximizar e Minimizar);
- WS_MAXIMIZE: ativa somente o botão de Maximizar. O botão de Minimizar fica visível, mas desabilitado para uso;
- WS_MINIMIZE: ativa somente o botão de Minimizar. O botão de Maximizar fica visível, mas desabilitado para uso.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
' Chama a propriedade que irá ativar os botões Minimizar
' e Maximizar os botões na estrutura do Userform.
objApi.ActivateButtons = WS_FULLSIZING
End Sub
Através desta propriedade, é possível inserir um Ícone na Barra de Título do Userform. É preciso apenas informar o caminho onde o arquivo se encontra, para que possa ser passado para as rotinas da propriedade realizarem a transação da imagem para o userform.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
' Passa para a propriedade a localização da imagem
' que será inserida na Barra de título do Userform.
objApi.IconTitleBarForm = ThisWorkbook.Path & "\xyz.ico"
End Sub
Essa propriedade define o Percentual de Opacidade, ou seja, a Transparência que um Userform pode possuir. Geralmente esse é iniciado com 100%, mas o desenvolvedor pode quere desenvolver um formulário com apenas 60% de Opacidade. Basta apenas passar o valor da porcentagem desejada.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
' Define o percentual de opacidade para Userform.
objApi.OpacityPercent = 60
End Sub
Esse método, quando chamado, remove a Barra de Título do Userform definido, quando o Objeto da Classe foi iniciado.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
' Remove a Barra de Título do Userform.
objApi.RemoveTitleBar
End Sub
Esse método, quando chamado, oculta o Botão Fechar da Barra de Título do Userform definido, quando o Objeto da Classe foi iniciado.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
' Esconde o botão Fechar (X) do Userform.
objApi.HideCloseButton
End Sub
Esse método, quando chamado, ativa os botões de Maximizar e Minimizar na Barra de Título do Userform definido. Executa a mesma função que a Propriedade ActiveButtons, mas não é preciso passar parâmetro para a execução.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
' Ativa os botões de Minimizar e Maximizar do
' Userform, como na Propriedade ActivateButtons.
objApi.ActivateDualButtons
End Sub
Esse método, quando chamado, ativa somente o botão de Maximizar na Barra de Título do Userform definido. Executa a mesma função que a Propriedade ActiveButtons, mas não é preciso passar parâmetro para a execução.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
' Ativa somente o botão de Maximizar do
' Userform, como na Propriedade ActivateButtons.
objApi.ActivateMaximizeOnly
End Sub
Esse método, quando chamado, ativa somente o botão de Minimizar na Barra de Título do Userform definido. Executa a mesma função que a Propriedade ActiveButtons, mas não é preciso passar parâmetro para a execução.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
' Ativa somente o botão de Minimizar do
' Userform, como na Propriedade ActivateButtons.
objApi.ActivateMinimizeOnly
End Sub
Esse método, quando chamado, extende o acesso ao Userform para a Barra de Tarefas do Windows. Desta forma, não se torna obrigatório o acesso a esse userform, unica e exclusivamente pelo Applicativo Office.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Define o Userform para sub-objeto da classe.
Set objApi.FormStart = UserForm1
' Ativa o Userform na Barra de Tarefas do Window.
objApi.ShowFormTaskBar
End Sub
Esse método, quando chamado, define um segundo userform como um Userform Pai do userform atual. Isso significa que o Userform Filho fica limitado a área do Userform Pai.
Exemplo:
Option Explicit
Private Sub UserForm_Initialize()
' Declaração do objeto da classe.
Dim objApi As New ApiFunction
' Instancia o novo objeto, a partir da classe.
Set objApi = New ApiFunction
' Define relação enre dos Userforms.
objApi.ParentForms UserForm2.Caption, UserForm1.Caption
End Sub
- Existem alguns Métodos e Propriedades que irão gerar erros, se o valor da propriedade ShowModal de um Useform, não for alterado para False. Uma forma de se fazer isso via código, é passar o parâmetro vbModeless, no método Show, utilizado para a abertura de um Userform.