Dicas - Editando itens do ListBox

Veja nesta dica, como implementar a funcionalidade de edição de itens do ListBox.

O ListBox foi projetado para apresentar uma coleção de itens (strings) em forma de lista. Itens de um ListBox não podem ser editados diretamente de “dentro” do ListBox. Caso você precise dessa funcionalidade, esta é uma dica de como inserir um Edit dentro de um ListBox.

Resumidamente, dinamicamente criamos um Edit chamado “ListEdit” no evento OnCreate do formulário. ListBox1 é configurado para ser o Parent do ListEdit (no construtor do Edit foi passado o formulário, “Self”, como sendo o Owner).

Em seguida, no evento OnClick do ListBox1 (quando um item é selecionado) posicionamos o Edit exatamente em cima dele. O ListEdit possui o foco, quando a tecla ENTER é pressionada (tecla ENTER = #13) o item “antigo” é removido do ListBox e o novo é inserido. Isso é tudo. Simples e eficiente.

type TForm1 = class(TForm) ... private ListEdit: TEdit; procedure ListEditKeyPress(Sender: TObject; var Key: Char); end; ... { cria o TEdit e faz o ListBox seu parent } procedure TForm1.FormCreate(Sender: TObject) ; begin ListEdit := TEdit.Create(self) ; ListEdit.Visible := false; ListEdit.Ctl3D := false; ListEdit.BorderStyle := bsNone; ListEdit.Parent := ListBox1; ListEdit.Width := ListBox1.ClientWidth; ListEdit.OnKeyPress := ListEditKeyPress; end; { Item selecionado – posiciona o Edit } procedure TForm1.ListBox1Click(Sender: TObject) ; var ii : integer; lRect: TRect; begin ii := ListBox1.ItemIndex; if ii = -1 then Exit; lRect := ListBox1.ItemRect(ii) ; ListEdit.Top := lRect.Top + 1; ListEdit.Left := lRect.Left + 1; ListEdit.Height := (lRect.Bottom - lRect.Top) + 1; ListEdit.Text := ListBox1.Items.Strings[ii]; ListBox1.Selected[ii] := False; ListEdit.Visible := True; ListEdit.SelectAll; ListEdit.SetFocus; end; { efetua a alteração quando e tecla enter é pressionada } procedure TForm1.ListEditKeyPress(Sender: TObject; var Key: Char); var ii: Integer; begin if Key = #13 then begin ii := ListBox1.ItemIndex; ListBox1.Items.Delete(ii) ; ListBox1.Items.Insert(ii, ListEdit.Text) ; ListEdit.Visible := False; Key := #0; end; end; { oculta o Edit quando o ListBox perde o foco } procedure TForm1.ListBox1Exit(Sender: TObject) ; begin ListEdit.Visible := False; end;
Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados