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 18-07-2010
jusaso jusaso is offline
Registrado
 
Registrado: dic 2008
Posts: 5
Poder: 0
jusaso Va por buen camino
RichEdit para comentar las ventajas de un ‘producto’

Tengo un fichero RTF formateado con información de una serie de productos..
(Antes utilizaba un fichero TXT, pero pienso que con RTF puede quedar más 'bonito').
Y deseo algo muy sencillo….
Leer el fichero RTF, seleccionar la información referente a uno de los productos y mostrar esta información en el RichEdit.
Con ficheros de texto es muy fácil hacerlo....
Lo cargo en un array de texto. Localizo las líneas referentes a uno de los productos y las muestro en un MEMO o un LIST.
Pero si lo hago con RichEdit, pierde el formato y me muestra los caracteres ocultos del texto.
He consultado en Google… sin resultado.
Una ayuda…
Gracias.
Responder Con Cita
  #2  
Antiguo 19-07-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jusas

El problema de la pérdida del formato lo tenés cuando cargas en un arreglo de texto,
lo que luego se mostrará en el RichEdit.

Yo cargaría directamente el archivo .RTF al RichEdit y luego posisionaría en el texto buscado.

Carga:
Código:
procedure CargarRTF;
begin
  RichEdit1.Lines.LoadFromFile('Archivo.RTF');
end;
Busqueda:
Código:
procedure BuscarEnRTF(Producto: string);
  with RichEdit1 do
  begin
    SetFocus;
    SelStart:= Pos(Producto, RichEdit1.Text)-1;
    SelLength:= Length(Producto); 
  end;
end;
Este código sólo te situa en el nombre del producto y lo deja seleccionado. Ahora bién, si sólo
querés mostrar la parte correspondiente al producto y no todo, tendríamos que normalizar de algún
modo la ayuda.
Es decir, señalizar donde comienza y términa la información de cada producto para luego eliminar las
líneas anteriores y posteriores a la información que queres mostrar.


Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 19-07-2010
jusaso jusaso is offline
Registrado
 
Registrado: dic 2008
Posts: 5
Poder: 0
jusaso Va por buen camino
Gracias por la respuesta...

Estoy de acuerdo...
Primero el load para cargar el texto que contiene la descripción de todos los productos.
Un texto que préviamente ha sido escrito en Word para que quede 'bonito'.
Cada descripción del producto quedá separada por una línea en la que aparece el número que tiene asignado cada producto.
De esta manera para buscar el producto 1234...

Código Delphi [-]
nIni:=0;nFin:=0;    //numero lineas ini y fin
for i:=1 to totalLin do
   begin
   if ansipos('1234',textoArray[i])>0 then nini:=i;
   if ansipos('1235',textoArray[i])>0 then begin nFin:=i;break;end;
   end;

Continuamos...
Localizado el texto, se selecciona con...

SelStart:= Pos(Producto, RichEdit1.Text)-1;
SelLength:= Length(Producto);

Donde... selStart sería el inicio del texto pero ¿no falta indicar el final para calcular la longitud?

Y finalmente, una vez seleccionado, habría que borrar el richEdit (richEdit1.clear) y mostrar solo la parte del texto correspondiente.

Gracias anticipadas...

Última edición por jusaso fecha: 19-07-2010 a las 11:28:20.
Responder Con Cita
  #4  
Antiguo 19-07-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola jusaso, como te dice ecfisa en su codigo de ejemplo solo esta seleccionando el producto por lo que el final es el Length del producto.

No deberías borrar el RichEdit sino trabajar sobre el contenido del mismo RichEdit, yo seleccionaría las líneas que estan antes y despues del texto que se quiere mostrar y eliminarlas.

Código Delphi [-]
procedure BorrarSeleccion;
var
 IniSelect, FinSelect : Integer;
begin
 //Inicio de la selección
 IniSelect := RichEdit1.Perform(EM_LINEFROMCHAR,RichEdit1.SelStart,0);
 //Fin de la selección
 FinSelect := RichEdit1.Perform(EM_LINEFROMCHAR,RichEdit1.SelStart + RichEdit1.SelLength,0);
 
 for i:=IniSelect to FinSelect do
  RichEdit1.Lines.Delete(IniSelect);
