WebBrowser 编程,请熟悉此道的朋友帮忙。动态取网页标记。(100分)

  • 主题发起人 yexiaoming
  • 开始时间
Y

yexiaoming

Unregistered / Unconfirmed
GUEST, unregistred user!
程序要求动态加载网页文件然后调用添加数据于输入框中。

示例程序如下,网页文件存于MEMO中,用如下的过程可以显示网页文件.
但取不到我所要的输入框INPUT,但如果把MEMO框的网页文件存为一htm文件,再用
WEBBROWSER.Navigate(磁盘文件url...)加载即可以显示出标记INPUT。
procedure TForm1.loadButtonClick(Sender: TObject);//显示网页文件
var
vv: Variant;
HTMLDocument: IHTMLDocument2;
begin
WebBrowser1.Navigate('about:blank'); //可能问题出在这里
vv := VarArrayCreate([0, 0], varVariant);
vv[0] := memo.Lines.Text;//memo已经存放网页文件内容
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
HTMLDocument.Write(PSafeArray(TVarData(vv).VArray));
HTMLDocument.Close;
end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
i: integer;
doc: OleVariant;
begin
doc := (sender as TWebBrowser).document;
for i := 0 to doc.all.length - 1 do
memo3.Lines.add(doc.all.item(i).tagName);
end;
其中memo3的内容得出的仅有 HTML, HEAD , TITLE, BODY 这些最简单的标记,而没有我所
需要的INPUT等标记,用文件调入就会有INPUT标记。
还有上面的程序在关闭程序好象没有反应。
 
这种加载网页的方式不太好

看看我的代码,和你得差不多,但是却能发现Input标记
var
vDoc: IHTMLDocument2;
vMen: IHTMLElement;
vImg: IHTMLImgElement;
i: Integer;
begin
vDoc := WebBrowser1.Document as IHTMLDocument2;
if Assigned(vDoc) then
begin
Memo1.Lines.Clear;
Memo1.Lines.BeginUpdate;
for i := 0 to vDoc.all.length - 1 do
begin
vMen := vDoc.all.item(i, i) as IHTMLElement;
Memo1.Lines.Add(vMen.tagName+':'+vMen.id);
end;
Memo1.Lines.EndUpdate;
ShowMessage('Process ok');
end;
 
我写了一套组件,
来动态加载网页,是用的是临时命名空间(namespace)的技术
主要是便于进行本地应用的Web开发,在程序内部建立Vitrual WebServer
如果感兴趣,希望能帮我测试一下(还不是正式版)

 
谢谢 LiChaoHui 可以,是否可以发到playicq.com上让更多的人给予测试。
试试如下的HTML标记,刚在FP中建的。
<html>
<head>
<title>New Page 1</title>
</head>
<body>
<form method="POST" action="--WEBBOT-SELF--">
<!--webbot bot="SaveResults" U-File="fpweb:///_private/form_results.txt"
S-Format="TEXT/CSV" S-Label-Fields="TRUE" -->
<p><input type="text" name="T1" size="20"><input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2"></p>
</form>
</body>
</html>
同样也只能发现HTML HEAD TITLE BODY 四个标记,vMen.id均显示为空,但存为文件调用时
却可以,不知我的程序错在哪里。
 
第一次点击按钮是正确的。
 
如下处理一下就可以了。

var
b:Boolean=true;

procedure TForm1.Button1Click(Sender: TObject);
var
vv: Variant;
HTMLDocument: IHTMLDocument2;
begin
if b then
WebBrowser1.Navigate('about:blank'); //确实问题出在这里
//////////////////////////////////////////////////////
b:=false;
vv := VarArrayCreate([0, 0], varVariant);
vv[0] := memo.Lines.Text;//memo已经存放网页文件内容
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
HTMLDocument.Write(PSafeArray(TVarData(vv).VArray));
HTMLDocument.Close;
end;
 
其实这一句可以加到 form 的 oncreate 中:
WebBrowser1.Navigate('about:blank');
 
Mome 中的编辑内容直接在 webbrowser 中显示

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtrls, SHDocVw,mshtml,activex;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Memo: TMemo;
procedure MemoChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.MemoChange(Sender: TObject);
var
vv: Variant;
HTMLDocument: IHTMLDocument2;
begin
vv := VarArrayCreate([0, 0], varVariant);
vv[0] := memo.Lines.Text;
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
HTMLDocument.Write(PSafeArray(TVarData(vv).VArray));
HTMLDocument.Close;
memo.setfocus;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('about:blank');
end;
end.
 
关于加载网页的方式:
procedure LoadDocFromStream(WB: TWebBrowser; Stream: TStream);
begin
CheckDocReady(WB);
(WB.Document as IPersistStreamInit).Load(TStreamAdapter.Create(Stream{, soReference}));
end;

我是用Asynchronous Pluggable Protocols来实现的,
和很多电子书的做法一样,不生成临时文件,就可以显示网页和其中的图片
我的组件不久会推出一个早期测试版,看看这个东西对大家有没有用
 
可能用数组给文档赋值的方法有缺陷,
使用Asynchronous Pluggable Protocols可以
用Navigate方法加载文档
 
多人接受答案了。
 
顶部