Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Ventana emergente al pasar html a texto plano (https://www.clubdelphi.com/foros/showthread.php?t=81286)

ZayDun 30-10-2012 12:42:32

Ventana emergente al pasar html a texto plano
 
Hola, quiero pasar unos datos html a texto plano y para ello utilizo el siguiente código dentro de un Tbutton:

Código Delphi [-]
var
IDoc: IHTMLDocument2;
Strl: TStringList;
sHTMLFile: String;
v: Variant;
Links: IHTMLElementCollection;
i: Integer;
Link: IHTMLAnchorElement;
begin
if sOpenDialog1.Execute then
begin
sHTMLFile := sOpenDialog1.FileName;
Strl := TStringList.Create;
try
Strl.LoadFromFile(sHTMLFile);
Idoc:=CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
try
IDoc.designMode:='on';
while IDoc.readyState<>'complete' do
Application.ProcessMessages;
v:=VarArrayCreate([0,0],VarVariant);
v[0]:= Strl.Text;
IDoc.write(PSafeArray(System.TVarData(v).VArray));
IDoc.designMode:='off';
while IDoc.readyState<>'complete' do
Application.ProcessMessages;
Memo2.Lines.Text := IDoc.body.innerText;
finally
IDoc := nil;
end;
finally
Strl.Free;
end;
end;

Funciona bien, pero ocurre algo extraño que no se como puedo evitarlo, y es que al hacer la conversión de html a texto se abre una ventana de IExplorer en blanco con la siguiente url "about:blank#_methods=onPlusOne%2C_ready%2C_close%2C_open%2C_resizeMe%2C_renderstart%2Concircled&id= I0_1351596422868&parent=about%3A%2F%2F"

¿Existe alguna manera de evitar que se abra la ventana?
Supongo que de alguna manera se puede evitar al igual que se evita en un WebBrowser con solo poner Cancel:=True; en el OnNewWindow, pero no se como hacer en este caso.

Saludos.

dec 30-10-2012 13:30:16

Hola,

En lugar de buscar una posible solución... ¿no sería mejor utilizar alguna "rutina" para convertir HTML a texto plano, de las que pueden encontrarse buscando en Google, por ejemplo? De este modo matarías, en mi opinión, dos pájaros de un tiro: dejarías de usar el "TWebBrowser" para eso, y, solucionarías de paso el problema... ¿Cómo lo ves?

roman 30-10-2012 15:35:08

Me imagino que con Delphi XE2 y sus expresiones regulares, esto debe ser pan comido :)

// Saludos

ZayDun 30-10-2012 16:54:25

Cita:

Empezado por dec (Mensaje 448328)
Hola,

En lugar de buscar una posible solución... ¿no sería mejor utilizar alguna "rutina" para convertir HTML a texto plano, de las que pueden encontrarse buscando en Google, por ejemplo? De este modo matarías, en mi opinión, dos pájaros de un tiro: dejarías de usar el "TWebBrowser" para eso, y, solucionarías de paso el problema... ¿Cómo lo ves?

He utilizado rutinas incluso algunos componentes, pero estos últimos son de pago (Clever Internet Suit y Chilkat ), y las rutinas que he encontrado no me han dado el resultado esperado ya que faltaba parte del código o mostraba algo de código en html. Gracias por el interés y creo que utilizare algun componente free para "parsear" el código.

ecfisa 30-10-2012 18:15:05

Cita:

Empezado por ZayDun (Mensaje 448325)
...
Funciona bien, pero ocurre algo extraño que no se como puedo evitarlo, y es que al hacer la conversión de html a texto se abre una ventana de IExplorer en blanco con la siguiente url "about:blank#_methods=onPlusOne%2C_ready%2C_close%2C_open%2C_resizeMe%2C_renderstart%2Concircled&id= I0_1351596422868&parent=about%3A%2F%2F"

¿Existe alguna manera de evitar que se abra la ventana?
Supongo que de alguna manera se puede evitar al igual que se evita en un WebBrowser con solo poner Cancel:=True; en el OnNewWindow, pero no se como hacer en este caso.

Hola.

Acabo de ejecutar el código que pusiste y en ningún momento se me presenta IE como mencionas. ¿ Hay más código que pudiera estar involucrado en esa acción ?

Como dato adicional, uso Mozilla Firefox por lo que también probé poniendo y sacando a IE como navegador predeterminado por si esa pudiera haber sido la causa, pero en ningún momento el código abrió IE.

Saludos.

roman 30-10-2012 19:59:14

Corroboro lo que comenta ecfisa. Para efectos de facilitar el trabajo, he resumido el código expuesto en esta función:

Código Delphi [-]
uses MsHtml, ComObj, ActiveX;

function StripTags(S: String): String;
var
  HtmlDocument: IHTMLDocument2;
  PsArray: OleVariant;

begin
  HtmlDocument := CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;

  HtmlDocument.designMode := 'on';

  while HtmlDocument.readyState <> 'complete' do
    Application.ProcessMessages;

  PsArray := VarArrayCreate([0, 0], VarVariant);
  PsArray[0] := S;
  HtmlDocument.write(PSafeArray(TVarData(PsArray).VArray));

  HtmlDocument.designMode := 'off';

  while HtmlDocument.readyState <> 'complete' do
    Application.ProcessMessages;

  Result := HtmlDocument.body.innerText;
end;

He de añadir que el código me gustó porque yo no sabía cómo se accedía a un IHTMLDocument sin tener que crear una instancia del WebBrowser.

// Saludos

ecfisa 30-10-2012 20:07:31

Cita:

Empezado por roman (Mensaje 448376)
He de añadir que el código me gustó porque yo no sabía cómo se accedía a un IHTMLDocument sin tener que crear una instancia del WebBrowser.

Yo también ignoraba como hacerlo, así que: gracias ZayDun ;)

Saludos.:)

elguille 30-03-2015 12:48:30

El codigo descrito en mi caso tenia un comportamiento errático en tiempo de proceso al ejecutarse muchas veces, llegando a estar 20 segundos para una sola transformación en cambio este me ha ido perfecto y rápido...
Código Delphi [-]
uses
MSHTML,
SHDocVw,
ActiveX;

function GetPlainText(Const Html: string): string;
var
DummyWebBrowser: TWebBrowser;
Document       : IHtmlDocument2;
DummyVar       : Variant;
begin
   Result := '';
   DummyWebBrowser := TWebBrowser.Create(nil);
   try
     //open an blank page to create a IHtmlDocument2 instance
     DummyWebBrowser.Navigate('about:blank');
     Document := DummyWebBrowser.Document as IHtmlDocument2; 
     if (Assigned(Document)) then //Check the Document
     begin
       DummyVar      := VarArrayCreate([0, 0], varVariant); //Create a variant array to write the html code to the  IHtmlDocument2
       DummyVar[0]   := Html; //assign the html code to the variant array
       Document.Write(PSafeArray(TVarData(DummyVar).VArray)); //set the html in the document
       Document.Close;
       Result :=(Document.body as IHTMLBodyElement).createTextRange.text;//get the plain text
     end;
   finally
     DummyWebBrowser.Free;
   end;
end;


La franja horaria es GMT +2. Ahora son las 20:49:01.

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