Jump to content
nelson_t

[Resolvido] Textbox Multiline e passwordchar

Recommended Posts

nelson_t

Como posso utilizar numa textbeox o

passwordchar = " * " numa textbox multiline?

se retirar o miltiline da textbox funciona bem.

Share this post


Link to post
Share on other sites
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)

Share this post


Link to post
Share on other 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

Edited by 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"

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.