end;
...............................................................
...............................................................
...............................................................
 nIni := AnsiPos('1234', Richedit1.Text);
 nFin := AnsiPos('1235', Richedit1.Text);
 
 Richedit1.SelStart := nFin;
 Richedit1.SelLength := Length(Richedit1.Text);
 BorrarSeleccion;
 
 Richedit1.SelStart := 0;
 Richedit1.SelLength := nIni;
 BorrarSeleccion;

el código quedaría mas o menos así, talvez tengas que ajustar algo.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #5  
Antiguo 19-07-2010
jusaso jusaso is offline
Registrado
 
Registrado: dic 2008
Posts: 5
Poder: 0
jusaso Va por buen camino
Gracias por sus respuestas.

El código quedaría pues...

Código Delphi [-]
procedure TForm1.Button6Click(Sender: TObject);
var
  nfin,nIni:integer;
begin
 richedit1.Lines.LoadFromFile('GradosBIEN.rtf');
 nIni:=0;
 nFin:=0;
 nIni := AnsiPos('12345', Richedit1.Text);
 nFin := AnsiPos('12346', Richedit1.Text);

 RichEdit1.SetFocus;
 Richedit1.SelStart := nFin;
 Richedit1.SelLength := Length(Richedit1.Text);
 BorrarSeleccion;

 Richedit1.SelStart := 0;
 Richedit1.SelLength := nIni;
 BorrarSeleccion;
end;

procedure TForm1.BorrarSeleccion;
var
 IniSelect, FinSelect,i : Integer;
begin
 //Inicio de la selección
 IniSelect := RichEdit1.Perform(EM_LINEFROMCHAR,RichEdit1.SelStart,0);
 //Fin de la selección
 FinSelect := RichEdit1.Perform(EM_LINEFROMCHAR,RichEdit1.SelStart + RichEdit1.SelLength,0);

 for i:=IniSelect to FinSelect do
  RichEdit1.Lines.Delete(IniSelect);
end;
Y ciertamente funciona.
Pero tiene un problema importante que habría que solucionar.
El documento Word, en su versión RTF, tiene unas cien páginas.
Y tarda varios segundos, bastantes, en cargarse sobre el RichEdit.

El problema se complica cuando esta operación debe repetirse para cada 'producto'.

Por ello, habría que guardar en memoria la totalidad del texto y mostrar en el RichEdit sólo las líneas referentes al artículo seleccionado.

He visto algunos ejemplos que utilizan TMemoryStream o TStringStream pero nunca he tenido que utilizarlos....

Si se os ocurre algo... os lo agradecería.

Un cordial saludo
Responder Con Cita
  #6  
Antiguo 19-07-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jusaso.

El uso de TMemoryStream no va a acelerar significativamente la carga desde el disco,
que es, a mi criterio el punto álgido del problema.

Tal vez la solución pase por dividir el archivo de ayuda. Podés utilizar el criterio que prefieras;
código, nombre,... buscando una distribución lo más simétrica posible.

En mis pruebas con un Core2Duo y 4 Gb de Ram, con las 100 páginas, obtuve 8 s con la carga directa
del RichEdit, 7s y monedas con MemoryStream. Sin embargo dividiendo el archivo en cinco partes de 20
páginas cada uno la carga no llegó a 1s y la demóra fué casi imperceptible.

Lo que sí, te puede adicionar algunas dificultades al momento de ingresar un nuevo producto y en la
preselección de la ayuda, pero creo que es una solución viable.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 19-07-2010 a las 20:47:34.
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
synedit como comentar codigo con Ctrl + } JXJ Varios 3 08-03-2010 02:35:38
Hacer Scrol en un RichEdit para abajo fide_uci Varios 2 18-11-2009 17:00:45
Mirar por favor este query y comentar... El_Raso Firebird e Interbase 33 18-11-2008 12:53:44
Jefe de producto de servidores!!!! (para Madrid) jcuesta Varios 1 17-12-2006 18:31:06
Parte de un RichEdit a otro RichEdit (donde esté el cursor) Tomy Varios 3 21-12-2005 21:08:15


La franja horaria es GMT +2. Ahora son las 04:23:18.


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