Hola,
Cita:
|
He aquí mi primer problema, no creo que esa solución sea elegante, tener un TRishEdit oculto para esas cosas, y luego que la búsqueda la hago en todo el documento incluyendo etiquetas y todo lo cual no resulta muy preciso a la hora de buscar, por lo que me gustaría saber si existe algún componente que parseara el htm (recuerden que es exportado por word) y me devuelva solo el texto para hacer la búsqueda en esa cadena.
|
Existen funciones o librerías que pueden echarte una mano: seguro. Yo usaba en cierto programa la siguiente función, aunque, reconozco que ahora mismo comenzaría buscando alguna otra cosa, no por nada, sino, porque, hace ya unos cuantos años del programa en cuestión. Tal vez incluso me parara un poco a ver:
Código Delphi
[-]
function Html2Text(html : string) : string;
var
t : TStringList;
s, texto : string;
i, n : Integer;
estexto : Boolean;
begin
t := TStringList.Create;
try
t.LoadFromFile(html);
s := t.Text;
i := 0;
esTexto := false;
texto := '';
for n := 1 to Length(s) do begin
if i > 0 then
Dec(i)
else
begin
if (s[n] = '&') and
(Uppercase(s[n + 1]) = 'N') and
(Uppercase(s[n + 2]) = 'B') and
(Uppercase(s[n + 3]) = 'S') and
(Uppercase(s[n + 4]) = 'P') and
(Uppercase(s[n + 5]) = ';') then
begin
i:= 5;
texto:= texto + ' ';
end
else
if (s[n] = '&') and
(Uppercase(s[n + 1]) = 'Q') and
(Uppercase(s[n + 2]) = 'U') and
(Uppercase(s[n + 3]) = 'O') and
(Uppercase(s[n + 4]) = 'T') and
(Uppercase(s[n + 5]) = ';') then
begin
i:= 5;
texto:= texto + '"';
end
else
if esTexto and (s[n] <> '<') then
texto:= texto + s[n];
if s[n] = '<' then
begin
esTexto:= false;
if (Uppercase(s[n + 1]) = 'B') and
(Uppercase(s[n + 2]) = 'R') and
(Uppercase(s[n + 3]) = '>') then
texto:= texto + #10;
end;
if s[n] = '>' then
esTexto:= true;
end; end; s := '';
s := texto;
texto := '';
i := 0;
for n := 1 to Length(s) do begin
if i > 0 then
Dec(i)
else
begin
if (s[n] = #13) and
(s[n + 1] = #10) and
(s[n + 2] = #13) and
(s[n + 3] = #10) then
i := 1
else
texto := texto + s[n];
end;
end; t.Text := texto;
Result := t.Text;
finally
t.Free;
end;
end;
Lamento de veras no poder decir de dónde salió la función que copio, puesto que, una cosa es segura: yo no la escribí. Pero, a lo que iba, que era, comentarte que acaso no te interese el paso intermedio de convertir HTML a texto. ¿Por qué? Pues... porque no veo a nadie buscando cosas como "HTML", o "IMG", en fin, etiquetas HTML. Yo creo que el paso de HTML a texto puedes ahorrártelo, o, en principio, es lo que me parece. Pero, ya ves que existen soluciones para todo, bueno, por lo menos, para esto.
Por otro lado, y, sabiendo (aunque no sé) que desde Delphi puede trabajarse con Word... ¿por qué no hacerlo con este, directamente? O tal vez sea cuestión de que Word no va a estar disponible en todas las máquinas o algo así... sobre esto no me hagas mucho caso, la verdad. Yo me refería a mostrar Word (o el "Server" oportuno) em el formulario, y aprovecharse de las características de búsqueda conque cuente este, que digo yo que contará con ellas, vamos.
Cita:
|
Además después que encuentro los documentos me gustaría que al seleccionar uno aparezca las coincidencias con la cadena de búsqueda en otro formato, lo primer que se me ocurrió fue abrir con mi richedit oculto la página seleccionada y guardarla en una carpeta temporal después de haber remplazado las coincidencias con la cadena de búsqueda por ella misma pero formateada, pero esto no funciona, por algún motivo cuando voy a mostrar el documento resultante se muestran códigos raros y texto basura.
|
Porque estás tratando con "caracteres extraños", del formato de Word, o del propio formato HTML. Y sobre esto hay que prestar más atención. Personalmente, hace poco, traté de llevar a cabo en un programa un buscador "parecido" sobre HTML, de modo que tenía que utilizar una expresión regular (que no salió de mi cabeza) para evitar reemplazar, o hacerlo con cierto cuidado, el texto contenido entre etiquetas HTML, porque, de no hacerlo así, "rompía" dichas etiquetas, y con ello el documento HTML en cuestión.
No sé. Acaso no sería mala idea convertir el HTML a texto... y guardar el texto en una base de datos, que pudiera consultarse más o menos sencillamente, aunque, ahora que lo pienso, esto podría atacar la primera cuestión que planteas, pero, no esta segunda.
Pienso en que el Embedded WebBrowser cuente (¿Lo he soñado acaso? ¿Es que es lo que quiero recordar?) con algún método que te facilite el asunto. Si Internet Explorer puede buscar en documentos y "subrayar" lo que se busca en los mismos... tal vez tú puedas usar lo que Internet Explorer ofrezca al respecto. O sea, investigar el componente Embedded WebBrowser, aunque, qué tonterías digo, seguro que esto ya lo has hecho o estás haciéndolo...
En fin. Como veo que me estoy alargando y en realidad no aporto ninguna solución clara, lo dejo aquí, por el momento. Y lamento no poderte decir otra cosa...