• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

programadorvb6

[Resolvido ] Formatação em RealTime

27 mensagens neste tópico

Olá pessoal estou com um problema que é o seguinte:

- Tencionava pôr dentro de uma Caixa de Texto o n.º de Telemóvel / e ou o telefone ; só que como fiz não dá para poder optimizar em realtime enquanto escrevo.

EX. 962548125 ou 2164758591

- Fica com o seguinte aspecto á medida que vou inserindo os n.º  :

Modificação : (96) 254 81 25 ou (216) 475 85 91

- Caso premisse BackSpace ou Del os n.º voltavam a ficar como de inicio com menos o digito que apaguei.

Grato pela vossa atenção.

Programadorvb6

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deixa ver se percebi. Tu escreves isto 962548125, lá aparece isto  (96) 254 81 25.

Se apagares um dígito ao "(96) 254 81 25" passa a ficar assim "96254812"?

Mete só ai o algoritmo acho eu que faz com que o "962548125" passe a "(96) 254 81 25", para eu não tar a fazer um á minha maneira :P.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Usa uma MaskedTextBox e define o formato que queres na mask. Neste caso é "(999) 000-0000".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

jpaulino, também pensei nisso mas segundo eu percebi ele quer uma formatação dupla, caso seja um numero fixo será (999) 000 000 se for um número móvel seria (99) 000 00 00

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

jpaulino, também pensei nisso mas segundo eu percebi ele quer uma formatação dupla, caso seja um numero fixo será (999) 000 000 se for um número móvel seria (99) 000 00 00

Acho que tens razão ... não li bem.

Mas fica aqui um exemplo de como fazer a alteração de mascara em runtime:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.KeyPreview = True

        Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals

    End Sub

    Private Sub MaskedTextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MaskedTextBox1.KeyUp

        ' Caso seja o primeiro número

        If Me.MaskedTextBox1.Text.Length = 1 Then

            ' Se for um telemóvel define nova mascara

            If Me.MaskedTextBox1.Text.StartsWith("9") Then

                Me.MaskedTextBox1.Mask = "(99) 000-00-00"

            Else

                Me.MaskedTextBox1.Mask = "(999) 000-0000"

            End If

            ' Posiciona o cursor na posição certa

            Me.MaskedTextBox1.Select(2, 0)

        End If

    End Sub

End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou ver esta noite se esse codigo dá , depois digo alguma coisa :

Exprimentei este  que retirei de 1 site:

E Fica-me com formatação para coisas comerciais Tipo : 962.256,250 por exemplo.

'Takes any entered phone number and returns it in ###-#### format or (###) ###-####

Public Function FormatPhoneNumber(ByVal sNumToBeFormatted As _
   String) As String

Dim iNumberLength As Integer 'Used for the Phone Number length
   
'Trim any leading and trailing spaces

sNumToBeFormatted = Trim$(sNumToBeFormatted)
   
'Length of the phone number.

iNumberLength = Len(sNumToBeFormatted)
   
Select Case iNumberLength

  Case 7  'Format : #######

    FormatPhoneNumber = Left$(sNumToBeFormatted, 3) & _
        "-" & Right$(sNumToBeFormatted, 4)
    Exit Function

  Case 8  'Format : ###-#### or ### ####

    If Mid$(sNumToBeFormatted, 4, 1) = "-" Then
       FormatPhoneNumber = sNumToBeFormatted
       Exit Function
    Else
       FormatPhoneNumber = Left$(sNumToBeFormatted, 3) & "-" & _
          Right$(sNumToBeFormatted, 4)
       Exit Function
    End If

  Case 10 'Format : ##########

FormatPhoneNumber = "(" & Left$(sNumToBeFormatted, 3) & ") " _
   & Mid$(sNumToBeFormatted, 4, 3) & "-" & _
     Right$(sNumToBeFormatted, 4)

   Exit Function

  Case 11 'Format ######-####

FormatPhoneNumber = "(" & Left$(sNumToBeFormatted, 3) & ") " & _
       Right$(sNumToBeFormatted, 8)
    Exit Function

  Case 12 'Format : ### ###-####

