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
  #1  
Antiguo 08-12-2009
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
Alguien sabe un modo mas efectivo de hacer esto con el texto de un memo

Lo que hago es cargar un fichero de texto de unas 700 lineas en un memo y me interesa quitale lineas por arriba y por abajo y luego reemplazar alguna palabra. Pero la eficiencia es nula y le cuesta bastante hacerlo.
Me podeis decir cual seria la forma correcta de hacerlo para que vaya rápido.
Quizas usando otro componente que no sea el memo clásico?

Cita:
//busco en el memo desde el principio una linea que coincida con PALABRA y borro todas las anteriores lineas
while Memo1.Lines[0]<>'PALABRA' do memo1.Lines.Delete(0);

//borrar todas las lineas del memo a partir de la 127 en adelante.
for I := 0 to Memo1.Lines.Count do memo1.Lines.Delete(127);

//recorrer las lineas que quedan y sustituir Palabra1 por Palabra2
for x := 0 to Memo1.Lines.Count do
memo1.lines[x]:= StringReplace( memo1.Lines[x],'palabra1','palabra2',[rfReplaceAll]);
gracias
Responder Con Cita
  #2  
Antiguo 08-12-2009
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
Tal vez trabajando con su propiedad text ganes eficiencia, aunque el mecanismo empleado será distinto.
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #3  
Antiguo 08-12-2009
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
¿no existe algun modo de borrar lineas por un rango sin tener que recorrer una por una?
por ejemplo decir borrar desde la linea 0 a la 300.
Responder Con Cita
  #4  
Antiguo 09-12-2009
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Pienso que lo mejor seria usar Expresiones Regulares y pasar el texto a una vble de memoria, procesarla y luego pasarla al memo (asi no interfiere el código interno del memo reaccionando a los cambios del texto).

Ahora no veo que 700 lineas sea algo impresionante y no aclaras que es "ineficiente". Seria bueno empezar por ahi... que es "ineficiente"?

Delphi es super rapido con los strings, y he procesado al menos varias megas de texto sin lios...
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 09-12-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Lo primero que se me ocurre es que trabajes con una estructura en memoria, no ligada a ningun componente. Eso te evitará operaciones de refresco y similares.

Código Delphi [-]
var
  TS:TStrings;
begin
  TS := TStringList.Create();

   // Asignar a TS lo que te interesa 
   ...
   // Trabajar en TS
   ...

  
  // Volver el resultado al memo.
  Memo.Lines.Clear;
  Memo.Lines.AddStrings(TS);

Otra cosa que te podría optimizar la operación, es no eliminar lo que te sobra, sino quedarte con lo que te vale y trabajar con eso.

1) Recorre las líneas hasta encontrar <PALABRA>
2) Copia desde esa línea hasta la 127 a TS
3) Trabaja sobre TS
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 09-12-2009
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Cita:
Lo primero que se me ocurre es que trabajes con una estructura en memoria,
Pero si la propiedad Lines del memo es de tipo TStrings, para evitar operaciones visuales basta con llamar a los metodos BeginUpdate y EnUpdate..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #7  
Antiguo 09-12-2009
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
Cita:
Empezado por Delfino Ver Mensaje
Pero si la propiedad Lines del memo es de tipo TStrings, para evitar operaciones visuales basta con llamar a los metodos BeginUpdate y EnUpdate..
he añadido

Memo1.Lines.beginupdate;
...
....
...
Memo1.Lines.EndUpdate;

Pero creo que no se gana nada, sigue tardando bastante en procesar.
Responder Con Cita
  #8  
Antiguo 09-12-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Si cambias tu código por uno como este:

Código Delphi [-]
procedure TForm1.FormActivate(Sender: TObject);
const
  CHAR_CRLF = #13#10;
var
  x:integer;
  Str:String;
begin
  Str := '';
Str := Str + '1-' + FormatDateTime('hh:mm:ss:zzz', now) + CHAR_CRLF;
//cargo la web en un memo
memo1.Lines.Text:=idHttp1.Get('http://www.aemet.es/es/eltiempo/prediccion/localidades?l=22001');
  Str := Str + '2-' + FormatDateTime('hh:mm:ss:zzz', now) + CHAR_CRLF;
