Usando formulários com classe – parte 2: formulário
No artigo anterior vimos a primeira parte do projeto de criar um
formulário com uma classe. Deixamos a classe “praticamente” pronta,
fazendo as funcionalidades planejadas (entre aspas, veremos o motivo
mais adiante). Neste artigo iremos fazer o formulário e usar a classe
criada para escrever na planilha. Desenhei o seguinte formulário:
formulário com uma classe. Deixamos a classe “praticamente” pronta,
fazendo as funcionalidades planejadas (entre aspas, veremos o motivo
mais adiante). Neste artigo iremos fazer o formulário e usar a classe
criada para escrever na planilha. Desenhei o seguinte formulário:
Vemos aqui todas as propriedades do funcionário que temos na planilha:
Registro, Nome do funcionário, Data de nascimento,
CPF, Cargo e Salário. Temos cinco botões:
Cadastrar, Alterar, Desligar, Sair e
Pesquisar nome, que é o botão pequeno ao lado do campo
Nome do funcionário. Há um botão Recontratar oculto
embaixo do Desligar. Temos ainda duas caixas de listagem:
Nome do funcionário e Cargo.
Aqui
tem o formulário para baixar, caso não queira desenhar um novo. Há dois
arquivos dentro, um .frm e um .frx. Importe o .frm pelo editor de VBA, o
.frx deve estar na mesma pasta, senão acontece um erro e não
importa.
Registro, Nome do funcionário, Data de nascimento,
CPF, Cargo e Salário. Temos cinco botões:
Cadastrar, Alterar, Desligar, Sair e
Pesquisar nome, que é o botão pequeno ao lado do campo
Nome do funcionário. Há um botão Recontratar oculto
embaixo do Desligar. Temos ainda duas caixas de listagem:
Nome do funcionário e Cargo.
Aqui
tem o formulário para baixar, caso não queira desenhar um novo. Há dois
arquivos dentro, um .frm e um .frx. Importe o .frm pelo editor de VBA, o
.frx deve estar na mesma pasta, senão acontece um erro e não
importa.
pesquisar funcionários pelo nome e nem uma de geração de lista com os
nomes dos funcionários. Devemos fazer uma rotina no formulário para
fazer a pesquisa? Negativo, lembre-se da imagem de como deve ser
feito:
O formulário deve se comunicar exclusivamente com a classe, que por sua
vez irá fazer a comunicação com a planilha. Desta forma, sabemos que
precisaremos criar mais duas funções na classe: uma para efetuar a
pesquisa pelo nome, retornando verdadeiro quando encontrado (e os
dados para a classe) e falso quando não encontrado, outra para
gerar uma lista com os nomes dos funcionários para popular a caixa de
listagem de funcionários.
vez irá fazer a comunicação com a planilha. Desta forma, sabemos que
precisaremos criar mais duas funções na classe: uma para efetuar a
pesquisa pelo nome, retornando verdadeiro quando encontrado (e os
dados para a classe) e falso quando não encontrado, outra para
gerar uma lista com os nomes dos funcionários para popular a caixa de
listagem de funcionários.
Vemos também que precisaremos de gerar a lista de cargos. Em primeiro
lugar, vamos criar uma planilha chamada Listas com o nome de
código PlListas e colocar os dados de uma lista hipotética de
cargos:
Vamos fazer uma rotina para carregar esses dados no formulário? Sem
chances, vamos usar classe, que é o foco deste projeto. Vamos criar
funções na classe clsFuncionario para isso? De jeito nenhum, a
classe clsFuncionario serve apenas para tratar de dados
relacionados a um funcionário, não deve ser usada para outras
finalidades. Devemos criar uma nova classe para lidar com listas e
chamaremos de clsCargo. Como essas listas serão de uma
complexidade maior, vamos deixá-las por último.
chances, vamos usar classe, que é o foco deste projeto. Vamos criar
funções na classe clsFuncionario para isso? De jeito nenhum, a
classe clsFuncionario serve apenas para tratar de dados
relacionados a um funcionário, não deve ser usada para outras
finalidades. Devemos criar uma nova classe para lidar com listas e
chamaremos de clsCargo. Como essas listas serão de uma
complexidade maior, vamos deixá-las por último.
formulário:
1) O bloco com a mensagem será removido quando não houver mensagem (o
formulário será mais curto). Quando houver mensagem, o formulário será
estendido para exibir a mensagem. Quando for uma mensagem simples (como “Funcionário cadastrado”), o texto
deverá ser preto, quando for um alerta (como uma inconsistência na
entrada), o texto deverá ser vermelho;
formulário será mais curto). Quando houver mensagem, o formulário será
estendido para exibir a mensagem. Quando for uma mensagem simples (como “Funcionário cadastrado”), o texto
deverá ser preto, quando for um alerta (como uma inconsistência na
entrada), o texto deverá ser vermelho;
2) Os botões Alterar e Desligar só estarão ativos quando
um funcionário existente for carregado via pesquisa, desativando o botão
Cadastrar nesta situação;
um funcionário existente for carregado via pesquisa, desativando o botão
Cadastrar nesta situação;
3) Após o cadastro ou a alteração de um funcionário o formulário deve
ser limpo;
ser limpo;
4) Os campos Registro, Data de nascimento, CPF e
Salário só devem permitir a entrada de números, bloqueando a
digitação de quaisquer outros caracteres;
Salário só devem permitir a entrada de números, bloqueando a
digitação de quaisquer outros caracteres;
5) O botão Recontratar deve aparecer somente quando um
funcionário já desligado for carregado no formulário, sendo que neste
caso o botão Desligar deve ficar invisível;
funcionário já desligado for carregado no formulário, sendo que neste
caso o botão Desligar deve ficar invisível;
6) As caixas de listagem permitirão tanto a seleção de item da lista
como a escrita para poder adicionar.
como a escrita para poder adicionar.
Vamos começar pela mensagem de texto na parte debaixo do formulário. O
meu tem altura de 180 com a mensagem e ficará com 155 sem a mensagem.
Podemos definir esses valores como constantes no topo do módulo do
formulário, permitindo que esses números fiquem em apenas um lugar no
código, facilitando futuras manutenções:
meu tem altura de 180 com a mensagem e ficará com 155 sem a mensagem.
Podemos definir esses valores como constantes no topo do módulo do
formulário, permitindo que esses números fiquem em apenas um lugar no
código, facilitando futuras manutenções:
Option Explicit
Private Const FormularioNormal As
Integer = 155
Integer = 155
Private Const FormularioEstendido As Integer = 180
Agora vamos pensar na sub-rotina. Como vamos definir os parâmetros?
Sabemos que terá uma mensagem e que ela pode ser comum ou de alerta.
Vamos definir um como Mensagem no formato string e o outro
como Alerta, com um valor booleano, sendo alerta como
verdadeiro e mensagem comum como falso. Podemos inclusive
definir este parâmetro como opcional, deixando falso como
padrão. Se a mensagem vier em branco, significa que a mensagem deve ser
apagada e o formulário reduzido, caso contrário a mensagem deve aparecer
e o formulário deve ser estendido. Compreendido o funcionamento, segue o
código:
Sabemos que terá uma mensagem e que ela pode ser comum ou de alerta.
Vamos definir um como Mensagem no formato string e o outro
como Alerta, com um valor booleano, sendo alerta como
verdadeiro e mensagem comum como falso. Podemos inclusive
definir este parâmetro como opcional, deixando falso como
padrão. Se a mensagem vier em branco, significa que a mensagem deve ser
apagada e o formulário reduzido, caso contrário a mensagem deve aparecer
e o formulário deve ser estendido. Compreendido o funcionamento, segue o
código:
Private Sub Mensagem(Mensagem As String, Optional Alerta As Boolean =
False)
False)
If Mensagem = “” Then
Me.lblMensagem = “”
Me.Height =
FormularioNormal
FormularioNormal
Else
Me.lblMensagem =
Mensagem
Mensagem
Me.Height =
FormularioEstendido
FormularioEstendido
End If
If Alerta = True Then
Me.lblMensagem.ForeColor =
vbRed
vbRed
Else
Me.lblMensagem.ForeColor =
vbBlack
vbBlack
End If
End Sub
O uso do Me aqui serve para referenciar o próprio formulário,
garantindo que os nomes das propriedades sejam dele próprio. Isto é útil
quando você possui vários formulários e de repente confunde um nome e
coloca um objeto de outro formulário. Não vai acusar erro e vai levar
algum tempo para descobrir onde está o problema. Poderia usar
frmFuncionarios, mas Me é bem mais curto.
garantindo que os nomes das propriedades sejam dele próprio. Isto é útil
quando você possui vários formulários e de repente confunde um nome e
coloca um objeto de outro formulário. Não vai acusar erro e vai levar
algum tempo para descobrir onde está o problema. Poderia usar
frmFuncionarios, mas Me é bem mais curto.
Para saber se essa sub-rotina está funcionando perfeitamente, vamos
editar o evento UserForm_Initialize e colocar uma das seguintes
linhas de cada vez, para testar cada uma das situações:
editar o evento UserForm_Initialize e colocar uma das seguintes
linhas de cada vez, para testar cada uma das situações:
Mensagem “”
Mensagem “Teste de mensagem”
Mensagem “Teste de alerta”, True
A primeira deve abrir o formulário sem a área da mensagem, a segunda
deve trazer uma mensagem em preto e a terceira uma mensagem em vermelho.
Como pode ver, algo que parecia um problema complexo foi resolvido com
uma rotina simples com dois parâmetros e dois IFs. Habitue-se a
pensar em parâmetros quando estiver desenvolvendo suas rotinas e
funções, eles facilitam o código e evitam ter de criar variáveis de
módulo ou mesmo globais.
deve trazer uma mensagem em preto e a terceira uma mensagem em vermelho.
Como pode ver, algo que parecia um problema complexo foi resolvido com
uma rotina simples com dois parâmetros e dois IFs. Habitue-se a
pensar em parâmetros quando estiver desenvolvendo suas rotinas e
funções, eles facilitam o código e evitam ter de criar variáveis de
módulo ou mesmo globais.
Vamos ao segundo requisito. Os botões Alterar e
Desligar só estarão disponíveis quando algum funcionário for
carregado via pesquisa e o botão Recontratar deve permanecer
invisível (só aparecerá quando for carregado um funcionário desligado).
Como ainda não desenvolvemos o código da pesquisa, o máximo que podemos
fazer por enquanto é desabilitá-los na inicialização. Vamos editar o
evento UserForm_Initialize, definindo o valor padrão da altura do formulário como
FormularioNormal e o status inicial de cada botão. Podemos aproveitar e definir o evento do botão Sair, que é
bem simples:
Desligar só estarão disponíveis quando algum funcionário for
carregado via pesquisa e o botão Recontratar deve permanecer
invisível (só aparecerá quando for carregado um funcionário desligado).
Como ainda não desenvolvemos o código da pesquisa, o máximo que podemos
fazer por enquanto é desabilitá-los na inicialização. Vamos editar o
evento UserForm_Initialize, definindo o valor padrão da altura do formulário como
FormularioNormal e o status inicial de cada botão. Podemos aproveitar e definir o evento do botão Sair, que é
bem simples:
Private Sub UserForm_Initialize()
Me.Height = FormularioNormal
Me.btnCadastrar.Enabled = True
Me.btnAlterar.Enabled = False
Me.btnDesligar.Enabled = False
Me.btnRecontratar.Visible = False
End Sub
Private Sub btnSair_Click()
Unload Me
End Sub
Seguindo adiante, temos um botão para Limpar o formulário. Como
também precisamos limpar após o cadastro ou a alteração de um
funcionário, talvez seja mais fácil nesses casos emular o clique nesse
botão. Mas tem um porém: o botão Limpar também removerá a
mensagem, chamando a sub-rotina mensagem com texto em branco. Como os
botões Adicionar, Alterar, Desligar e
Recontratar deverão exibir mensagens de confirmação, então é
melhor evitar executar a sub-rotina Mensagem duas vezes. Assim, é
melhor separar parte da limpeza em uma nova sub-rotina e fazer todos os
botões chamarem essa rotina, para depois chamar Mensagem da forma
apropriada para cada caso.
também precisamos limpar após o cadastro ou a alteração de um
funcionário, talvez seja mais fácil nesses casos emular o clique nesse
botão. Mas tem um porém: o botão Limpar também removerá a
mensagem, chamando a sub-rotina mensagem com texto em branco. Como os
botões Adicionar, Alterar, Desligar e
Recontratar deverão exibir mensagens de confirmação, então é
melhor evitar executar a sub-rotina Mensagem duas vezes. Assim, é
melhor separar parte da limpeza em uma nova sub-rotina e fazer todos os
botões chamarem essa rotina, para depois chamar Mensagem da forma
apropriada para cada caso.
Essa limpeza também deve deixar os botões nas mesmas condições do
início do formulário, ou seja, garantir que o botão
Cadastrar esteja habilitado e os botões Alterar e
Desligar estejam desabilitados. Não podemos esquecer de manter o
botão Desligar visível e o botão Recontratar invisível, já
prevendo esta situação acontecer. Também podemos definir que o cursor vá
para o campo Registro. Vamos ao código desse botão:
início do formulário, ou seja, garantir que o botão
Cadastrar esteja habilitado e os botões Alterar e
Desligar estejam desabilitados. Não podemos esquecer de manter o
botão Desligar visível e o botão Recontratar invisível, já
prevendo esta situação acontecer. Também podemos definir que o cursor vá
para o campo Registro. Vamos ao código desse botão:
Private Sub LimparFormulario()
Me.txtRegistro.Text = “”
Me.cmbNome.Text = “”
Me.txtDataNascimento.Text = “”
Me.txtCPF.Text = “”
Me.cmbCargo.Text = “”
Me.txtSalario.Text = “”
Me.btnCadastrar.Enabled = True
Me.btnAlterar.Enabled = False
Me.btnDesligar.Enabled = False
Me.btnDesligar.Visible = True
Me.btnRecontratar.Visible = False
Me.txtRegistro.SetFocus
End Sub
Private Sub btnLimpar_Click()
LimparFormulario
Mensagem “”
End Sub
Vamos ao quarto item. Um ponto importante é restringir a quantidade de
caracteres que cada um desses campos irá receber. Se não houver
restrição, o campo Registro, por exemplo, pode receber um número
muito grande e causar estouro na variável. Podemos definir um limite de
6 dígitos para esse campo. A data pode receber automaticamente as
barras, o CPF pode receber os pontos e o traço, enquanto o salário pode
receber o sinal de moeda e vírgula. Assim, a data terá um limite de 10
dígitos (incluindo as barras), o CPF terá 14 dígitos (inclui os pontos e
o traço) e o salário terá um limite de 13 dígitos (incluindo moeda,
separadores de milhar e vírgula). Podemos definir as propriedades
MaxLength de cada campo no próprio formulário, mas também podemos
definir no código, ficando mais fácil de consultar no futuro quando for
fazer alguma manutenção. O melhor lugar é na inicialização do
formulário. Inclua as linhas abaixo em UserForm_Initialize:
caracteres que cada um desses campos irá receber. Se não houver
restrição, o campo Registro, por exemplo, pode receber um número
muito grande e causar estouro na variável. Podemos definir um limite de
6 dígitos para esse campo. A data pode receber automaticamente as
barras, o CPF pode receber os pontos e o traço, enquanto o salário pode
receber o sinal de moeda e vírgula. Assim, a data terá um limite de 10
dígitos (incluindo as barras), o CPF terá 14 dígitos (inclui os pontos e
o traço) e o salário terá um limite de 13 dígitos (incluindo moeda,
separadores de milhar e vírgula). Podemos definir as propriedades
MaxLength de cada campo no próprio formulário, mas também podemos
definir no código, ficando mais fácil de consultar no futuro quando for
fazer alguma manutenção. O melhor lugar é na inicialização do
formulário. Inclua as linhas abaixo em UserForm_Initialize:
Me.txtRegistro.MaxLength = 6
Me.txtDataNascimento.MaxLength = 10
Me.txtCPF.MaxLength =
14
14
Me.txtSalario.MaxLength = 13
Se você leu meu artigo sobre
tratamento de entradas de formulário
deve saber fazer as restrições de entrada para alguns campos. O evento
KeyPress intercepta a digitação no campo, permitindo que a gente
permita só alguns caracteres, além de formatar o campo conforme vai
digitando. O campo Registro só precisará de restringir a valores
numéricos, os demais precisarão de formatação. Você pode tentar fazer os
códigos desses eventos como exercício usando o artigo citado acima como
referência antes de usar o código abaixo:
tratamento de entradas de formulário
deve saber fazer as restrições de entrada para alguns campos. O evento
KeyPress intercepta a digitação no campo, permitindo que a gente
permita só alguns caracteres, além de formatar o campo conforme vai
digitando. O campo Registro só precisará de restringir a valores
numéricos, os demais precisarão de formatação. Você pode tentar fazer os
códigos desses eventos como exercício usando o artigo citado acima como
referência antes de usar o código abaixo:
Private Sub txtRegistro_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
MSForms.ReturnInteger)
Select Case KeyAscii
Case Asc(“0”) To
Asc(“9”)
Asc(“9”)
Case Else
KeyAscii = 0
End Select
End Sub
Private Sub txtDataNascimento_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
MSForms.ReturnInteger)
Select Case KeyAscii
Case Asc(“0”) To
Asc(“9”)
Asc(“9”)
If
Me.txtDataNascimento.SelStart = 2 Or Me.txtDataNascimento.SelStart = 5
_
Me.txtDataNascimento.SelStart = 2 Or Me.txtDataNascimento.SelStart = 5
_
Then
Me.txtDataNascimento.SelText = “/”
End If
Case Else
KeyAscii = 0
End Select
End Sub
Private Sub txtCPF_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
MSForms.ReturnInteger)
Select Case KeyAscii
Case Asc(“0”) To
Asc(“9”)
Asc(“9”)
If
Me.txtCPF.SelStart = 3 Or Me.txtCPF.SelStart = 7 _
Me.txtCPF.SelStart = 3 Or Me.txtCPF.SelStart = 7 _
Then
Me.txtCPF.SelText = “.”
ElseIf Me.txtCPF.SelStart = 11 Then
Me.txtCPF.SelText = “-“
End If
Case Else
KeyAscii = 0
End Select
End Sub
Private Sub txtSalario_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
MSForms.ReturnInteger)
Select Case KeyAscii
Case Asc(“0”) To
Asc(“9”)
Asc(“9”)
If
Me.txtSalario.SelStart = 0 Then
Me.txtSalario.SelStart = 0 Then
Me.txtSalario.SelText = “R$ “
End If
Case Asc(“,”)
If
InStr(1, Me.txtSalario.Text, “,”) Then
InStr(1, Me.txtSalario.Text, “,”) Then
KeyAscii = 0
End If
Case Else
KeyAscii = 0
End Select
End Sub
Já o evento Exit ocorre quando sai do campo. É aqui que vamos
levar o valor à propriedade da classe para fazer a validação do dado.
Portanto, vamos criar a classe antes. Na área de declarações do módulo
do formulário, junto com as constantes declaradas, defina a classe:
levar o valor à propriedade da classe para fazer a validação do dado.
Portanto, vamos criar a classe antes. Na área de declarações do módulo
do formulário, junto com as constantes declaradas, defina a classe:
Private Funcionario As clsFuncionario
Desta forma o objeto está disponível para o módulo todo, ou seja,
existirá enquanto o formulário estiver aberto. Na inicialização do
formulário (em UserForm_Initialize), crie o objeto
Funcionario:
existirá enquanto o formulário estiver aberto. Na inicialização do
formulário (em UserForm_Initialize), crie o objeto
Funcionario:
Set Funcionario = New clsFuncionario
Isto criará o objeto junto com o formulário. Por fim, no final da
rotina de limpeza do formulário (LimparFormulario), vamos
destruir o objeto e criá-lo novamente:
rotina de limpeza do formulário (LimparFormulario), vamos
destruir o objeto e criá-lo novamente:
Set Funcionario = Nothing
Set Funcionario = New clsFuncionario
Poderíamos limpar propriedade por propriedade, mas esta forma é mais
prática. Isto serve para eliminarmos quaisquer dados existentes no
objeto que possam ser usados indevidamente em um outro funcionário.
prática. Isto serve para eliminarmos quaisquer dados existentes no
objeto que possam ser usados indevidamente em um outro funcionário.
Vamos então ao evento Exit do campo Registro. Nada mais
prático para o usuário do que efetuar a pesquisa pelo número logo que
sair do campo, certo? Então devemos utilizar aqui a função
Pesquisar do objeto Funcionario. Lembre-se de como foi
criada? Se o número for localizado retornará verdadeiro e os
dados serão carregados, se não for encontrado retornará falso.
Portanto, se o número existir teremos os dados, bastando exibi-los no
formulário, desabilitar o botão Cadastrar e habilitar os botões
Alterar e Desligar. Podemos também exibir mensagem
informando se encontrou ou não e também se o funcionário está desligado
da empresa. Segue o código:
prático para o usuário do que efetuar a pesquisa pelo número logo que
sair do campo, certo? Então devemos utilizar aqui a função
Pesquisar do objeto Funcionario. Lembre-se de como foi
criada? Se o número for localizado retornará verdadeiro e os
dados serão carregados, se não for encontrado retornará falso.
Portanto, se o número existir teremos os dados, bastando exibi-los no
formulário, desabilitar o botão Cadastrar e habilitar os botões
Alterar e Desligar. Podemos também exibir mensagem
informando se encontrou ou não e também se o funcionário está desligado
da empresa. Segue o código:
Private Sub txtRegistro_Exit(ByVal Cancel As
MSForms.ReturnBoolean)
MSForms.ReturnBoolean)
If Me.txtRegistro.Text <> “” And
IsNumeric(Me.txtRegistro.Text) Then
IsNumeric(Me.txtRegistro.Text) Then
If
Funcionario.Pesquisar(CLng(Me.txtRegistro.Text)) = True Then
Funcionario.Pesquisar(CLng(Me.txtRegistro.Text)) = True Then
PreencherFormulario
Else
Mensagem “Funcionário ”
& Funcionario.Registro & ” não cadastrado”
& Funcionario.Registro & ” não cadastrado”
End If
End If
End Sub
Private Sub PreencherFormulario
Private Sub PreencherFormulario
Me.txtRegistro.Text = Funcionario.Registro
Me.cmbNome.Text = Funcionario.Nome
Me.txtDataNascimento.Text =
Funcionario.DataNascimento
Funcionario.DataNascimento
Me.txtCPF.Text = Left$(Funcionario.CPF, 3) & “.”
& Mid$(Funcionario.CPF, 4, 3) & _
“.” & Mid$(Funcionario.CPF, 7, 3) & “-” & Right$(Funcionario.CPF, 2)
& Mid$(Funcionario.CPF, 4, 3) & _
“.” & Mid$(Funcionario.CPF, 7, 3) & “-” & Right$(Funcionario.CPF, 2)
Me.cmbCargo.Text = Funcionario.Cargo
Me.txtSalario.Text = Format(Funcionario.Salario, “R$
###,##0.00”)
###,##0.00”)
Me.btnCadastrar.Enabled = False
Me.btnAlterar.Enabled = True
Me.btnDesligar.Enabled = True
If Funcionario.Ativo = True Then
Mensagem “Funcionário ” &
Funcionario.Registro & ” localizado”
Funcionario.Registro & ” localizado”
Else
Me.btnDesligar.Visible = False
Me.btnRecontratar.Visible = True
Mensagem “Funcionário ” &
Funcionario.Registro & ” foi desligado”
Funcionario.Registro & ” foi desligado”
End If
End Sub
Se você cadastrou alguns funcionários quando testou a classe, pode usar
alguns números para testar esse evento. Se não tem ninguém cadastrado,
coloque alguns na planilha e teste. Veja como os dados aparecem no
formulário logo após sair do campo Registro.
alguns números para testar esse evento. Se não tem ninguém cadastrado,
coloque alguns na planilha e teste. Veja como os dados aparecem no
formulário logo após sair do campo Registro.
Os botões Desligar e Recontratar
têm um funcionamento simples. Eles disparam funções do objeto Funcionario (Desativar e Ativar, respectivamente) e exibem a mensagem. Como desligamento e
recontratação são situações críticas, é melhor enviar uma mensagem de
alerta para o usuário antes, para garantir que o clique não foi sem
querer. Segue o código:
têm um funcionamento simples. Eles disparam funções do objeto Funcionario (Desativar e Ativar, respectivamente) e exibem a mensagem. Como desligamento e
recontratação são situações críticas, é melhor enviar uma mensagem de
alerta para o usuário antes, para garantir que o clique não foi sem
querer. Segue o código:
Private Sub btnDesligar_Click()
Dim Resposta As Integer
Resposta = MsgBox(“Esta ação marcará o funcionário
” & Funcionario.Nome & _
” & Funcionario.Nome & _
” como desligado da
empresa.” & vbCrLf & “Tem certeza?”, vbExclamation + _
empresa.” & vbCrLf & “Tem certeza?”, vbExclamation + _
vbYesNo, “Atenção! Demissão de funcionário”)
If Resposta = vbYes Then
Funcionario.Desativar
Mensagem “Funcionario ”
& Funcionario.Registro & ” desligado”
& Funcionario.Registro & ” desligado”
LimparFormulario
End If
End Sub
Private Sub btnRecontratar_Click()
Dim Resposta As Integer
Resposta = MsgBox(“Esta ação reativará o
funcionário ” & Funcionario.Nome & _
funcionário ” & Funcionario.Nome & _
” no quadro de
funcionários.” & vbCrLf & “Tem certeza?”, vbExclamation + _
funcionários.” & vbCrLf & “Tem certeza?”, vbExclamation + _
vbYesNo, “Atenção! Recontratação de funcionário”)
If Resposta = vbYes Then
Funcionario.Ativar
Mensagem “Funcionario ”
& Funcionario.Registro & ” recontratado”
& Funcionario.Registro & ” recontratado”
LimparFormulario
End If
End Sub
Você pode testar esses botões, desligando e recontratando os
funcionários diversas vezes. Clique no botão Não para ver que
nada acontece e os dados permanecem no formulário.
funcionários diversas vezes. Clique no botão Não para ver que
nada acontece e os dados permanecem no formulário.
No momento falta validar os dados dos campos Data de nascimento,
CPF e Salário. É preciso lembrar que ao inserir os dados é
aplicada uma máscara, ou seja, acrescenta barras, pontos, traço e
representação de moeda. Precisamos certificar de que a máscara está
correta, ou seja, o usuário não removeu nenhum número após o surgimento
da máscara. Além disso, precisamos checar se o dado é válido, emitindo a
mensagem de alerta. Também é uma boa ideia alterar o fundo do campo para
deixar sinalizado que o valor não é válido. Inclusive isso facilitará a
codificação dos botões Cadastrar e Alterar, pois bastará
checar se os campos não estão vazios e que a cor deles sinaliza que o
dado é válido. Vamos ao evento para o campo
Data de nascimento:
CPF e Salário. É preciso lembrar que ao inserir os dados é
aplicada uma máscara, ou seja, acrescenta barras, pontos, traço e
representação de moeda. Precisamos certificar de que a máscara está
correta, ou seja, o usuário não removeu nenhum número após o surgimento
da máscara. Além disso, precisamos checar se o dado é válido, emitindo a
mensagem de alerta. Também é uma boa ideia alterar o fundo do campo para
deixar sinalizado que o valor não é válido. Inclusive isso facilitará a
codificação dos botões Cadastrar e Alterar, pois bastará
checar se os campos não estão vazios e que a cor deles sinaliza que o
dado é válido. Vamos ao evento para o campo
Data de nascimento:
Private Sub txtDataNascimento_Exit(ByVal Cancel As
MSForms.ReturnBoolean)
MSForms.ReturnBoolean)
Dim DataNumero As String
DataNumero = Replace(txtDataNascimento.Text, “/”,
“”)
“”)
If DataNumero = “” Then
Me.txtDataNascimento.Text
= “”
= “”
Mensagem “”
Exit Sub
End If
If Len(DataNumero) = 8 Then
Me.txtDataNascimento.Text
= Left$(DataNumero, 2) & “/” & Mid$(DataNumero, 3, 2) _
= Left$(DataNumero, 2) & “/” & Mid$(DataNumero, 3, 2) _
& “/” & Right$(DataNumero, 4)
End If
If IsDate(Me.txtDataNascimento.Text) And
Len(DataNumero) = 8 Then
Len(DataNumero) = 8 Then
Funcionario.DataNascimento
= CDate(Me.txtDataNascimento.Text)
= CDate(Me.txtDataNascimento.Text)
Me.txtDataNascimento.BackColor = vbWindowBackground
Mensagem “”
Else
Me.txtDataNascimento.BackColor = RGB(255, 153, 102)
Mensagem “Data de
nascimento informada inválida”, True
nascimento informada inválida”, True
End If
End Sub
Aqui foi criada uma variável DataNumero, que recebe o conteúdo
do campo e remove as barras. Em seguida é verificado se o valor está em
branco, neste caso define o valor do campo como vazio (caso o usuário
apague os números e só deixe as barras), elimina uma eventual mensagem
que esteja sendo exibida, garante a cor de fundo original e sai da
sub-rotina. Em seguida, verifica se o resultado tem 8 dígitos e
reconstrói a data. Por fim, verifica se a data é válida e novalmente
verifica se DataNumero tem 8 dígitos. Se ambas as condições forem
verdadeiras, armazena a data no objeto Funcionario e garante a
cor de fundo original, para mostrar que o dado é válido e elimina a
mensagem, se houver. Se alguma das condições não for verdadeira, o fundo
do campo é alterado para uma tonalidade avermelhada, sinalizando que o
dado é inválido e uma mensagem de alerta é exibida.
do campo e remove as barras. Em seguida é verificado se o valor está em
branco, neste caso define o valor do campo como vazio (caso o usuário
apague os números e só deixe as barras), elimina uma eventual mensagem
que esteja sendo exibida, garante a cor de fundo original e sai da
sub-rotina. Em seguida, verifica se o resultado tem 8 dígitos e
reconstrói a data. Por fim, verifica se a data é válida e novalmente
verifica se DataNumero tem 8 dígitos. Se ambas as condições forem
verdadeiras, armazena a data no objeto Funcionario e garante a
cor de fundo original, para mostrar que o dado é válido e elimina a
mensagem, se houver. Se alguma das condições não for verdadeira, o fundo
do campo é alterado para uma tonalidade avermelhada, sinalizando que o
dado é inválido e uma mensagem de alerta é exibida.
Para os campos CPF e Salário, há algumas diferenças
sutis. O CPF pode ter menos de 11 dígitos (14 com os pontos e
traço) e o usuário sair do campo. Neste caso deve acrescentar zeros à
esquerda e reconstruir a máscara. O valor numérico com 11 dígitos então
será enviado para o objeto Funcionario. Lembrando como a classe
foi projetada: se o CPF for válido, o valor é armazenado normalmente e a
propriedade Inconsistente permanecerá com valor falso; se
o CPF for inválido (o DAC não conferir), o valor não é armazenado e
Inconsistente se torna verdadeiro. Vejamos o código:
sutis. O CPF pode ter menos de 11 dígitos (14 com os pontos e
traço) e o usuário sair do campo. Neste caso deve acrescentar zeros à
esquerda e reconstruir a máscara. O valor numérico com 11 dígitos então
será enviado para o objeto Funcionario. Lembrando como a classe
foi projetada: se o CPF for válido, o valor é armazenado normalmente e a
propriedade Inconsistente permanecerá com valor falso; se
o CPF for inválido (o DAC não conferir), o valor não é armazenado e
Inconsistente se torna verdadeiro. Vejamos o código:
Private Sub txtCPF_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim CPFNumero As String
CPFNumero = Replace(Replace(txtCPF.Text, “.”, “”),
“-“, “”)
“-“, “”)
If CPFNumero = “” Then
Me.txtCPF.Text = “”
Exit Sub
End If
If Len(CPFNumero) < 11 Then
CPFNumero = String(11 –
Len(CPFNumero), “0”) & CPFNumero
Len(CPFNumero), “0”) & CPFNumero
End If
Me.txtCPF.Text = Left$(CPFNumero, 3) & “.”
& Mid$(CPFNumero, 4, 3) & “.” & _
& Mid$(CPFNumero, 4, 3) & “.” & _
Mid$(CPFNumero, 7, 3)
& “-” & Right$(CPFNumero, 2)
& “-” & Right$(CPFNumero, 2)
Funcionario.CPF = CPFNumero
If Funcionario.Inconsistencia = False Then
Me.txtCPF.BackColor =
vbWindowBackground
vbWindowBackground
Mensagem “”
Else
Me.txtCPF.BackColor =
RGB(255, 153, 102)
RGB(255, 153, 102)
Mensagem “CPF informado
inválido”, True
inválido”, True
End If
End Sub
O campo Salário só permite a entrada de números e uma única
vírgula. É preciso lembrar que a propriedade Salario no objeto
Funcionario está em formato moeda, ou seja, permite até 4 casas
decimais. É preciso remover eventuais casas decimais além do permitido.
O código abaixo faz todo o tratamento necessário:
vírgula. É preciso lembrar que a propriedade Salario no objeto
Funcionario está em formato moeda, ou seja, permite até 4 casas
decimais. É preciso remover eventuais casas decimais além do permitido.
O código abaixo faz todo o tratamento necessário:
Private Sub txtSalario_Exit(ByVal Cancel As
MSForms.ReturnBoolean)
MSForms.ReturnBoolean)
Dim SalarioNumero As String
Dim PosicaoVirgula As Integer
Dim CasasDecimais As Integer
SalarioNumero =
Trim(Replace(Replace(Me.txtSalario.Text, “R$ “, “”), “.”, “”))
Trim(Replace(Replace(Me.txtSalario.Text, “R$ “, “”), “.”, “”))
If SalarioNumero = “” Then
Me.txtSalario.BackColor =
vbWindowBackground
vbWindowBackground
Mensagem “”
Exit Sub
End If
PosicaoVirgula = InStr(1, SalarioNumero, “,”)
If PosicaoVirgula > 1 Then
CasasDecimais =
Len(SalarioNumero) – PosicaoVirgula
Len(SalarioNumero) – PosicaoVirgula
If CasasDecimais > 2
Then
Then
SalarioNumero = Left$(SalarioNumero, Len(SalarioNumero) – _
(CasasDecimais – 2))
End If
End If
If SalarioNumero <> “” And
IsNumeric(SalarioNumero) Then
IsNumeric(SalarioNumero) Then
Me.txtSalario.Text =
Format(SalarioNumero, “R$ ###,##0.00”)
Format(SalarioNumero, “R$ ###,##0.00”)
Funcionario.Salario =
CCur(SalarioNumero)
CCur(SalarioNumero)
If
Funcionario.Inconsistencia = False Then
Funcionario.Inconsistencia = False Then
Me.txtSalario.BackColor = vbWindowBackground
Mensagem “”
Else
Me.txtSalario.BackColor = RGB(255, 153, 102)
Mensagem “Salário informado inválido”, True
End If
Else
Me.txtSalario.BackColor =
RGB(255, 153, 102)
RGB(255, 153, 102)
Mensagem “Salário
informado inválido”, True
informado inválido”, True
End If
End Sub
Vamos então aos botões Cadastrar e Alterar. Antes de
efetivar qualquer alteração na base é preciso certificar que os dados
estão corretos e consistentes. A inconsistência pode ser verificada se o
campo está com cor diferente de vbWindowBackground (cor branca
padrão do fundo da caixa de texto). Fora isso precisamos verificar se há
dado, ou seja, se o campo não está vazio. Como essas validações são
necessárias tanto para Cadastrar como para Alterar,
podemos fazer uma função booleana que devolverá verdadeiro quando
os dados estão em ordem e falso se houver algum campo em branco
ou inconsistente:
efetivar qualquer alteração na base é preciso certificar que os dados
estão corretos e consistentes. A inconsistência pode ser verificada se o
campo está com cor diferente de vbWindowBackground (cor branca
padrão do fundo da caixa de texto). Fora isso precisamos verificar se há
dado, ou seja, se o campo não está vazio. Como essas validações são
necessárias tanto para Cadastrar como para Alterar,
podemos fazer uma função booleana que devolverá verdadeiro quando
os dados estão em ordem e falso se houver algum campo em branco
ou inconsistente:
Private Function ValidarDados() As Boolean
If Me.txtRegistro.Text = “” Or
Me.txtRegistro.BackColor <> vbWindowBackground Then
Me.txtRegistro.BackColor <> vbWindowBackground Then
Me.txtRegistro.SetFocus
ValidarDados = False
Exit Function
End If
If Me.cmbNome.Text = “” Or Me.cmbNome.BackColor
<> vbWindowBackground Then
<> vbWindowBackground Then
Me.cmbNome.SetFocus
ValidarDados = False
Exit Function
End If
If Me.txtDataNascimento.Text = “” Or
Me.txtDataNascimento.BackColor <> _
Me.txtDataNascimento.BackColor <> _
vbWindowBackground
Then
Then
Me.txtDataNascimento.SetFocus
ValidarDados = False
Exit Function
End If
If Me.txtCPF.Text = “” Or Me.txtCPF.BackColor
<> vbWindowBackground Then
<> vbWindowBackground Then
Me.txtCPF.SetFocus
ValidarDados = False
Exit Function
End If
If Me.cmbCargo.Text = “” Or Me.cmbCargo.BackColor
<> vbWindowBackground Then
<> vbWindowBackground Then
Me.cmbCargo.SetFocus
ValidarDados = False
Exit Function
End If
If Me.txtSalario.Text = “” Or
Me.txtSalario.BackColor <> vbWindowBackground Then
Me.txtSalario.BackColor <> vbWindowBackground Then
Me.txtSalario.SetFocus
ValidarDados = False
Exit Function
End If
ValidarDados = True
End Function
Feito isso, os botões Cadastrar e Alterar devem checar se
ValidarDados retorna verdadeiro, executando então os
métodos Adicionar e Alterar, respectivamente, exibir a
mensagem informando do fato e limpar o formulário. Se retornar
falso, nada acontecerá. O código é bem simples:
ValidarDados retorna verdadeiro, executando então os
métodos Adicionar e Alterar, respectivamente, exibir a
mensagem informando do fato e limpar o formulário. Se retornar
falso, nada acontecerá. O código é bem simples:
Private Sub btnCadastrar_Click()
If ValidarDados = True Then
Funcionario.Adicionar
Mensagem “Funcionário ”
& Funcionario.Registro & ” cadastrado”
& Funcionario.Registro & ” cadastrado”
LimparFormulario
End If
End Sub
Private Sub btnAlterar_Click()
If ValidarDados = True Then
Funcionario.Alterar
Mensagem “Funcionário ”
& Funcionario.Registro & ” alterado”
& Funcionario.Registro & ” alterado”
LimparFormulario
End If
End Sub
Está faltando o tratamento das caixas de listagem
Nome do funcionário e Cargo, bem como as rotinas de
geração das listas e o botão Pesquisar nome. Como este artigo
está bem extenso, vamos deixar para o próximo.
Nome do funcionário e Cargo, bem como as rotinas de
geração das listas e o botão Pesquisar nome. Como este artigo
está bem extenso, vamos deixar para o próximo.
Caso tenha dúvidas sobre o artigo ou queira fazer comentários e
sugestões, utilize a seção de comentários abaixo. Até o próximo
artigo!
sugestões, utilize a seção de comentários abaixo. Até o próximo
artigo!
Pedro Martins