FormatPhoneNumber = "(" & Left$(sNumToBeFormatted, 3) & ") " & _
      Mid$(sNumToBeFormatted, 5, 3) & "-" & _
      Right$(sNumToBeFormatted, 4)
    Exit Function

  Case 13 'Format : (###)###-####
     FormatPhoneNumber = Left(sNumToBeFormatted, 5) & " " & _
        Right(sNumToBeFormatted, 8)
     Exit Function


  Case Else
        'Return Value Passed
     FormatPhoneNumber = sNumToBeFormatted
           
End Select

End Function

Em VB6 já estava ...!! mas este raio  :ipool: sw codigo que eles inventaram ainda vai levar tempo a me habituar.

Me desculpem o meu desabafo...

Grato desde já pela vossa ajuda.

Até+

ProgramadorVB6

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou ver esta noite se esse codigo dá , depois digo alguma coisa :

Depois diz qualquer coisa :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá + 1 vez a todos .

Depois de gastar grande parte das energias a pensar como iria fazer este raio de código em Real-time e visto ainda não estar habituado a esta linguagem de programação tentei fazer assim :

Option Strict Off
Option Explicit On

Friend Class Formatacao
    Inherits System.Windows.Forms.Form
    Dim Tecla As Byte
    Dim ApagaLetra1, ApagaLetra2, ApagaLetra3 As String
    Dim JaPassou As Boolean

    Private Sub TxtValor1_TextChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles TxtValor1.TextChanged
        If (Chr(Tecla) < "0" Or Chr(Tecla) > "9") And Tecla <> 8 Then
            MsgBox("Digite somente números!")
            Tecla = 0
        ElseIf Tecla <> 8 And Not JaPassou Then
            JaPassou = True
            If Len(TxtValor1.Text) = 5 Then
                TxtValor1.Text = "(" & Mid(TxtValor1.Text, 1, 2) & ")" & Mid(TxtValor1.Text, 3, 5) & "-"
            ElseIf Len(TxtValor1.Text) = 8 Then
                TxtValor1.Text = Mid(TxtValor1.Text, 1, 7)
            ElseIf Len(TxtValor1.Text) = 10 Then
                TxtValor1.Text = Mid(TxtValor1.Text, 1, 10) & "-"
            ElseIf Len(TxtValor1.Text) = 14 Then
                ApagaLetra1 = Replace(TxtValor1.Text, "-", "")
                ApagaLetra2 = Replace(ApagaLetra1, "(", "")
                ApagaLetra3 = Replace(ApagaLetra2, ")", "")
                'Faz a mistura se for + que 14 Digitos
                TxtValor1.Text = "(" & Mid(ApagaLetra3, 1, 3) & ")" & Mid(ApagaLetra3, 4, 3) & "-" & Mid(ApagaLetra3, 7, 2) & "-" & Mid(ApagaLetra3, 9, 3)
            End If
        End If
        TxtValor1.SelectionStart = Len(TxtValor1.Text)
    End Sub

    Private Sub TxtValor1_KeyDown(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyEventArgs) Handles TxtValor1.KeyDown
        Dim KeyCode As Short = eventArgs.KeyCode
        Dim Shift As Short = eventArgs.KeyData \ &H10000
        If KeyCode = 36 Or KeyCode = 46 Then
            KeyCode = 0
            Exit Sub
        End If

    End Sub

    Private Sub TxtValor1_KeyPress(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyPressEventArgs) Handles TxtValor1.KeyPress
        Dim KeyAscii As Short = Asc(eventArgs.KeyChar)
        Tecla = KeyAscii
        JaPassou = False

        If KeyAscii <> 8 Then
            If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
                MsgBox("Digite somente números!")
                KeyAscii = 0
            End If
        End If
        eventArgs.KeyChar = Chr(KeyAscii)
        If KeyAscii = 0 Then
            eventArgs.Handled = True
        End If
    End Sub
End Class

Até aqui tudo bem ao introduzirmos somente os números dentro da textbox; á medida que se vai digitando , a mesma vai formatando... ; o problema vem depois quando quisermos usar as teclas' BackSpace' e 'Del' para fazer correcções...

