Delphi WebBrowser 基本操作与常见问题的解决方案

ops/2024/12/27 18:22:55/

前言

WebBrowser 作为Delphi 常见的网络浏览控件,我这里整理了一些它的基本操作,遇到了一些问题,我梳理了一下并给出解决方案

基本操作

WebBrowser1.GoHome; //到浏览器默认主页
WebBrowser1.Refresh; //刷新
WebBrowser1.GoBack; //后退
WebBrowser1.GoForward; //前进
WebBrowser1.Navigate(‘…’); //打开指定页面
WebBrowser1.Navigate(‘about:blank’); //打开空页面

WebBrowser1.Navigate(‘about:标题>页面内容’);//打开空页面, 并写入…

常见问题与解决方案

读取网页脚本中的变量

假如网页中有这样的语句:

procedure TForm1.Button1Click(Sender: TObject);?
var?
s: string;?
i: Integer;?
begin?
s := WebBrowser1.OleObject.document.Script.str;?
i := WebBrowser1.OleObject.document.Script.num;?
ShowMessage(s); //Hello?
ShowMessage(IntToStr(i)); //99?//也可以这样读:?
s := WebBrowser1.OleObject.document.parentWindow.str;?
i := WebBrowser1.OleObject.document.parentWindow.num;?
ShowMessage(s); //Hello?
ShowMessage(IntToStr(i)); //99?
end;?

调用网页脚本中的函数

假如有这样的脚本:

procedure TForm1.Button1Click(Sender: TObject);?
begin?
WebBrowser1.OleObject.document.parentWindow.MB(); //HTML-Js?//如需指定脚本语言, 需要:?
WebBrowser1.OleObject.document.parentWindow.execScript('MB()','JavaScript'); //HTML-Js?
end;?

判断网页及内部框架网页是否全部下载完毕

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;?
const pDisp: IDispatch; var URL: OleVariant);?
begin?
if WebBrowser1.Application = pDisp then?
begin?
Text := '网页下载完毕!';?
end;?
end;?

改变背景色或背景图片

WebBrowser1.OleObject.document.body.bgcolor := ‘#FF0000’;
WebBrowser1.OleObject.document.body.background := ‘…图片地址’;

操作有 ID 标签的对象

假如网页中有这样的内容:
这是 span1 标签中的内容

var
s: string;
begin
s := WebBrowser1.OleObject.document.getElementByID(‘span1’).innerText;
ShowMessage(s); //这是 span1 标签中的内容

//或者:
s := WebBrowser1.OleObject.document.parentWindow.span1.innerText;
ShowMessage(s); //这是 span1 标签中的内容

//隐藏它:
WebBrowser1.OleObject.document.parentWindow.span1.style.display := ‘none’;
end;

获取网页源代码

var
s: string;
begin
s := WebBrowser1.OleObject.document.body.innerHTML; //body内的所有代码
s := WebBrowser1.OleObject.document.body.outerHTML; //body内的所有代码, 包含body标签
s := WebBrowser1.OleObject.document.documentElement.innerHTML; //html内的所有代码
end;

WebBrowser 中的右键菜单

//先要添加ApplicationEvents1,指定其Message事件

//屏蔽右键菜单
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
with Msg do
begin
if not IsChild(WebBrowser1.Handle, hWnd) then Exit;
Handled := (message = WM_RBUTTONDOWN) or (message = WM_RBUTTONUP) or (message = WM_CONTEXTMENU);
end;
end;

//替换右键菜单
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var mPoint: TPoint;
begin
if IsChild(WebBrowser1.Handle, Msg.Hwnd) and
((Msg.Message = WM_RBUTTONDOWN) or (Msg.Message = WM_RBUTTONUP)) then
begin
GetCursorPos(mPoint); //得到光标位置
PopupMenu1.Popup(mPoint.X, mPoint.Y); //弹出popupmenu1的菜单
Handled:=True;
end;
end;

新页面写入

begin
WebBrowser1.Navigate(‘about:blank’);
WebBrowser1.OleObject.Document.Writeln(‘ok’);
end;

获取页面全部链接

var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var 
i: Integer;
beginwebbrowser1.Navigate(edit1.Text);end;procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
i:integer;
begin
for i := 0 to Webbrowser1.OleObject.Document.links.Length - 1 do
Listbox1.Items.Add(Webbrowser1.OleObject.Document.Links.Item(i));
end;end.

