La solucion del TMemo es una de las mas antiguas... pero va de maravilla 
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
int caret = Memo1->SelStart ;
String text = Memo1->Text ;
for (int index = text.Pos ("\n") ; index != 0 ; index = text.Pos ("\n"))
{
text.Delete (index, 1) ;
-- caret ;
}
for (int index = text.Pos ("\r") ; index != 0 ; index = text.Pos ("\r"))
{
text.Delete (index, 1) ;
-- caret ;
}
if (caret != Memo1->SelStart)
{
Memo1->Text = text ;
Memo1->SelStart = caret ;
}
}
Roberto Porcar
Club Builder