pois ao apagar o numerário também podemos apagar por descuido os caracteres "(" ; ")" ; "-"

Deixo também o código para vc verem como fiz :

-Link : http://www.box.net/shared/tqqey7dxqr

Grato desde já pela vossa atenção.

Programadorvb6

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas já tentaste o código que te mostrei ?

Depois estás a usar vb.net e não vb6 e deves começar a usar os novos métodos. Exemplo:

Len(TxtValor1.Text) = TxtValor1.Text.Lenght

Mid(TxtValor1.Text, 1, 2) = TxtValor1.Text.SubString(1, 2)

Replace(TxtValor1.Text, "-", "") = TxtValor1.Text.Replace("-", "")

(não testei mas é só para teres a ideia)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim já .

Dá-me erro em :

Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals

Me.MaskedTextBox1.Mask

Ele diz que não reconhece : .TextMaskFormat e .Mask

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a usar uma MaskedTextBox ? Atenção que não é uma textbox ... procura na toolbox.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim JPaulino é verdade, estavam trocadas.

Optei por seguir o teu codigo (exemplo) e acrescentei -lhe + algum codigo.

O unico problema que agora me deparei é que quando acrescento + 1 digito [ de (99) 000-00-00  para (999) 000-00-00 ], e tento corrigir na mácara : (999) 000-00-00 um nº  o mesmo caracter que inseri não se posiciona correctamente dentro da mácara.

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.KeyPreview = True
        Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
    End Sub

    Private Sub MaskedTextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MaskedTextBox1.KeyUp


        ' Caso seja o primeiro número
        If Me.MaskedTextBox1.Text.Length = 1 Then

            ' Se for um telemóvel define nova mascara
            If Me.MaskedTextBox1.Text.StartsWith("9") Then

                Me.MaskedTextBox1.Mask = "(99) 000-00-00"
                Me.MaskedTextBox1.Select(2, 0)
                Me.MaskedTextBox1.ForeColor = DefaultForeColor
            End If

            If Me.MaskedTextBox1.Text.StartsWith("2") Then
                Me.MaskedTextBox1.Mask = "(99) 000-00-00"
                Me.MaskedTextBox1.Select(2, 0)
                Me.MaskedTextBox1.ForeColor = DefaultForeColor
            End If

            '==================
            'Desmancha mascara
            '==================
            If Me.MaskedTextBox1.Text.StartsWith("0") Then
                Me.MaskedTextBox1.Mask = ""
                Me.MaskedTextBox1.Select(1, 0)
                Me.MaskedTextBox1.ForeColor = Color.Red
            End If
            '----------------------------------------------
            If Me.MaskedTextBox1.Text.StartsWith("1") Then
                Me.MaskedTextBox1.Mask = ""
                Me.MaskedTextBox1.Select(1, 0)
                Me.MaskedTextBox1.ForeColor = Color.Red
            End If
            '----------------------------------------------
            If Me.MaskedTextBox1.Text.StartsWith("3") Then
                Me.MaskedTextBox1.Mask = ""
                Me.MaskedTextBox1.Select(1, 0)
                Me.MaskedTextBox1.ForeColor = Color.Red
            End If
            '----------------------------------------------
            If Me.MaskedTextBox1.Text.StartsWith("4") Then
                Me.MaskedTextBox1.Mask = ""
                Me.MaskedTextBox1.Select(1, 0)
                Me.MaskedTextBox1.ForeColor = Color.Red
            End If
            '----------------------------------------------
            If Me.MaskedTextBox1.Text.StartsWith("5") Then
                Me.MaskedTextBox1.Mask = ""
                Me.MaskedTextBox1.Select(1, 0)
                Me.MaskedTextBox1.ForeColor = Color.Red
            End If
            '----------------------------------------------
            If Me.MaskedTextBox1.Text.StartsWith("6") Then
                Me.MaskedTextBox1.Mask = ""
                Me.MaskedTextBox1.Select(1, 0)
                Me.MaskedTextBox1.ForeColor = Color.Red
            End If
            '----------------------------------------------
            If Me.MaskedTextBox1.Text.StartsWith("7") Then
                Me.MaskedTextBox1.Mask = ""
                Me.MaskedTextBox1.Select(1, 0)
                Me.MaskedTextBox1.ForeColor = Color.Red
            End If
            '----------------------------------------------
            If Me.MaskedTextBox1.Text.StartsWith("8") Then
                Me.MaskedTextBox1.Mask = ""
                Me.MaskedTextBox1.Select(1, 0)
                Me.MaskedTextBox1.ForeColor = Color.Red
            End If
            '----------------------------------------------

            End If
            If Me.MaskedTextBox1.Text.Length = 9 Then
                If Me.MaskedTextBox1.Text.StartsWith("2") Then
                    Me.MaskedTextBox1.Mask = "(99) 000-00-00"
                    Me.MaskedTextBox1.ForeColor = DefaultForeColor
                End If
            End If
            If Me.MaskedTextBox1.Text.Length > 9 Then
                If Me.MaskedTextBox1.Text.StartsWith("2") Then
                    Me.MaskedTextBox1.Mask = "(999) 000-00-00"
                    Me.MaskedTextBox1.ForeColor = DefaultForeColor
                End If
            End If


    End Sub

    Private Sub MaskedTextBox1_KeyPress(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyPressEventArgs) Handles MaskedTextBox1.KeyPress
        Dim KeyAscii As Short = Asc(eventArgs.KeyChar)
        Dim Tecla As Long
        Tecla = KeyAscii

        If KeyAscii <> 8 Then
            'Verifica se foi pressionado + algum nº no final >9
            If Chr(KeyAscii) >= "0" Or Chr(KeyAscii) <= "9" Then

                If Me.MaskedTextBox1.Text.Length = 9 And Me.MaskedTextBox1.Text.StartsWith("2") Then
                    Me.MaskedTextBox1.Mask = "(999) 000-00-00"
                    'Me.MaskedTextBox1.Select(14, 0)

                End If
            End If


            If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
                MsgBox("Digite somente números!")
                KeyAscii = 0
            End If
        End If
        eventArgs.KeyChar = Chr(KeyAscii)
        If KeyAscii = 0 Then
            eventArgs.Handled = True
        End If
    End Sub

   
