关于TWebBrowser不得不问的问题? ( 积分: 200 )

  • 主题发起人 主题发起人 shang_yan
  • 开始时间 开始时间
S

shang_yan

Unregistered / Unconfirmed
GUEST, unregistred user!
动态创建TWebBrowser控件,该控件不是在窗口对象中动态创建的,
结果发现该控件不响应事件,详见下面的代码及说明,研究了好久,看了好多帖子都解决不了,我错在哪里了?

unit Parser;//非窗口

interface

uses Windows, Classes, ExtCtrls, StdCtrls, Mshtml......
...

type
THttpScan = class(TComponent)
private
wb:TWebBrowser
...

constructor THttpScan.Create(AOwner: TComponent);
begin
wb := TWebBrowser.Create(nil);
wb.OnDocumentComplete := WBDocumentComplete;

...
end;
 
动态创建TWebBrowser控件,该控件不是在窗口对象中动态创建的,
结果发现该控件不响应事件,详见下面的代码及说明,研究了好久,看了好多帖子都解决不了,我错在哪里了?

unit Parser;//非窗口

interface

uses Windows, Classes, ExtCtrls, StdCtrls, Mshtml......
...

type
THttpScan = class(TComponent)
private
wb:TWebBrowser
...

constructor THttpScan.Create(AOwner: TComponent);
begin
wb := TWebBrowser.Create(nil);
wb.OnDocumentComplete := WBDocumentComplete;

...
end;
 
既然这样,父控件就不要用nil了吧,要让它看不见,可以设置它的left,top,width,height,只要能完成功能就行是吗。
 
如果TWebBrowser不可见.似乎就不响应此事件.但是还有其他的一些事件可以响应
不晓得你需要什么功能,或许你可以考虑一下TInternetExplorer.
 
wb := TWebBrowser.Create(AOwner);
wb.parent:=AOwner;
设置left,top,width,height,隐藏它
 
我实际是在做一个能获取网上的链接的控件。
由于我需要解析各种网址,包括javascrip,vbscript动态生成的网址,我不可能自己做一个脚本语言的解析器,因此,只有将html文件装入Twebbrowser来解析。所以,在我的控件代码中需要动态创建TWebBrowser,结果动态创建后,该控件不响应任何事件。

我试过TUI_Less和TIEParser两个控件,这两个控件调用了Mshtml.dll中的有关功能,但这两个控件有个毛病,就是当遇到解析有弹出式窗口的网页时,没有象OnNewWindow2这样的事件来禁止弹出式窗口。

所以,我只好用TWebBrowser,却又发现它动态创建后不能响应事件。
真是逼得我左也不是,右也不是!
 
也可以这样,动态创建一个Form,把webbrowser放在这个form上,然后hide 这个form
 
为什么动态创建其它控件的时候不需要这样就能响应事件?而TWebBrowser必须这样,真是怪!
难道没有其它的办法?
 
可能是因为webbrowser的事件需要有一个窗口handle才行
wb:=TWebBrowser.Create(self);
wb.ParentWindow:=self.Handle;
 
to ymjy:
我也是这样想的。也照你的代码那样做了。而且确实能行。但因为我不是在一个窗体中动态创建TWebBrowser,所以上面的两句代码似乎用不上。
当然,如果先动态创建一个窗体,倒应该是可以的。只是觉得有些别扭!
 
THttpScan就用TForm吧
THttpScan = class(TForm)
其实也没什么,能得到你想的就行了,想想印度程序员,这算不了什么
 
想想印度程序员:

unit Parser;//窗口类

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,Mshtml,OleCtrls, SHDocVw;

type
THttpScan = class(TForm)
private
wb:TWebBrowser;
procedure WBDocumentComplete(Sender:TObject;const pDisp:IDispatch;var URL:OleVariant);
public
constructor Create(AOwner:TComponent);override;
end;

implementation

constructor THttpScan.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
wb:= TWebBrowser.Create(self);
wb.ParentWindow:=self.Handle;
wb.OnDocumentComplete:=WBDocumentComplete;
end;

procedure THttpScan.WBDocumentComplete(Sender:TObject;const pDisp:IDispatch;var URL:OleVariant);
begin

end;

end.
 
如果TWebBrowser没有parent,那么他跟本就没有执行navigate
所以想办法给他设定一个parent,哪怕设定size=0

WebBrowser1:= TWebBrowser.create(self);
panel1.InsertControl(WebBrowser1);//pannel可以替换为你可以传进来的AOwner之内的对象
WebBrowser1.OnDocumentComplete := WBDocumentComplete;
 
to ymyj:
呵呵!真有趣,为什么说印度程序员会那样?
 
再to ymyj:
可以告诉我你那段“印度程序员”的代码是哪里来的吗?这正是我需要的。我很想得到完整的代码。麻烦告诉我到哪里下载,或者发到我的邮箱:shang_yan@163.com
 
哈哈,那段印度程序员代码是我改写你的

想想印度程序员的意思就是不要只图代码精巧,只要能完成你的要求就行
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
556
import
I
后退
顶部