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;