2012-10-12 213 views
5

trato de obtener el nombre de todas las formas de la página cargada. He hecho esto:Cromo: ¿Cómo obtener toda forma de una página cargada

procedure TForm2.Button2Click(Sender: TObject); 
var 
    L: TStringList; 
begin 
    L := TStringList.Create; 

    try 
    Chromium1.Browser.MainFrame.VisitDomProc(
     procedure (const doc: ICefDomDocument) 
     procedure IterateNodes(Node: ICefDomNode); 
     begin 
      if not Assigned(Node) then Exit; 
      repeat 
      if Node.ElementTagName = 'FORM' then 
       L.Add(Node.GetElementAttribute('name')); 

      if Node.HasChildren then IterateNodes(Node.FirstChild); 

      Node := Node.NextSibling; 
      until not Assigned(Node); 
     end; 
     begin 
     IterateNodes(doc.Body); 
     end 
    ); 

    ShowMessage(L.Text); 
    finally 
    FreeAndNil(L); 
    end; 
end; 

Pero no tengo ningún resultado. ¿Alguna idea?

Gracias

+1

¿Qué pasó cuando caminó por debajo del depurador? –

+1

También desea utilizar SameText en lugar de = manera que la comparación es sensible a mayúsculas –

+0

@ David, creo que tu segundo comentario es la respuesta ... – TLama

Respuesta

3

Con XE2 Update 4

me he dado cuenta de que el flujo del programa continua cuando se ejecuta el parámetro de procedimiento de manera que al llegar a la ShowMessage todavía no se ha ejecutado este procedimiento y por lo tanto la TStringList está vacía.

he puesto un control variable booleana y ha funcionado bien, pero esto no es una solución elegante.

Aquí el nuevo código:

procedure TForm2.Button2Click(Sender: TObject); 
var 
    L: TStringList; 
    Finish: Boolean; 
begin 
    L := TStringList.Create; 
    Finish := False; 

    try 
    Chromium1.Browser.MainFrame.VisitDomProc(
     procedure (const doc: ICefDomDocument) 
     procedure IterateNodes(Node: ICefDomNode); 
     begin 
      if not Assigned(Node) then Exit; 
      repeat 
      if SameText(Node.ElementTagName, 'FORM') then 
      begin 
       L.Add(Node.GetElementAttribute('name')); 
      end; 

      if Node.HasChildren then 
       IterateNodes(Node.FirstChild); 

      Node := Node.NextSibling; 
      until not Assigned(Node); 
     end; 
     begin 
     IterateNodes(doc.Body); 
     Finish := True; 
     end 
    ); 

    repeat Application.ProcessMessages until (Finish); 
    ShowMessage(L.Text); 
    finally 
    FreeAndNil(L); 
    end; 
end; 
+0

Estoy seguro de que puede esperar algo, o solicitar una devolución de llamada cuando se complete la iteración. –

+0

Estoy abierto a sugerencias :-) – cadetill

+0

No tengo experiencia con ese control. ¿Dónde está la documentación? –

1

He conseguido toda la página como esta:

  1. inyectar un elemento DOM - texto.
ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("body").prepend(''<input type="text" id="msoftval" value=""/>'')', '', 0); 
  1. usar jQuery o js para conseguir html cuerpo en el elemento inyectado.
mResult := ''; 
ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("#msoftval").val($("body").html());', '', 0); 
ChromiumWB.Browser.MainFrame.VisitDomProc(getResult); 
while mResult = '' do Application.ProcessMessages; 
Memo1.Text := mResult; 
  1. esperar 'VisitDomProc' hasta el ACABADO hacen sincronización.
procedure TForm44.getResult(const doc: ICefDomDocument); 
var 
    q: ICefDomNode; 
begin 
    q := doc.GetElementById('msoftval'); 
    if Assigned(q) then 
    mResult := q.GetValue 
    else 
    mResult := '-'; 
end; 
Cuestiones relacionadas