VB - TextBox com recursos de recortar , copiar , colar  e desfazer


Que tal um TextBox com recursos como recortar , copiar , colar e desfazer ?

Você não precisa quebrar a cabeça para criar um controle assim pois Steve McMahon  já fez isto para você.

Vamos usar a classe cTextBoxEdit que ele criou e que nos fornece todos estes recursos.

Siga o roteiro , passo a passo:

1- Crie um novo Projeto no Visual Studio ou Visual Basic.

2- No  menu Project selecione a opção Add Class Module e altere o nome da classe para cTextBoxEdit

3- Agora inclua o código abaixo no módulo da classe:

Private Declare Function SendMessageLong Lib "USER32" Alias "SendMessageA" _ 
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Declare Function SendMessageString Lib "USER32" Alias "SendMessageA" _ 
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long

Private Const WM_COMMAND = &H111
Private Const WM_CUT = &H300
Private Const WM_COPY = &H301
Private Const WM_PASTE = &H302
Private Const EM_UNDO = &HC7
Private Const EM_CANUNDO = &HC6
Private Const EM_REPLACESEL = &HC2
Private Declare Function IsClipboardFormatAvailable Lib "USER32" (ByVal wFormat As Long) As Long
Private Const CF_TEXT = 1
Private Const CF_UNICODETEXT = 13
Private Const CF_OEMTEXT = 7

Private m_txtThis As TextBox
Public Property Let TextBox(ByRef txtThis As TextBox)
   Set m_txtThis = txtThis
End Property

Public Sub Cut()
   SendMessageLong m_txtThis.hWnd, WM_CUT, 0, 0
End Sub

Public Sub Copy()
   SendMessageLong m_txtThis.hWnd, WM_COPY, 0, 0
End Sub

Public Sub Paste()
   SendMessageLong m_txtThis.hWnd, WM_PASTE, 0, 0
End Sub

Public Sub Undo()
   If (SendMessageLong(m_txtThis.hWnd, EM_CANUNDO, 0, 0) <> 0) Then
      SendMessageLong m_txtThis.hWnd, EM_UNDO, 0, 0
   End If
End Sub

Public Property Get CanCut() As Boolean
   CanCut = (Not (m_txtThis.Locked) And m_txtThis.SelLength > 0)
End Property

Public Property Get CanCopy() As Boolean
   CanCopy = (m_txtThis.SelLength > 0)
End Property

Public Property Get CanPaste() As Boolean
   If IsClipboardFormatAvailable(CF_TEXT) Then
      CanPaste = True
   ElseIf IsClipboardFormatAvailable(CF_UNICODETEXT) Then
      CanPaste = True
   ElseIf IsClipboardFormatAvailable(CF_OEMTEXT) Then
      CanPaste = True
   End If
End Property

Public Property Get CanUndo() As Boolean
   CanUndo = (SendMessageLong(m_txtThis.hWnd, EM_CANUNDO, 0, 0) <> 0)
End Property

Public Sub ReplaceSelection(ByRef sText As String, Optional ByVal bAllowUndo = True)
   Dim lR As Long
   If (m_txtThis.SelLength > 0) Then
      lR = Abs(bAllowUndo)
      SendMessageString m_txtThis.hWnd, EM_REPLACESEL, lR, sText
   End If
End Sub

Public Sub Delete(Optional ByVal bAllowUndo = True)
   Dim lR As Long
   SendMessageString m_txtThis.hWnd, EM_REPLACESEL, lR, vbNullChar
End Sub

No Formulário padrão do projeto inclua um menu usando o Menu Editor (CTRL+E) inclui as opções conforme abaixo:

No formulário inclua também um controle TextBox com a propriedade Multiline igual a True:

Agora inclua o código abaixo no formulário do projeto:

Option Explicit
'definindo uma varival do tipo cTextBoxEdit
Private m_c As cTextBoxEdit

Private Sub Form_Load()
   'criando uma instância da classe cTextBoxEdit chamada m_c
   Set m_c = New cTextBoxEdit
   'atribuindo o texto da caixa de texto ao objeto m_c
   m_c.TextBox = Text1
End Sub

Private Sub mnuEdit_Click(Index As Integer)
  'conforme a opção do menu invoca um método da classe cTextBoxEdit via objeto m_c
   Select Case Index
   Case 0
      m_c.Undo
   Case 2
      m_c.Cut
   Case 3
      m_c.Copy
   Case 4
      m_c.Paste
   Case 5
      m_c.Delete
   End Select
End Sub
Private Sub mnuEditTOP_Click()
   mnuEdit(0).Enabled = m_c.CanUndo
   mnuEdit(2).Enabled = m_c.CanCut
   mnuEdit(3).Enabled = m_c.CanCopy
   mnuEdit(4).Enabled = m_c.CanPaste
   mnuEdit(5).Enabled = m_c.CanCut
End Sub

 

Agora é só alegria ....

Pegue o projeto  completo aqui: cTextBoxEdit.zip

Eu sei é apenas VB , e daí , eu gosto ....


José Carlos Macoratti