Delphi中始终用WebBrowser打开网页

本文介绍如何使用 Delphi 中的 WebBrowser 控件实现在同一窗口内导航不同网页的功能,包括阻止新窗口打开、切换面板及保存加载页面到流的方法。

这个问题也曾经困扰过我一段时间啊!呵呵……
给你一个解决办法,肯定能成功!
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
Cancel:=true;
WebBrowser1.Navigate (NewURL);
end;
其中的NewURL是你在网页中点击的链接,它的值在以下事件中取得:
procedure TForm1.WebBrowser1StatusTextChange(Sender: TObject;
  const Text: WideString);
begin
NewURL :=text;
end;
这样,当你点击网页中的连接时,就在本窗口中打开.NewURL应定义为全局变量.实现不了找我哦! 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/pucoov/archive/2006/02/04/591806.aspx

Delphi中始终用WebBrowser打开网页

Delphi 2010-01-26 13:38:17 阅读172 评论0 字号:

要在同一个WebBrowser里显示,可以这样:
再放一个小的WebBrowser2,设置它在WebBrowser1下面(设置Visible为False好象无效),
// 在WebBrowser1的OnNewWindow2事件中:
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
ppDisp := WebBrowser2.Application; // 新的窗口先指向WebBrowser2
end;
// 在WebBrowser2的OnBeforeNavigate2事件中:
procedure TForm1.WebBrowser2BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
begin
WebBrowser1.Navigate(string(URL)); // 再指回WebBrowser1
Cancel := True;
end;


可以这样,窗体中放置两个PANEL,其中PANEL1中放WebBrowser1,PANEL2中放WebBrowser2,PANEL1和PANEL2、WebBrowser1和WebBrowser2的LEFT,TOP等所有属性设为一样。PANEL2的VISIBLE设为FALSE。然后添加代码如下即可:
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
ppDisp:=WebBrowser2.Application;
panel1.Visible:=false;
panel2.Visible:=true;
end;

procedure TForm1.WebBrowser2NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
ppDisp:=WebBrowser1.Application;
panel2.Visible:=false;
panel1.Visible:=true


我只回答第一个问题,看你给多少分:
1 NewWindow2的在接口中定义的原形:
procedure NewWindow2(Sender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);

2 通过传递一个WebBrowser的控制借口给ppDisp可以让新网页在指定的Wb中浏览
ppDisp:=WebBrowser1.Browser.ControlInterface;

3 在刚才传递的WebBrowser的OnBeforeNavigate2事件中就可以获得将要打开的
URL了!



function SaveToStream(AStream: TStream): HRESULT;
var
IpStream: IPersistStreamInit;
begin
with browser1 do
begin
while ReadyState <> READYSTATE_COMPLETE do
Forms.Application.ProcessMessages;
if Assigned(Document) then
begin
IpStream := Document as IPersistStreamInit;
Result := IpStream.save(TStreamAdapter.Create(AStream), TRUE);
end else Result := S_FALSE;
end;
end;

