Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 01-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A ver, si lo que se quiere es descontar los saltos de línea y sabemos que hay dos caracteres por cada salto, ¿no es más facil tomar la longitud del texto y restarle 2 veces el número de líneas?

Código Delphi [-]
procedure TForm1.Memo1Change(Sender: TObject);
var
  L, I: Integer;

begin
  L := Memo1.Perform(EM_GETLINECOUNT, 0, 0);
  I := Length(Memo1.Lines.Text) - 2*(L - 1);

  Edit1.Text := Format('%d caracteres', [i]);
end;

// Saludos
Responder Con Cita
  #22  
Antiguo 01-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿y por que no?

Código Delphi [-]
var
  i,j: integer;
begin
  j:= 0;
  for i:= 0 to Memo1.Lines.Count do
    inc(j,Length(Memo1.Lines[i]));
  Caption:= IntToStr(j);
end;

En los códigos anteriores estamos usando la propiedad Text, que no existe como tal, si no que se crea juntando todas las lineas en un solo string, con la consecuente perdida de tiempo en ese bucle. Así que es mejor acceder directamente a cada linea y sumar sus longitudes, así también eliminamos los saltos de linea y evitamos andar moviendo los caracteres de un string a otro antes de contarlos.

cuantas formas de "despellejar a un gato" ...
Responder Con Cita
  #23  
Antiguo 01-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
La propiedad Text se obtiene mandando el mensaje WM_GETTEXT. La verdad es que hubiera jurado que era como tú decías pero revisando el código de la VCL se ve eso.

// Saludos
Responder Con Cita
  #24  
Antiguo 01-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por roman
La propiedad Text se obtiene mandando el mensaje WM_GETTEXT. La verdad es que hubiera jurado que era como tú decías pero revisando el código de la VCL se ve eso.

// Saludos
Al menos en mi version de delphi no:
Código Delphi [-]
function TStrings.GetTextStr: string;
var
  I, L, Size, Count: Integer;
  P: PChar;
  S, LB: string;
begin
  Count := GetCount;
  Size := 0;
  LB := LineBreak;
  for I := 0 to Count - 1 do Inc(Size, Length(Get(I)) + Length(LB));
  SetString(Result, nil, Size);
  P := Pointer(Result);
  for I := 0 to Count - 1 do
  begin
    S := Get(I);
    L := Length(S);
    if L <> 0 then
    begin
      System.Move(Pointer(S)^, P^, L);
      Inc(P, L);
    end;
    L := Length(LB);
    if L <> 0 then
    begin
      System.Move(Pointer(LB)^, P^, L);
      Inc(P, L);
    end;
  end;
end;

Ahora bien, puede que tu estés hablando de Memo1.Text y no de Memo1.Lines.Text. En el primer caso si que se obtiene con WM_GETTEXT, no así en el segundo caso, como se puede ver en el código anterior.
Responder Con Cita
  #25  
Antiguo 01-02-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.561
Poder: 25
egostar Va camino a la fama
Gracias Roman

Tu código también esta de 10.

YA lo probe y esta perfecto, bien dices seoane, hay muchas fformas de "despellejar a un gato"

Cuantas formas diferente de hacer esto.

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #26  
Antiguo 01-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En Delphi 7 es igual, sólo que tú estás hablando de TStrings.Text, pero la propiedad Lines del TMemo es de tipo TMemoStrings que redefine GetTextStr

Código Delphi [-]
function TMemoStrings.GetTextStr: string;
begin
  Result := Memo.Text;
end;

y es Memo.Text la que se obtiene usando WM_GETTEXT.

// Saludos
Responder Con Cita
  #27  
Antiguo 01-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por roman
pero la propiedad Lines del TMemo es de tipo TMemoStrings


Código Delphi [-]
  property Lines: TStrings read FLines write SetLines;
Responder Con Cita
  #28  
Antiguo 01-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Claro, así está declarada para que sea compatible con TStrings, pero se construye usando TMemoStrings:

Código Delphi [-]
constructor TCustomMemo.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width := 185;
  Height := 89;
  AutoSize := False;
  FWordWrap := True;
  FWantReturns := True;
  FLines := TMemoStrings.Create;
  TMemoStrings(FLines).Memo := Self;
  ParentBackground := False;
end;

// Saludos
Responder Con Cita
  #29  
Antiguo 01-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Perfecto, esto me aclara algunas cosas. Gracias roman
Responder Con Cita
  #30  
Antiguo 01-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
De hecho, por eso hubiera jurado que era como tú decías. Siendo TStrings una clase independiente de cualquier control, pues no hay forma de obtener el texto total como no sea concatenando de una u otra forma cada línea. Pero esa es la maravilla de TStrings, una clase base sumamente versátil pero perfectamente adecuada para muchos descendientes. Creo que muchos controles hacen los mismo: combos, listbox, etc.

Ahora, si- como sería más lógico -se decide descartar también los espacios en el conteo como comenta Caral, no cabe duda que tú código y el de ArdiIIa en ensamblador son lo óptimo.

// Saludos
Responder Con Cita
  #31  
Antiguo 01-02-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.561
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por roman
Ahora, si- como sería más lógico -se decide descartar también los espacios en el conteo como comenta Caral, no cabe duda que tú código y el de ArdiIIa en ensamblador son lo óptimo.
Pues muchas gracias por los aportes, incluso esto que dices Roman me parece que debo platicarlo con mi cliente porque si, efectivamente, suena lo mas lógico, ademas de hacer lo que nos piden una parte fundamental de ser programador es la de asesorar a los clientes y entregar un producto que se agradezca .

Saludos.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Contar Dtos en un SQl IVAND SQL 7 03-08-2006 23:25:35
contar caracteres Cosgaya Varios 1 04-06-2005 17:40:54
Contar Dias Paradiso Varios 2 27-06-2004 11:35:30
Contar Caracteres Nuria Varios 2 29-12-2003 10:36:46
Problema con contar kao SQL 3 07-07-2003 10:47:14


La franja horaria es GMT +2. Ahora son las 02:51:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi