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;