Конференция "Сети" » TChromium в Delphi XE3 [D7, WinXP]
 
  • LuckyD © (24.03.13 16:49) [0]
    Разбираю работу с компонентом TChromium в Delphi XE3
    нужно добраться до содержания загруженной страницы
    на форумах нашел примеры рабочих кодов:


    procedure DoWork (const doc: ICefDomDocument);
    var
     q: ICefDomNode;
    begin
     q := doc.GetElementById('q');
     if Assigned(q) then q.SetElementAttribute('value', 'Hello, world');
    end;

    procedure actDomExecute;
    var
     q: ICefDomNode;
    begin
      crm.Browser.MainFrame.VisitDomProc(DoWork);
    end;


    Но отладчик почему-то упрямо минует исполнение процедуры DoWork. В чем может быть загвоздка?
  • brother © (24.03.13 18:12) [1]
    VisitDomProc(DoWork(q));
    ?
  • LuckyD © (24.03.13 19:19) [2]
    Спасибо верно замечено, но все же не хочет...

    [dcc32 Error] Unit1.pas(159): E2010 Incompatible types: 'TCefDomVisitorProc' and 'procedure, untyped pointer or untyped parameter'

    Выложите, если есть, работающий похожий код ...
  • clickmaker © (24.03.13 20:46) [3]
    а VisitDomProc не минует?
  • LuckyD © (24.03.13 21:23) [4]
    Сейчас исправил, VisitDomProc(DoWork(q)) стал требовать параметр типа TCefDomVisitorProc, а во всех примерах методу просто анонимную процедуру передают, совершенно непонятно.
  • LuckyD © (24.03.13 21:48) [5]
    На англоязычном форуме нашел подсказку

    Доступ к DOM возможен только в процессе рендеринга, необходимо использовать:

    TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
    private
     procedure ProcessDOM(const ADocument: ICefDomDocument);
     procedure ProcessNode(ANode: ICefDomNode);
    protected
     function OnProcessMessageReceived(const browser: ICefBrowser;
       sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean; override;
    public
    end;

    function TCustomRenderProcessHandler.OnProcessMessageReceived(
     const browser: ICefBrowser; sourceProcess: TCefProcessId;
     const message: ICefProcessMessage): Boolean;
    begin
     if (message.Name = 'visitdom') then
     begin
       browser.MainFrame.VisitDomProc(ProcessDOM);
       Result := True;
     end
     else
       Result := False;
    end;

    CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
    TCustomRenderProcessHandler(CefRenderProcessHandler).bFinish := False;

    procedure TMainForm.Chrome1LoadEnd(Sender: TObject; const ABrowser: ICefBrowser; const AFrame: ICefFrame; AStatus: Integer);
    begin
     if (AStatus = 200) and (ABrowser<>nil) and AFrame.IsMain then
       ABrowser.SendProcessMessage(PID_RENDERER, TCefProcessMessageRef.New('visitdom'));
    end;




    procedure ProcessNode(ANode: ICefDomNode);
    var
     Node1: ICefDomNode;
    begin
     if Assigned(ANode) then begin
       Node1 := ANode.FirstChild;
       while Assigned(Node1) do begin
         {Do stuff with node}
         ProcessNode(Node1);
         Node1 := Node1.NextSibling;
       end;
     end;
    end;

    procedure ProcessDOM(const ADocument: ICefDomDocument);
    begin
     ProcessNode(ADocument.Body);
    end;

    procedure TMainForm.Chrome1LoadEnd(Sender: TObject; const ABrowser: ICefBrowser; const AFrame: ICefFrame; AStatus: Integer);
    begin
     if Assigned(AFrame) then AFrame.VisitDomProc(ProcessDOM);
    end;



    как это интернесно в форме выглядеть будет
  • DVM © (27.03.13 14:01) [6]

    > LuckyD ©   (24.03.13 21:48) [5]


    > Доступ к DOM возможен только в процессе рендеринга

    Из JavaScript-а есть доступ к DOM, всегда можно заслать JavaScript нужный на выполнение, он и значение вернуть может.
  • LuckyD © (14.04.13 13:26) [7]
    А как будет выглядеть функция получение значения из скрипта?
    Например установка наименования:
    Chromium1.Browser.MainFrame.ExecuteJavaScript('document.title="Hello Worlf"', '', 0);
    Как получение будет?
  • DVM © (14.04.13 19:41) [8]
 
Конференция "Сети" » TChromium в Delphi XE3 [D7, WinXP]
Есть новые Нет новых   [118230   +17][b:0][p:0.001]