Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

nelson_t

[Resolvido] Textbox Multiline e passwordchar

Mensagens Recomendadas

nelsonr

Não podes ter textbox multiline como password (e faz algum sentido?)

Se quiseres, poes uma textbox normal multiline e capturas o evento de keypress/keyup/keydown e substituis o caracter usado pelo asterisco (guardando o caracter original numa variavel).

Mas depois podes vir a ter outros problemas (como o copy/paste, delete, etc)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Não faz, de facto, muito sentido teres um campo tão grande para password... de qualquer forma há uma maneira mais simples do que a captura dos keystrokes.

Basta estender a classe da textbox.

Coloca este código num novo ficheiro na tua solução:

Public Class TextBoxPwd
Inherits TextBox

Private _TextoReal As String = String.Empty

Protected Overrides Sub OnTextChanged(e As EventArgs)
	_TextoReal = Me.Text
	Me.Text.Insert(Me.Selectionstart, Me.PasswordChar)
	Me.ScrollToCaret()
End Sub

Public ReadOnly Property TextoReal As String
	Get
		Return _TextoReal
	End Get
End Property

End Class

Isto não passa de uma textbox com uma propriedade interceptada (overridden, vá).

Depois de adicionares isto à solução, apagas a textbox que tens agora no form, fazes build ao projecto, e na toolbox, logo em cima, vai-te aparecer a nova TextBoxPwd. Arrasta-a para o form, como se fosse uma textbox normal. Define o multiline e a passwordchar.

Quando houver alterações ao texto, inserimos um caractere definido como sendo o PasswordChar e ao mesmo tempo guardamos o valor real da textbox numa variável.

Para fora, sai o char da password. Internamente podes consultar o valor real através da propriedade exposta, p/ex: TextBoxPwd1.TextoReal

Copy e Paste não devem ser alvo de preocupação. Para além desta técnica preservar o Paste (os conteúdos chamam o TextChanged a cada caractere), não faz sentido controlar um Copy a partir de uma caixa de password. É no mínimo uma falha de segurança.

Também não há conflitos com o delete nem com a posição do cursor. O Insert garante isso

Editado por ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelson_t

obrigado ribeiro55

mas não consegui.

Apareceu a nova TextBoxPwd alterei o multiline e a passwordchar, mas não alterou para o ( * ) como pertendido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Alguma coisa não fizeste direito :)

Usaste essa TextBoxPwd que apareceu em vez da TextBox normal?


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Agora é que estou a analisar a coisa devidamente...

O código que eu te dei nem sequer ia funcionar. Escrevi à pressa e vi a funcionar e decidi colocar aqui

Mas a razão por a qual o vi a funcionar é porque uma textbox multiline suporta passwordchar.

Está na altura de actualizar a framework :)

De qualquer forma, pegando na sugestão do nelsonr, tens aqui uma textbox que suporta o que queres.

Já é tarde e está escrito à zé esparguete... só suporta backspace e introdução de texto em posição arbitrária:

Public Class TextBoxPwd
   Inherits TextBox

   Private _TextoReal As String = String.Empty

   Protected Overrides Sub onkeypress(e As KeyPressEventArgs)
       Dim st As Integer = Me.Selectionstart
       Dim chr As String = "*"
       If AscW(e.KeyChar) = Keys.Back Then
           If _TextoReal.Length = 0 Then
               _TextoReal = String.Empty
           Else
               _TextoReal = _TextoReal.Remove(st - _Quebras(st) - 1, 1)
           End If
           MyBase.onkeypress(e)
           Exit Sub
       End If
       If AscW(e.KeyChar) = Keys.Return Then chr = vbCrLf
       Me.Text = Me.Text.Insert(st, chr)
       _TextoReal = _TextoReal.Insert(st - _Quebras(st), e.KeyChar)
       Me.Selectionstart = st + chr.Length
       e.Handled = True
   End Sub

   Private Function _Quebras(Limite As Integer) As Integer
       Dim tmp As Integer = 0
       If _TextoReal.Length < Limite Then Limite = _TextoReal.Length
       For Each ch As Char In _TextoReal.Substring(0, Limite)
           If AscW(ch) = 13 Then tmp += 1
       Next
       Return tmp
   End Function

   Public ReadOnly Property TextoReal As String
       Get
           Return _TextoReal
       End Get
   End Property

End Class


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.