//borro todas lineas hasta ...
while Memo1.Lines[0]<>'

' do memo1.Lines.Delete(0); Str := Str + '3-' + FormatDateTime('hh:mm:ss:zzz', now) + CHAR_CRLF; //borro lineas de detras de ... while memo1.Lines[memo1.Lines.Count-1]<>'
' do memo1.Lines.Delete(memo1.Lines.Count-1); memo1.Lines.Delete(memo1.Lines.Count-1); memo1.Lines.Delete(memo1.Lines.Count-1); Str := Str + '4-' + FormatDateTime('hh:mm:ss:zzz', now) + CHAR_CRLF; // Añado hoja de estilos a la primera linea memo1.lines[0]:= '

'; Str := Str + '5-' + FormatDateTime('hh:mm:ss:zzz', now) + CHAR_CRLF; //reparo los links para que se muestren las imagenes: for x := 0 to Memo1.Lines.Count do memo1.lines[x]:= StringReplace( memo1.Lines[x],'/imagenes/','http://www.aemet.es/imagenes/',[rfReplaceAll]); Str := Str + '6-' + FormatDateTime('hh:mm:ss:zzz', now) + CHAR_CRLF; //cargo el resultado en el webbrowser wb1.LoadFromStrings(memo1.lines); Str := Str + '7-' + FormatDateTime('hh:mm:ss:zzz', now) + CHAR_CRLF; MessageDlg(Str, mtInformation, [mbOK], 0); end;


La ventana que aparece es la siguiente:




Como ves, el tiempo realmente se "pierde"en la petición de la página, y no en las operaciones sobre el memo, aunque supongo que si eliminas los borrados tal y como te he dicho algo ganarías...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 09-12-2009
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje

Ahora no veo que 700 lineas sea algo impresionante y no aclaras que es "ineficiente". Seria bueno empezar por ahi... que es "ineficiente"?

Delphi es super rapido con los strings, y he procesado al menos varias megas de texto sin lios...
no me quejo por quejarme, a la aplicacion le cuesta unos 7 segundos hacer todo el proceso. Y tengo un Intel Quad Q6600 y 4gb der ram, osea que no es problema de potencia.

Aclaro algo que no habia dicho, es que el texto es el código de una web que cargo previamente con el componente TIdHTTP de las Indy. Pero ese proceso es rápido.

Os pongo el codigo fuente para que lo veais, es un simple capricho de cargar solo el cuadro del tiempo de mi provincia desde la web de aemet.
Uso el webbrowser de http://www.bsalsa.com/, ya que me permite sin hacer nada cargar un string en el browser, ocultar scrollbars...

Seguramente el problema como decis esta en usar un tmemo para hacer los cambios, estoy probando trabajar directamente con el tstrings pero me faltan cosas que con el memo las hacia más facil.

He leido que quizas usando el componente JvHtmlParser de JEDI me iria mejor, pero lo he mirado y no me aclaro bien como funciona.
Archivos Adjuntos
Tipo de Archivo: zip ELTIEMPO.zip (9,2 KB, 9 visitas)

Última edición por cocute fecha: 09-12-2009 a las 13:33:56.
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
Alguien sabe como hacer esto? MaMu Gráficos 3 18-05-2007 18:33:43
Alguien sabe como hacer que una query sea modificable pjmedina Varios 20 12-04-2007 11:17:27
Alguien sabe como hacer que tu aplicacion se ejecute... Supra Varios 7 05-02-2005 21:10:09
Alguien sabe como hacer un ShotDown a Firebird 1.51???? AGAG4 Conexión con bases de datos 3 28-10-2004 18:02:21
¿alguien sabe hacer esto? (conexion a mySQL desde delphi pero sin acceso...) seccion31 Internet 24 27-08-2004 17:14:23


La franja horaria es GMT +2. Ahora son las 21:31:57.


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