Que tal poder editar os itens de um ListBox ?


Se você leu o título do artigo deve estar curioso para ver o projeto em funcionamento. Na verdade a coisa é mais simples de que pensamos e , não é necessário muito código para por as coisas para funcionar. Apenas uma API aqui outra ali e pronto. 

Vamos mostrar como permitir a edição nos itens de uma caixa de Listagem - ListBox. Vamos começar:

- Inicie um novo projeto no VB e no formulário padrão insira uma caixa de listagem , uma caixa de texto e duas etiquetas ( Labels ) conforme o layout abaixo:

Agora insira o seguinte código no formulário:

Option Explicit

Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type

Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

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 LB_GETITEMRECT = &H198
Private Const EC_LEFTMARGIN& = &H1
Private Const EM_SETMARGINS& = &HD3


Private Sub Form_Load()
  Dim x As Long
  For x = 0 To 10
      List1.AddItem "Item Número : " & CStr(x)
  Next x
  SetParent Text1.hwnd, List1.hwnd
  SendMessage Text1.hwnd, EM_SETMARGINS, EC_LEFTMARGIN, ByVal 1
  Text1.BorderStyle = 0
End Sub


Private Sub List1_DblClick()
  Dim rRect As RECT
  Dim lIndex As Long
  Dim lConv As Long
  lConv = Screen.TwipsPerPixelX
  lIndex = List1.ListIndex
  SendMessage List1.hwnd, LB_GETITEMRECT, lIndex, ByVal rRect
  Text1.Move rRect.Left * lConv, rRect.Top * lConv, rRect.Right * lConv, ((rRect.Bottom - rRect.Top) * lConv)
  Text1.Text = List1.List(lIndex)
  Text1.SelStart = 0
  Text1.SelLength = Len(Text1)
  Text1.Visible = True
  Text1.SetFocus
End Sub


Private Sub List1_GotFocus()
  Text1.Visible = False
  List1.Refresh
End Sub


Private Sub List1_Scroll()
  Text1.Visible = False
  List1.Refresh
End Sub


Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = 13 Then
      List1.List(List1.ListIndex) = Text1.Text
      Text1.Visible = False
      List1.Refresh
  End If
End Sub


Private Sub Text1_LostFocus()
  Text1.Visible = False
  List1.Refresh
End Sub

Como Funciona ?

Quando você clica duas vezes sobre um item da caixa de listagem a posição RECT para o item selecionado é encontrada , então a caixa de texto que esta invisível é movida e cobre o item da caixa de listagem. 

Você pode então informar os dados na caixa de texto e quando terminar pressionar a tecla ENTER . Feito isto o texto do item é alterado e a caixa de texto é tornada invisível novamente. O resultado você vê abaixo:

Legal né...    É isso ai...  


 José Carlos Macoratti