End Class

Link: http://www.box.net/shared/na5mxsf11n

Grato pela vossa atenção

Programadorvb6

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É mais fácil dizeres o que queres fazer exactamente. Estou a ver cores, mascaras, etc, mas não entendo muito bem o objectivo final.

Explica exactamente o que queres.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No VB.NET 2003 não existem maskbox pois não?

Existe a partir da versão .NET Framework 2.0

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que pretendo é inserir dentro de uma textbox um nº de telefone fixo / ou móvel ; em que o mesmo se vai auto formatando á medida que vamos escrevendo.

Caso comece por : 1;3.....8 os numeros ficam s/ formatação a vermelho  indicando o utilizador que o que foi inserido não foi o correcto.

Nota : Incluindo tambem os respectivos indicativos caso seja para Telefone Fixo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É que o código que me forneces-te não formata correctamente para telefones fixos

formato : (999) 000-000 ; telefone : 214536373 seria desta maneira : (214) 536-373

Quando na realidade deveria ficar assim : (21) 453-63-73.

Resumindo , quando dizes (via linguagem) caso seja o 1º nº <> "9" então formata assim :  (999) 000-000 ; quando na realidade nós sabemos que se o indicativo for começado por 2 e só tiver dois dígitos :(21) no iseu indicativo a formatação ficará comprometida com esse formato : (999) 000-000.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

EX. 962548125 ou 2164758591

- Fica com o seguinte aspecto á medida que vou inserindo os n.º  :

Modificação : (96) 254 81 25 ou (216) 475 85 91

Agora é que estou mesmo perdido :)

De inicio disseste que querias de uma maneira e agora já estás a pedir de outro ... ou estou a fazer confusão ?

Diz só uma coisas: para estes dois números qual é o formato que queres que apareça ?

211234567

911234567

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para Fixo (2 formatos devido aos indicativos )

- Formato : (99) 000-00-00 ; (999) 000-000

