TEXTBOX COM CPF - CNPJ - DATA

DOUGLASBRAGA 05/11/2011 00:29:02
#388517
Boa noite pessoal!
é o seguinte estou disponibilizando um codigo com 3 TextBox, onde no primeiro TextBox se digita o CPF, o segundo o CNPJ e o terceiro a DATA.
Meu problema:
-Gostaria de Limitar a quantidade de caracteres digitados nos TextBox, tipo o CPF ###.###.###-##
-Outra coisa, nao consigo apagar o que foi digitado nos TextBox
-Estou precisando desse codigo Para os TextBox mesmo, nao posso usar o [Ô]MaskedTextBox[Ô]
-OBS: Estou usando o vb 2008

Segue em anexo o projeto, e o tambem o codigo logo abaixo:

Public Class Form1

Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress

If IsNumeric(e.KeyChar) AndAlso TextBox2.TextLength < TextBox2.MaxLength Then
TextBox2.Text &= e.KeyChar
TextBox2.SelectionStart = TextBox2.TextLength
Call formatacnpj(TextBox2)
End If
e.Handled = True
End Sub

Private Sub formatacnpj(ByVal txtTexto As Object)
If Len(txtTexto.Text) = 2 Or Len(txtTexto.Text) = 6 Then
txtTexto.Text = txtTexto.Text & [Ô].[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
End If

If Len(txtTexto.Text) = 10 Then
txtTexto.Text = txtTexto.Text & [Ô]/[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
End If
If Len(txtTexto.Text) = 15 Then
txtTexto.Text = txtTexto.Text & [Ô]-[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
End If
End Sub

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

If IsNumeric(e.KeyChar) AndAlso TextBox1.TextLength < TextBox1.MaxLength Then
TextBox1.Text &= e.KeyChar
TextBox1.SelectionStart = TextBox1.TextLength
Call formatacpf(TextBox1)
End If
e.Handled = True

End Sub
Private Sub formatacpf(ByVal txtTexto As Object)
If Len(txtTexto.Text) = 3 Then
txtTexto.Text = txtTexto.Text & [Ô].[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
ElseIf Len(txtTexto.Text) = 7 Then
txtTexto.Text = txtTexto.Text & [Ô].[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
ElseIf Len(txtTexto.Text) = 11 Then
txtTexto.Text = txtTexto.Text & [Ô]-[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
End If
End Sub


Private Sub TextBox3_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox3.KeyPress

If IsNumeric(e.KeyChar) AndAlso TextBox3.TextLength < TextBox3.MaxLength Then
TextBox3.Text &= e.KeyChar
TextBox3.SelectionStart = TextBox3.TextLength
Call FormataDataD(TextBox3)
End If
e.Handled = True

End Sub

Private Sub FormataDataD(ByVal txtTexto As Object)
If Len(txtTexto.Text) = 2 Then
txtTexto.Text = txtTexto.Text & [Ô]/[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
ElseIf Len(txtTexto.Text) = 5 Then
txtTexto.Text = txtTexto.Text & [Ô]/[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
End If
End Sub



End Class
RODRIGOFERRO 05/11/2011 09:18:09
#388527
Resposta escolhida
Amigão bom dia, voce vai ter um trabalho a mais e sempre vai aparecer um bugzinho chato pra tratar todas as entradas de textos e posições...

tem ciência de que estas literalmente reinventando a roda ?

Abraços
ALEXPASSOS 05/11/2011 09:26:02
#388528
Porque você não pode usar o MaskedTextBox? Poderia explicar?
OMAR2011 05/11/2011 09:31:23
#388529
Douglasbraga;quanto a limitação de caracteres digitados,basta ir em propriedades
Do Textbox1.text e marcar em MaxLengt a quantidade desejada.
Para Cpf =14 e CNPJ =18
Ou

Private Sub formatacpf(ByVal txtTexto As Object)
If Len(txtTexto.Text) = 3 Then
txtTexto.Text = txtTexto.Text & [Ô].[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
ElseIf Len(txtTexto.Text) = 7 Then
txtTexto.Text = txtTexto.Text & [Ô].[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
ElseIf Len(txtTexto.Text) = 11 Then
txtTexto.Text = txtTexto.Text & [Ô]-[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1
txtTexto.MaxLength = 14
End If
End Sub
Quanto a limpar as caixas de textos eu uso “Setas” e Delete.Tem uma outra
Maneira que fiz um teste e deu certo para limpar toda caixa de texto.

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

If IsNumeric(e.KeyChar) AndAlso TextBox1.TextLength < TextBox1.MaxLength Then
TextBox1.Text &= e.KeyChar
TextBox1.SelectionStart = TextBox1.TextLength
Call formatacpf(TextBox1)
End If
e.Handled = True
If e.KeyChar = Convert.ToChar(8) Then
e.Handled = True
TextBox1.Text = [Ô][Ô]
End If
End Sub

Se algum Fera puder responder melhor e mais eficaz,vou ficar atento neste tópico e grato pela informação.Não sei fazer de outra forma.
ARCADYUM 05/11/2011 10:33:28
#388533
Douglas,
Recentemente encontrei uma função muito bacana. Não testei todas as possibilidades da função. Mas deixo o link onde encontrá-la.
http://www.linhadecodigo.com.br/Artigo.aspx?id=383
OMAR2011 05/11/2011 11:27:22
#388536
Arcadyum,baixei e observei os códigos.Semelhante ao de Douglasbraga.Mas com esse exemplo ainda não é do jeito que ele quer.Como eu disse acima.
Esperarei que alguém responda com um código ou exemplo do jeito que ele quer.

Se algum Fera puder responder melhor e mais eficaz,vou ficar atento neste tópico e grato pela informação.Não sei fazer de outra forma.
ARCADYUM 05/11/2011 12:25:02
#388541
Omar,
Realmente os códigos na classe são iguais. Porém, quais são as vantagens:

- Todas as formatações ficam na classe, não tendo que criar uma função ou procedimento para cada situação.
- Posso chamar a função de qualquer parte do projeto, basta passar a opção e o nome do componente.

Então vamos avaliar os problemas do Douglas.

-Gostaria de Limitar a quantidade de caracteres digitados nos TextBox, tipo o CPF ###.###.###-##

A limitação dos caracteres digitados podem ser feitos na própria classe. Como eu passo, por parâmetro, o nome do componente quer dizer que qualquer propriedade do mesmo pode ser tratada lá.

Exemplo:
Para CPF

Case OpcaoFormata.ParaCPF

txtTexto.MaxLength = 14

If Len(txtTexto.Text) = 3 Then

txtTexto.Text = txtTexto.Text & [Ô].[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1

ElseIf Len(txtTexto.Text) = 7 Then

txtTexto.Text = txtTexto.Text & [Ô].[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1

ElseIf Len(txtTexto.Text) = 11 Then

txtTexto.Text = txtTexto.Text & [Ô]-[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1

End If


Para CNPJ

Case OpcaoFormata.ParaCNPJ

txtTexto.MaxLength = 18

If Len(txtTexto.Text) = 2 Or Len(txtTexto.Text) = 6 Then

txtTexto.Text = txtTexto.Text & [Ô].[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1

End If

If Len(txtTexto.Text) = 10 Then

txtTexto.Text = txtTexto.Text & [Ô]/[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1

End If

If Len(txtTexto.Text) = 15 Then

txtTexto.Text = txtTexto.Text & [Ô]-[Ô]
txtTexto.SelectionStart = Len(txtTexto.Text) + 1

End If


A única desvantagem que vejo neste método e ficar determinando o valor da propriedade sempre que digito alguma coisa, mas, isso pode ser resolvido se o componente que vai receber o valor de CPF ou CNPJ for determinado antes, tipo: Escolher através de um RadioButton, Combobox ou mesmoCheckBox fica a critério do usuário.

- Outra coisa, nao consigo apagar o que foi digitado nos TextBox

Neste caso disponibilizo o código que utilizo para resolver esse problema, que tive também.

Em um módulo coloque este código:

Public Function SO_NUMERO(ByVal Keyascii As Short) As Short

If InStr([Ô]1234567890[Ô], Chr(Keyascii)) = 0 Then
SO_NUMERO = 0
Else
SO_NUMERO = Keyascii
End If

Select Case Keyascii

Case 8
SO_NUMERO = Keyascii
Case 13
SO_NUMERO = Keyascii
Case 32
SO_NUMERO = Keyascii
End Select

End Function

No textbox, no evento KeyPress, coloque este código

Dim KeyAscii As Short = CShort(Asc(e.KeyChar))
KeyAscii = CShort(SO_NUMERO(KeyAscii))

Select Case KeyAscii
Case 0
e.Handled = True
Case Is = 13
SendKeys.Send([Ô]{TAB}[Ô])
Case Is >= 47
CLFUNGERAL.FORMATAR_CAMPO_GERAL(FUNGERAL.OpcaoFormata.ParaElemento, TXT_ELEMENTO)
End Select

End Sub

A função verifica o que você está digitando, dependendo do retorno, não exibe nada, ou muda o foco ao digitar Enter, ou formata conforme sua necessidade.

Permite apagar de qualquer forma: com BackSpace, Delete, selecionar tudo e Deletar.

-Estou precisando desse codigo Para os TextBox mesmo, nao posso usar o [Ô]MaskedTextBox[Ô]

Funciona com o textbox, conforme meu uso e testes.

-OBS: Estou usando o vb 2008
Neste caso uso o VS 2010 Ultimate, mas não custa testar.

Espero que ajude.
Um Abraço.



ARCADYUM 05/11/2011 12:29:12
#388542
Omar,
outra vantagem da classe é que ela pode ser declarada pública em um módulo não precisando de declara-la toda vez que for usada. Eu uso assim e funciona. No mesmo módulo que você colocar a função SO_NUMERO declare a função no escopo.
Exemplo:
Public CLFUNGERAL As New FUNGERAL [ô]Classe que possue a função FORMATAR_CAMPO_GERAL
No meu exemplo acima usei para elemento, mas pode ser declarada a que o usuário quiser.
DOUGLASBRAGA 05/11/2011 18:38:26
#388561
Boa tarde a todos!
Pessoal consegui resolver o meu problema...
Segui o conselho do ZEROCAL, e deixei de usar o TextBox e usei o MaskedTextBox mesmo.
No meu projeto, eu tenho uma Combobox, onde possui as opçoes [Ô]pessoa fisica[Ô] e[Ô]pessoa juridica[Ô] e eu queria mudar os [Ô] ###.###.###-###[Ô] do CPF para ##.###.###/### do CNPJ no TextBox.
Encontrei aquele codigo que eu postei no inicio do topico, tentei modificar mas nao cosegui.
Eu nao queria usar o MaskedTextBox pq eu nao sabia que eu conseguiria mudar o [Ô]Mask[Ô][ô] das propriedades via codigo.
Dai usando o MaskedTextBox consegui, e ficou bem simples, segue o meu codigo:

If CombPessoa.SelectedItem = [Ô]Pessoa Física[Ô] Then
Me.MaskedCPF.Mask = [Ô]000.000.000-00[Ô]
Else
If CombPessoa.SelectedItem = [Ô]Pessoa Juridica[Ô] Then
Me.MaskedCPF.Mask = [Ô]00.000.000/000[Ô]

Pessoal, sou iniciante e pouco a pouco vou pegando os macetes...
Obrigado pela ajuda de todos!
Tópico encerrado , respostas não são mais permitidas