cad*_*ill 6 delphi chromium tchromium
我在使用TChromium(DCEF1)的OnLoadEnd事件时遇到问题.
我有一个带有TButton和TChromium的表格.
按钮的OnClick事件调用一个函数,该函数列出已加载页面的形式.如果我等待页面完成加载然后单击按钮,此功能正常; 但是如果我从TChromium OnLoadEnd事件处理程序调用此函数,则永远不会调用回调函数,因此,我得到一个空列表.
按钮代码(将注释读入代码):
procedure TForm2.Button3Click(Sender: TObject);
var
Q: TWebChromium;
begin
Q := TWebChromium.Create(Chromium1); // <- class to access DOM
Q.WebFormNames; // <- method to get forms name
ShowMessage(Q.Forms.Text); // <- show forms
end;
Run Code Online (Sandbox Code Playgroud)
OnLoadEnd代码:
procedure TForm2.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer; out Result: Boolean);
begin
if (browser <> nil) and (browser.GetWindowHandle = TChromium(Sender).BrowserHandle) and ((frame = nil) or (frame.IsMain)) then
begin
Button3Click(nil);
end;
end;
Run Code Online (Sandbox Code Playgroud)
获取表单名称的方法代码(将注释读入代码):
procedure TWebChromium.WebFormNames;
var
Finish: Boolean;
EndTime: TTime;
begin
FForms.Clear; // <- property (TStringList)
if not Assigned(FWebBrowser) then // <- FWebBrowser: property that contain the TChromium
raise Exception.Create('WebBrowser not assigned');
if not (FWebBrowser is TChromium) then
raise Exception.Create('The WebBrowser property is not a TChromium.');
Finish := False;
TChromium(FWebBrowser).Browser.MainFrame.VisitDomProc(
procedure (const doc: ICefDomDocument) // <- this procedure is not called if this method is called from OnLoadEnd event
begin
FForms.CommaText := GetFormsName(doc.Body);
Finish := True;
end
);
EndTime := IncSecond(Time, 4);
repeat Application.ProcessMessages until Finish or (Time > EndTime);
if Time > EndTime then
raise Exception.Create('Time out');
end;
Run Code Online (Sandbox Code Playgroud)
任何的想法?提前致谢
我已经使用了 DCEF 1 和 DCEF 3,如果你可以切换到 3,你应该这样做,有很多改进。
以下是 DCEF 3 的链接: https: //code.google.com/p/dcef3/
你所拥有的方法肯定有效:
procedure TMainForm.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer);
begin
if IsMain(browser, frame) then begin
// main window done from here on in
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果没有,则可能是以下两件事之一,
您的表单数据弄乱了,不知何故事件不再附加,请仔细检查组件中的事件属性。
您的构建有问题,尝试在示例目录中运行 GUIClient,它具有相同的事件并且应该被触发,如果它不尝试找到另一个构建(最好是我之前链接到的 DCEF3 版本)
祝你好运
| 归档时间: |
|
| 查看次数: |
3750 次 |
| 最近记录: |