Volviendo al método numero uno, el ortodoxo
Supongo que esto funcionaría:
Código Delphi
[-]
procedure TForm1.Memo1Change(Sender: TObject);
var
Str: String;
i,j: integer;
begin
Str:= Memo1.Lines.Text;
j:= 0;
for i:= 1 to Length(Str) do
if (Str[i] <> #13) and (Str[i] <> #10) then
inc(j);
StaticText1.Caption:= IntToStr(j);
end;
Aunque supongo que ya habrías pensado en una solución parecida, entonces me pregunto si lo que te preocupaba es el tiempo que se tarda en contar los caracteres. Si es así lo podemos afinar un poco mas:
Código Delphi
[-]
function Longitud(Str: PChar): Integer;
asm
MOV Result,0
DEC EAX
@@SIG:
INC EAX
CMP BYTE PTR [EAX],0
JE @@SALIR
CMP BYTE PTR [EAX],13
JE @@SIG
CMP BYTE PTR [EAX],10
JE @@SIG
INC Result
JMP @@SIG
@@SALIR:
end;
procedure TForm1.Memo1Change(Sender: TObject);
begin
StaticText1.Caption:= IntToStr(Longitud(PChar(Memo1.Lines.Text)));
end;
En cuanto al segundo método, es complicado, piensa que cuando usas Enter se introducen
dos caracteres y no uno, que puedes seleccionar y borrar mas de un carácter a la vez y ya no hablamos si utilizas el portapapeles ...