2012-10-12 14 views
5

Próbuję uzyskać nazwę wszystkich formularzy załadowanej strony. Zrobiłem to:Chrom: Jak uzyskać całą postać załadowanej strony?

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; 

Ale nie mam żadnego wyniku. Dowolny pomysł?

Dzięki

+1

Co się stało po przejściu przez debugger? –

+1

Również chcesz użyć SameText zamiast = tak, aby porównanie nie uwzględniało wielkości liter –

+0

@David, myślę, że twój drugi komentarz jest odpowiedzią ... – TLama

Odpowiedz

3

Z XE2 Update 4

zdałem sobie sprawę, że przepływ program kontynuuje podczas uruchamiania parametr procedury, tak, że po osiągnięciu ShowMessage nadal nie uruchomić tę procedurę, a zatem TStringList jest pusty.

Wprowadziłem zmienną boolean i działało to dobrze, ale to nie jest eleganckie rozwiązanie.

Tutaj nowego kodu:

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

Jestem pewien, że możesz poczekać na coś lub poprosić o oddzwonienie po zakończeniu iteracji. –

+0

Jestem otwarty na sugestie :-) – cadetill

+0

Nie mam doświadczenia z tą kontrolą. Gdzie jest dokumentacja? –

1

udało mi się dostać całą stronę tak:

  1. wstrzyknąć elementu DOM - tekst.
ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("body").prepend(''<input type="text" id="msoftval" value=""/>'')', '', 0); 
  1. Zastosowanie jQuery lub JS uzyskać html ciała do wtryskiwanego elementu.
mResult := ''; 
ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("#msoftval").val($("body").html());', '', 0); 
ChromiumWB.Browser.MainFrame.VisitDomProc(getResult); 
while mResult = '' do Application.ProcessMessages; 
Memo1.Text := mResult; 
  1. czekać, aż 'VisitDomProc' wykańczającej sprawiają, że synchronizacja.
procedure TForm44.getResult(const doc: ICefDomDocument); 
var 
    q: ICefDomNode; 
begin 
    q := doc.GetElementById('msoftval'); 
    if Assigned(q) then 
    mResult := q.GetValue 
    else 
    mResult := '-'; 
end; 
Powiązane problemy