Mensaje    Asunto: TListBox con items editables Responder citando

Recientemente necesitaba un TListBox editable. Improvisé con un TEdit:

Código:


//-------------------------------------

void __fastcall TForm1::FormShow(TObject *Sender)
{
   ListBox2->Items->Add("void");
   ListBox2->Items->Add("__fastcall");
   ListBox2->Items->Add("TForm1");
   ListBox2->Items->Add("::");
   ListBox2->Items->Add("FormShow");
   ListBox2->Items->Add("(");
   ListBox2->Items->Add("TObject");
   ListBox2->Items->Add("*");
   ListBox2->Items->Add("Sender");
   ListBox2->Items->Add(")");
   ListBox2->Items->Add("void __fastcall TForm1");
   ListBox2->Items->Add("::FormShow");
   ListBox2->Items->Add("(TObject *Sender)");

   // Colores de selección en el listbox
   Edit2->Color = (TColor)0x00FF9933;
   Edit2->Font->Color = clWhite;
   // importante
   Edit2->BorderStyle = bsNone;
}

//-------------------------------------

void __fastcall TForm1::Edit2Change(TObject *Sender)
{
  ListBox2->Items->Strings[ListBox2->ItemIndex] = Edit2->Text;
}
//-------------------------------------

void __fastcall TForm1::ListBox2MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
   TRect r;
   r = ListBox2->ItemRect(ListBox2->ItemIndex);
   Edit2->Parent = ListBox2;
   Edit2->SetBounds(r.Left, r.Top, (r.Right - r.Left) + 2, r.Bottom - r.Top);
   Edit2->Text = ListBox2->Items->Strings[ListBox2->ItemIndex];
   Edit2->SetFocus();
   Edit2->SelStart = Edit2->Text.Length();
   // Coloque un borde de 2 píxeles en TEdit para vincularlo con el borde del listbox
   ::SendMessage( Edit2->Handle, EM_SETMARGINS, EC_LEFTMARGIN, (LPARAM)MAKELONG(2, 0) );
   ListBox2->Repaint();
}
//-------------------------------------