获取网页的验证码

方式1:

procedure TForm1.Button1Click(Sender: TObject);
var
ms:TMemoryStream;
jpg:TJpegImage;
vp:string;
begin
ms:=TMemoryStream.Create;
jpg:=TJpegimage.Create;
vp:='http://ptlogin2.qq.com/getimage?aid=22';
//vp:='http://www.0zer.cn/function/c_validcode.asp?name=loginvalid';
IdHTTP1.Get(vp,ms);
ms.Position:=0;
jpg.LoadFromStream(ms);
image1.Picture.Assign(jpg);ms.Free;
jpg.free;END;

方式2:

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, StdCtrls, jpeg, GIFImage, WinInet; type TForm1 = class(TForm) IdHTTP1: TIdHTTP; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); 
const // url = 'http://ptlogin2.qq.com/getimage?aid=15000701&0.9129723031485226'; url='http://www.0zer.cn/function/c_validcode.asp?name=loginvalid'; 
var ms: TMemoryStream; //jpg: TJPEGImage; te: TGIFImage; 
begin ms := TMemoryStream.Create; //jpg := TJPEGImage.Create; te:=TGIFImage.Create; if InternetGetConnectedState(nil,0) then    //检测计算机是否联网需要引用WinInet begin IdHTTP1.Get(url, ms); ms.Position := 0; //jpg.LoadFromStream(ms); te.LoadFromStream(ms); Canvas.Draw(10, 10, te); end else begin ShowMessage('错误'); //jpg.Free; te.Free; ms.Free; end; 
end; 
end.

http://www.ppmy.cn/ops/145447.html

相关文章

OCR(二) TesseractOCR 语言包训练

目录 1. 语言包简介 2. 环境部署 2.1 安装tessract 2.2 安装java JDK 2.3 下载jTessBoxEditor 3. 训练(LSTM模式-推荐) 3.1 示例 3.2 制作tiff图片 3.3 生成box文件 3.4 调整训练文件 3.5 生成 lstmf 文件 3.6 提取LSTM文件 3.7 创建txt文件 3.8 合并 3.9 验证…

LabVIEW应用在工业车间

LabVIEW作为一种图形化编程语言,以其强大的数据采集和硬件集成功能广泛应用于工业自动化领域。在工业车间中,LabVIEW不仅能够实现快速开发,还能通过灵活的硬件接口和直观的用户界面提升生产效率和设备管理水平。尽管其高成本和初期学习门槛可…

解决 Docker 中 DataLoader 多进程错误:共享内存不足

一、问题描述: 在容器化环境(如 Docker)中使用深度学习框架进行训练时,通常会使用 PyTorch 的 DataLoader 来加载数据。在使用 DataLoader 的多进程数据加载时,当 num_workers > 0,即启用多个工作进程并…

Python与PostgreSQL的深度整合:CRUD操作全指南

Python与PostgreSQL的深度整合:CRUD操作全指南 1. 环境准备 1.1 安装必要的包 pip install sqlalchemy psycopg2-binary sqlmodel1.2 数据库连接 from sqlalchemy import create_engine from sqlmodel import Session, SQLModel# 连接字符串格式 DATABASE_URL …

解决:excel鼠标滚动幅度太大如何调节?

在excel里为什么滚动一次跳过很多行呢?很不方便。。。 1. 问题: 一开始单元格从第1行开始: 鼠标轻轻滚动一下后,直接跳到第4行: 鼠标在word和浏览器里都是好好的。在excel里为什么不是滚动一次跳过一行呢&#xff…

828考研资料汇总

英语 1.历年真题 1.1资源一 考研英语真题(2000-2024年) | 英语真题在线 1.2资源二 https://github.com/m2kar/KaoYan-English 2.真题讲解 安利一位b站up——晓航老师,下面是他的视频合集 晓航老师考研英语视频合集 - 哔哩哔哩 高数 1.真题讲解 李艳芳真题…

安装k8s涉及命令(方便放到txt离线使用)

查看操作系统信息 uname -a # 查看所有操作系统信息 uname -s # 查看内核名称 uname -r # 查看内核版本号 uname -m # 查看机器硬件名称 cat /etc/os-release # 查看所有操作系统信息 配置hosts cat >> /etc/hosts << EOF 172.171.16.147 crawler-k8s-mast…

RK356x bsp 7 - PCF8563 RTC调试记录

文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件&#xff1a;原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…