2012-10-12 3 views
5

Ich versuche, den Namen aller Formen der geladenen Seite zu bekommen. Ich habe das getan:Chromium: Wie bekomme ich alle Form einer geladenen Seite

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; 

Aber ich habe kein Ergebnis. Irgendeine Idee?

Dank

+1

Was ist passiert, als Sie unter dem Debugger durchgegangen sind? –

+1

Sie möchten auch SameText anstatt = verwenden, so dass Vergleich Groß-und Kleinschreibung nicht berücksichtigt –

+0

@David, ich denke, Ihr zweiter Kommentar ist die Antwort ... – TLama

Antwort

3

Mit XE2 Update 4

ich, dass der Programmablauf realisiert wird fortgesetzt, wenn die Prozedur Parameter so, dass die Ausführung der Showmessage noch und deshalb diese Prozedur auszuführen hat nicht der TStringList ist leer bei Erreichen.

Ich habe eine boolesche Variable Steuerelement und es hat richtig funktioniert, aber das ist keine elegante Lösung.

Hier neuen Code:

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

Ich bin sicher, dass Sie auf etwas warten können, oder bitten Sie um einen Rückruf, wenn die Iteration abgeschlossen ist. –

+0

Ich bin offen für Vorschläge :-) – cadetill

+0

Ich habe keine Erfahrung mit dieser Kontrolle. Wo ist die Dokumentation? –

1

ich es geschafft, die ganze Seite wie folgt zu erhalten:

  1. ein DOM-Element injizieren - Text.
ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("body").prepend(''<input type="text" id="msoftval" value=""/>'')', '', 0); 
  1. Verwendung jquery oder js Körper html in injizierten Element zu erhalten.
mResult := ''; 
ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("#msoftval").val($("body").html());', '', 0); 
ChromiumWB.Browser.MainFrame.VisitDomProc(getResult); 
while mResult = '' do Application.ProcessMessages; 
Memo1.Text := mResult; 
  1. , bis 'VisitDomProc' warten FERTIG- es sync machen.
procedure TForm44.getResult(const doc: ICefDomDocument); 
var 
    q: ICefDomNode; 
begin 
    q := doc.GetElementById('msoftval'); 
    if Assigned(q) then 
    mResult := q.GetValue 
    else 
    mResult := '-'; 
end; 
Verwandte Themen