OVERWHITE EM UM TEXTBOX??

LCSD 25/05/2004 17:03:03
#26629
Boa Tarde, galera....

Estou tentando fazer um negócio e não sei se é possível fazer no VB, mas alguem fatalemten já deve ter pensado nisso e talvez ter arrumado alguma solução. Bom, vamos lá.

Eu gostaria que, quando eu digitasse em um TEXTBOX (por exemplo, um campo com o CNPJ), e que quando a pessoa tivesse que alterar um determinado número, que ele SUBSTITUàSSE este número sem a necessidade de marcá-lo.

EX: No meu TEXTBOX, eu tenho a seguinte informação: 42.176.245/0001-59
E eu gostaria que, quando o usuário colocasse o cursor no número 6, e quando digitasse o número 4, por exemplo, ele substituisse o número 6 pelo 4 sem a necessidade de marcar e nem apagar.

Tem como fazer isso???
USUARIO.EXCLUIDOS 25/05/2004 21:46:35
#26657
Resposta escolhida
Veja esse exemplo no evento KeyPress da textbox, é necessário controlar o pressionamento da tecla INSERT tambem.


Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Const EM_GETSEL = &HB0
Private Const EM_SETSEL = &HB1
Private Const EM_GETLINECOUNT = &HBA
Private Const EM_LINEINDEX = &HBB
Private Const EM_LINELENGTH = &HC1
Private Const EM_LINEFROMCHAR = &HC9

Public KeyInsert As Boolean

Private Sub Form_Load()
Text1.Text = "42.176.245/0001-59"
KeyInsert = False
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
' Foi pressionado a tecla INSERT?
If KeyCode = 45 Then KeyInsert = Not KeyInsert
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim cursorPos As Long

If KeyInsert Then Exit Sub ' Tecla INSERT esta ativa?

' Obtem a posição do cursor dentro da textbox
Call SendMessage(Text1.hwnd, EM_GETSEL, 0&, cursorPos)
If Len(Text1.Text) = cursorPos And InStr(1, "1234567890-/", Chr(KeyAscii)) 0 Then
Text1.SetFocus
' Seleciona texto na textbox
Call SendMessage(Text1.hwnd, EM_SETSEL, ByVal cursorPos, ByVal cursorPos + 1)
End If
End Sub
USUARIO.EXCLUIDOS 25/05/2004 22:12:28
#26660
Estou postando novamente o código devido a falta dos simbolos de "Maior que".

Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Const EM_GETSEL = &HB0
Private Const EM_SETSEL = &HB1
Private Const EM_GETLINECOUNT = &HBA
Private Const EM_LINEINDEX = &HBB
Private Const EM_LINELENGTH = &HC1
Private Const EM_LINEFROMCHAR = &HC9

Public KeyInsert As Boolean

Private Sub Form_Load()
Text1.Text = "42.176.245/0001-59"
KeyInsert = False
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
' Foi pressionado a tecla INSERT?
If KeyCode = 45 Then KeyInsert = Not KeyInsert
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim cursorPos As Long

If KeyInsert Then Exit Sub ' Tecla INSERT esta ativa?

' Obtem a posição do cursor dentro da textbox
Call SendMessage(Text1.hwnd, EM_GETSEL, 0&, cursorPos)
If Len(Text1.Text) MAIORouIGUAL cursorPos And InStr(1, "1234567890-/", Chr(KeyAscii)) MAIORQUE 0 Then
Text1.SetFocus
' Seleciona texto na textbox
Call SendMessage(Text1.hwnd, EM_SETSEL, ByVal cursorPos, ByVal cursorPos + 1)
' A linha acima pode ser substituida por:
'Text1.SelStart = cursorPos
'Text1.SelLength = 1
End If
End Sub
Tópico encerrado , respostas não são mais permitidas