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