*  Com indicativo (com 2 caracteres) ->  (99) 000-00-00

      Lisboa : (21) 123-45-67

*  Com indicativo (com 3 caracteres) ->  (999) 000-000

      Funchal : (291) 706-100       

'===================================================

Para Móvel (1 só formato )

- Formato :  (99) 000-00-00

(91) 123-45-67

Agradeço desde já a atenção disponibilizada.

Programadorvb6

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E como identificas se o indicativo fixe é de lisboa ou do funchal ? Tens os códigos ou qual é a tua ideia ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Surgiu-me outra ideia :

A Maneira + simples :

É ver se o segundo caracter que se insere é <> 1 ou de 2, se reparares só Lisboa e Porto é que Têem essa situação.

241 Abrantes

235 Arganil

234 Aveiro                                                           

284 Beja                                                               

253 Braga                                                           

273 Bragança                                                     

262 Caldas da rainha                                         

272 Castelo branco                                             

286 Castro verde

276 Caves

239 Coimbra                               

275 Covilhã                                             

268 Estremoz                                                       

266 Évora                                                             

289 Faro                                                               

233 Figueira da foz

271 Guarda

277 Idanha-a-nova

244 Leiria

21  Lisboa

231 Mealhada

278 Mirandela

279 Moncorvo

285 Moura

283 Odemira

255 Penafiel

254 Peso da régua

236 Pombal

242 Ponte de sôr

245 Portalegre

282 Portimão

22  Porto

274 Proença-a-nova

243 Santarem

269 Santiago do cacem

256 São joão da madeira

238 Seia

265 Setubal

281 Tavira

249 Torres novas

261 Torres vedras

251 Valença

258 Viana do castelo

263 Vila franca de xira

252 Vila nova de famalicão

259 Vila real

232 Viseu

Madeira

=======

291 Funchal                                                         

291 Porto santo

Açores

======

295 Angra do heroismo

292 Corvo 

292 Faial

292 Flores                                                       

295 Graciosa                                                       

292 Horta

292 Pico                                                         

295 Ponta delgada

295 S. Jorge

296 S. Miguel

296 S. Maria

295 Terceira                                                                                                               

+- Já estou a ver de 1 forma simplificada como fazer.

- se o 1º caracter pressionado ( "9")  então

  Formata : (99) 000-00-00

  fim ciclo

- se o 1º caracter pressionado = ("2") então

  - Verificar o 2º Nº

        - Caso ="1" or Caso="2" então

          Formata : (99) 000-00-00

        Else

          Formata : (999) 000-000

fim ciclo 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, também podes fazer no .net isso, mas achas que se justifica carregar todos os códigos(indicativos) apenas para registar um número de telefone ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta lá agora:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.KeyPreview = True
        Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
    End Sub


    Private Sub MaskedTextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MaskedTextBox1.KeyUp

        ' Caso seja o primeiro número
        If Me.MaskedTextBox1.Text.Length = 1 Then

            ' Se for um telemóvel define nova mascara
            If Me.MaskedTextBox1.Text.StartsWith("9") Then
                Me.MaskedTextBox1.Mask = "(99) 000-00-00"
            Else
                Me.MaskedTextBox1.Mask = "(999) 000-0000"
            End If

            ' Posiciona o cursor na posição certa
            Me.MaskedTextBox1.Select(2, 0)

        ElseIf Me.MaskedTextBox1.Text.Length = 2 Then

            If Me.MaskedTextBox1.Text.StartsWith("9") Then Exit Sub

            Dim c As Char = Me.MaskedTextBox1.Text.Substring(1, 1)

            ' Se for um telemóvel define nova mascara
            If c = "1" Or c = "2" Then
                Me.MaskedTextBox1.Mask = "(99) 000-00-00"
            Else
                Me.MaskedTextBox1.Mask = "(999) 000-000"
            End If

            ' Posiciona o cursor na posição certa
            Me.MaskedTextBox1.Select(3, 0)
        End If

    End Sub

End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok  :). 5 estrelas...

Valeu! :cheesygrin:

Desde já agradeço a tua ajuda.

programadorvb6.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora