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;