function Loadfromstream(AStream:TStream):hresult;
begin
with browser1 do
begin
if not Assigned(Document) then
begin
navigate2('about:blank',0,0,0,0);
while readystate <> READYSTATE_COMPLETE do Forms.Application.ProcessMessages;
end;
AStream.seek(0, 0);
Result := (Document as IPersistStreamInit).Load(TStreamadapter.Create(AStream));
end;
end;
<think>好的,我现在需要帮助用户在Delphi 10中使用WebBrowser1组件来替代默认的IE,改用Edge浏览器。首先,我得回忆一下DelphiWebBrowser组件通常是怎么工作的。WebBrowser1默认调用的是系统注册的IE组件,也就是Trident引擎,这在Win10或Win11中可能已经过时了。用户想改用Edge的Chromium引擎,所以需要找到方法让WebBrowser1指向Edge而不是IE。 首先,我需要确认Windows系统是否支持通过某种方式将Edge设置为默认的WebBrowser控件。记得Edge Chromium有一个IE兼容模式,但用户可能不想用这个,而是直接使用Edge的引擎。不过,可能Delphi的TWebBrowser组件本身还是基于IE的,所以可能需要更底层的修改。 接下来,我想到可能需要修改注册表,让系统将WebBrowser控件指向Edge的实例。或者,使用Edge的WebView2控件,这是一个更现代的方法。但WebBrowser1可能不支持WebView2,所以可能需要使用其他组件或者替换WebBrowser1为第三方的控件。 用户可能没有安装WebView2运行时,或者不知道如何集成。所以,如果用户想继续使用WebBrowser1,可能需要通过注册表调整,将Edge设置为默认的浏览器,但这可能影响整个系统,而不仅仅是Delphi应用。或者,寻找一个ActiveX控件封装Edge的功能,替换原来的WebBrowser。 另外,检查Delphi 10是否支持直接使用WebView2。如果有相关的组件或接口,建议用户迁移到WebView2,这样能更好地使用Edge的功能。需要确认WebView2的安装和Delphi的集成步骤,比如是否需要导入库或者使用特定的组件包。 还有,可能需要使用Edge的Chakra JavaScript引擎,但不确定这是否可行。或者,通过调用Edge的进程来显示网页内容,但这可能不如WebBrowser控件方便。 总结一下,可能的解决方案有两种:一种是修改系统注册表,替换WebBrowser控件的默认引擎,但这可能有风险且影响其他应用;另一种是使用WebView2控件,需要用户更新他们的Delphi组件,并可能重写部分代码。应该建议用户采用WebView2的方法,因为它更现代且微软主推,同时提供详细的步骤指导如何安装和集成WebView2到Delphi项目中。 还需要考虑用户是否了解WebView2以及如何获取相关的SDK。可能需要指导用户安装Microsoft Edge WebView2运行时,并在Delphi中配置相应的库。此外,提供示例代码如何初始化和使用WebView2控件替换原有的WebBrowser1。 最后,确保回答结构清晰,分步骤说明,并指出可能的注意事项,比如兼容性、安装要求等。同时生成相关问题,帮助用户进一步解决可能遇到的问题。</think>在Delphi 10中,将`TWebBrowser`组件默认的IE内核切换为Edge浏览器需要借助**WebView2**技术,以下是具体实现步骤: --- ### 第一步:安装WebView2运行时 1. 从Microsoft官网下载并安装[Microsoft Edge WebView2运行时](https://developer.microsoft.com/en-us/microsoft-edge/webview2/)[^1] 2. 确保目标用户设备也安装了此运行时 --- ### 第二步:Delphi中集成WebView2 1. **导入WebView2组件库** - 在Delphi IDE中打开`Component > Import Component` - 选择`Import a Type Library`,找到`Microsoft WebView2 Win32 Type Library (1.0)`[^2] - 生成对应的Delphi封装单元(如`WebView2.pas`) 2. **创建WebView2实例** 在窗体代码中添加以下声明: ```delphi uses WebView2, Winapi.ActiveX; var FWebView: ICoreWebView2; FWebViewEnvironment: ICoreWebView2Environment; ``` --- ### 第三步:替代TWebBrowser的代码实现 ```delphi procedure TForm1.FormCreate(Sender: TObject); begin // 创建WebView2环境 CreateCoreWebView2Environment( nil, // 使用默认安装路径 nil, // 无用户数据文件夹 nil, // 环境参数 ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler( procedure (result: HResult; env: ICoreWebView2Environment) begin FWebViewEnvironment := env; // 创建WebView2控件 FWebViewEnvironment.CreateCoreWebView2Controller(Handle, ICoreWebView2CreateCoreWebView2ControllerCompletedHandler( procedure (result: HResult; controller: ICoreWebView2Controller) var bounds: TRect; begin // 设置控件显示区域 bounds := Rect(0, 0, WebBrowser1.Width, WebBrowser1.Height); controller.SetBounds(bounds); controller.get_CoreWebView2(FWebView); // 加载网页 FWebView.Navigate('https://example.com'); end ) ); end ) ); end; ``` --- ### 关键原理说明 1. **注册表修改方案已失效** Windows已弃用通过`FEATURE_BROWSER_EMULATION`强制IE模拟新版本的方式[^3] 2. **WebView2的优势** - 基于Chromium内核的现代渲染引擎 - 支持TypeScript/JavaScript双向通信 - 官方维护更新 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值