Ver Mensaje Individual
  #7  
Antiguo 31-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 26
seoane Va por buen camino
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 ...
Responder Con Cita