关于TEmbeddedWB的问题 自定义的一类中使用了TEmbeddedWB,这个类中定义了OnNavigateError和OnDocumentComplete,但是TEmbeddedWB无法响应这两个事件,不知道为啥,请大家的指点。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 从来没有用过TEmbeddedWB,因为据说要卸载现有的webbrowser我觉得就是D带的webbrowser就可以了,尽量不用第三方的东东 设置EmbeddedWB.OnNavigateError := OnNavigateError;了吗? EmbeddedWB.OnNavigateError := OnNavigateError; EmbeddedWB.OnDocumentComplete := OnDocumentComplete;都已经设了,不知道为什么两个事件就是不执行。 使用TEmbeddedWB,好像不用卸载现有的webbrowser 的呀,再说TEmbeddedWB只是对现有webbrower的扩展,并没有改写。 如果不是TEmbeddedWB有问题,就是你的类代码有问题.一般而言,你的代码有问题的可能性比较大,因为TEmbeddedWB的事件代码在明处,肯定经过了无数次测试. 类定义部分{类定义部分}TServices = class(TObject) private FBrowser: TEmbeddedWB; FDomain: string; FErrorState: Boolean; FProfile: TReadProfile; FState: string; procedure OnDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant); virtual; procedure OnNavigateError(ASender: TObject; const pDisp: IDispatch; var URL, Frame, StatusCode: OleVariant; var Cancel: WordBool); public constructor Create; destructor Destroy; override; procedure Login; virtual; procedure Logout; virtual; procedure Payment; virtual; procedure Query; virtual; end; TChinaMobileService = class(TServices) private procedure OnDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant); override; public constructor Create; procedure Login; override; procedure Logout; override; procedure Payment; override; procedure Query; override; end;{********************************************************** TServices ***********************************************************}constructor TServices.Create;begin FBrowser := TEmbeddedWB.Create(nil); FBrowser.OnNavigateError := OnNavigateError; FBrowser.OnDocumentComplete := OnDocumentComplete; FState := EmptyStr; FErrorState := False;end;destructor TServices.Destroy;begin FreeAndNil(FBrowser); FreeAndNil(FProfile); inherited;end;procedure TServices.Login;begin FState := sState_Login;end;procedure TServices.Logout;begin FState := sState_Logout;end;procedure TServices.OnDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);begin if FErrorState then begin ErrorDlg(sNavigateError); FErrorState := False; Exit; end;end;{***************************************************** TChinaMobileService ******************************************************}constructor TChinaMobileService.Create;begin inherited Create; FProfile := TChinaMobileProfile.Create; FDomain := Format(sDomain, [FProfile.IP, FProfile.Port]); Login;end;procedure TChinaMobileService.Login;begin FBrowser.Navigate(FDomain + FProfile.LoginUrl); inherited Login;end;procedure TChinaMobileService.Logout;begin inherited Logout;end;procedure TChinaMobileService.OnDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);var Doc: IHTMLDocument2; FUserName, FPassword: IHTMLInputElement; FSubmit: OLEVariant;begin inherited OnDocumentComplete(ASender, pDisp, URL); if FState = sState_Login then begin Doc := FBrowser.Doc2; FUserName := Doc.all.item('username', 0) as IHTMLInputElement; FPassword := Doc.all.item('userpwd', 0) as IHTMLInputElement; FSubmit := Doc.all.item('submit_button', 0); FUserName.value := ''; FPassword.value := ''; FSubmit.click; end;end;procedure TChinaMobileService.Payment;begin inherited Payment;end;procedure TChinaMobileService.Query;begin inherited Query;end; TEmbeddedWB的那两个事件响应了吗跟到TEmbeddedWB里,在它里面把所有响应那个事件的地方打上断点,看是不是得到执行了继承自TObject,没有界面,不知道会不会产生问题 OnDocumentComplete这个我也遇见不能响应的情况,后来程序中加了一个皮肤控件,代码没有任何修改,居然就可以响应了。问题是解决了,可是一直很纳闷,不知道为什么! 两个事件都没有响应,我试着新建工程,在Form中的Create事件中像上面的代码一样建立TEmbeddedWB,但两个事件依然没有响应,不知道为啥? 把TEmbeddedWB放到Form中,两个事件放在类里,倒是可以响应两个事件的,唉,不知道为啥。请高手指点,不知道会不会是继承自TObject的原因? 发现一个很奇怪的问题,如果Form中的TEmbeddedWB的visible为false时,就无法响应这两个事件。请高手同志指点一二。 和我类似,不是false的问题,就算true也未必能响应,如果在一个page控件上放TEmbeddedWB,如果这个PAGE不是当前能看见的page也不会响应,而且更神奇的是只要这个page曾经被放到最前面看见过1次,随后就算不可见也OK,一样可以响应了,就是需要激活一下,我想这个可能是控件本身的BUG吧 该控件不可见时可能是不会响应DocumentComplete事件 可视化控件Create时,不给他一个父控件,则不会工作。比如TEmbeddedWB.Create(nil)将不会执行navigate函数,自然不会触发OnDocumentComplete事件。 to:HiLoveS 我也试过TEmbeddedWB.Create(frmMain),frmMain是主窗口,但依然不响应事件。 怎么在设计界面锁定单个控件? 传说中的CSDN原来都是内部人 笔记本电脑快能烤鸡蛋了 普遍情况还是特例 TDBGridEh终于可以用了,现在想点击标题栏排序,可是从网上拷了很多代码,都不能用,谁能帮忙 方法的重写问题 tts 实现将朗读的英文保存为音频文件 谁有好的delphi8的参考资料,能给小弟发一份吗? 如何在串口中获得UPS中的各项参数,破产提问,分很多 TMemo问题 关于COMBOBOX模糊查询的问题 关于DLL中函数的问题 CS模式的Win32数据库应用软件基于Internet运行时套接字的作用
我觉得就是D带的webbrowser就可以了,尽量不用第三方的东东
了吗?
一般而言,你的代码有问题的可能性比较大,因为TEmbeddedWB的事件代码在明处,肯定经过了无数次测试.
TServices = class(TObject)
private
FBrowser: TEmbeddedWB;
FDomain: string;
FErrorState: Boolean;
FProfile: TReadProfile;
FState: string;
procedure OnDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant); virtual;
procedure OnNavigateError(ASender: TObject; const pDisp: IDispatch; var URL, Frame, StatusCode: OleVariant; var Cancel:
WordBool);
public
constructor Create;
destructor Destroy; override;
procedure Login; virtual;
procedure Logout; virtual;
procedure Payment; virtual;
procedure Query; virtual;
end; TChinaMobileService = class(TServices)
private
procedure OnDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant); override;
public
constructor Create;
procedure Login; override;
procedure Logout; override;
procedure Payment; override;
procedure Query; override;
end;
{
********************************************************** TServices ***********************************************************
}
constructor TServices.Create;
begin
FBrowser := TEmbeddedWB.Create(nil);
FBrowser.OnNavigateError := OnNavigateError;
FBrowser.OnDocumentComplete := OnDocumentComplete;
FState := EmptyStr;
FErrorState := False;
end;destructor TServices.Destroy;
begin
FreeAndNil(FBrowser);
FreeAndNil(FProfile);
inherited;
end;procedure TServices.Login;
begin
FState := sState_Login;
end;procedure TServices.Logout;
begin
FState := sState_Logout;
end;procedure TServices.OnDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
if FErrorState then
begin
ErrorDlg(sNavigateError);
FErrorState := False;
Exit;
end;
end;{
***************************************************** TChinaMobileService ******************************************************
}
constructor TChinaMobileService.Create;
begin
inherited Create;
FProfile := TChinaMobileProfile.Create;
FDomain := Format(sDomain, [FProfile.IP, FProfile.Port]);
Login;
end;procedure TChinaMobileService.Login;
begin
FBrowser.Navigate(FDomain + FProfile.LoginUrl);
inherited Login;
end;procedure TChinaMobileService.Logout;
begin
inherited Logout;
end;procedure TChinaMobileService.OnDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
var
Doc: IHTMLDocument2;
FUserName, FPassword: IHTMLInputElement;
FSubmit: OLEVariant;
begin
inherited OnDocumentComplete(ASender, pDisp, URL);
if FState = sState_Login then
begin
Doc := FBrowser.Doc2;
FUserName := Doc.all.item('username', 0) as IHTMLInputElement;
FPassword := Doc.all.item('userpwd', 0) as IHTMLInputElement;
FSubmit := Doc.all.item('submit_button', 0); FUserName.value := '';
FPassword.value := '';
FSubmit.click;
end;
end;procedure TChinaMobileService.Payment;
begin
inherited Payment;
end;procedure TChinaMobileService.Query;
begin
inherited Query;
end;
跟到TEmbeddedWB里,在它里面把所有响应那个事件的地方打上断点,看是不是得到执行了
继承自TObject,没有界面,不知道会不会产生问题
问题是解决了,可是一直很纳闷,不知道为什么!