加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – Chromium:如何获取所有形式的加载页面

发布时间:2020-12-15 04:13:26 所属栏目:大数据 来源:网络整理
导读:我尝试获取所有加载页面形式的名称.我这样做了: procedure TForm2.Button2Click(Sender: TObject);var L: TStringList;begin L := TStringList.Create; try Chromium1.Browser.MainFrame.VisitDomProc( procedure (const doc: ICefDomDocument) procedure I
我尝试获取所有加载页面形式的名称.我这样做了:
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;

但我没有任何结果.任何的想法?

谢谢

解决方法

使用XE2 Update 4

我已经意识到程序流在运行procedure参数时会继续运行,因此在到达ShowMessage时仍然没有运行此过程,因此TStringList为空.

我已经放置了一个布尔变量控件,它工作正常,但这不是一个优雅的解决方案.

这里有新代码:

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读