打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
WebBrowser显示字符串内容后如何保存的问题

程序中需要显示一个网页的内容,但这个网页的html文本是在程序中动态从数据库里查询出来的。用WebBrowser显示出来,没有任何问题。但是保存的时候,选择不同的保存类型,有的保存是空的html页面,保存成文本的时候,有时候是乱码。

我用以下三种方法把html代码显示在WebBrowser中,没有一个能完整保存成功的,不知道是显示的问题还是保存的问题。请做过这方面的帮助一下,谢谢!

其中,'c:\s.txt'文件是随便找一个网页,查看源文件,保存成txt文件,此为了演示方便。代码有点多,直接贴到delphi里面就可以运行。

uses
mshtml,ActiveX;

var
s: String;

//方法2调用
function ShowHtmls(mWebBrowser: TWebBrowser; mStrings: TStrings): Boolean; overload;
var
vMemoryStream: TMemoryStream;
begin
Result := False;
if not (Assigned(mStrings) and Assigned(mWebBrowser)) then Exit;
if not Assigned(mWebBrowser.Document) then Exit;
vMemoryStream := TMemoryStream.Create;
try
mStrings.SaveToStream(vMemoryStream);
try
vMemoryStream.Position := 0;
Application.ProcessMessages;
(mWebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(vMemoryStream));
except
Exit;
end;
finally
vMemoryStream.Free;
end;
Result := True;
end;

//方法3调用
procedure ShowHtmls(browser:TwebBrowser;content:widestring); overload;
var
Document: IHTMLDocument2;
V: OleVariant;
begin
try
Document := browser.Document as IHtmlDocument2;
V := VarArrayCreate([0, 0], varVariant);
V[0] := content;
Document.Write(PSafeArray(TVarData(v).VArray));
Document.Close;
except
end;
end;

//先给字符串赋值
procedure TForm1.Button1Click(Sender: TObject);
begin
if FileExists('c:\s.txt') then
begin
Memo1.Lines.LoadFromFile('c:\s.txt');
s:= Memo1.Text;
end;
end;

//显示方法1
procedure TForm1.Load1Click(Sender: TObject);
begin
(WebBrowser.Document as IHtmlDocument2).Body.innerHTML:= s;
end;

//显示方法2
procedure TForm1.Load2Click(Sender: TObject);
var
ts : TStrings;
begin
ts := TStringList.Create;
ts.Add(s);
ShowHtmls(WebBrowser,ts);
ts.Free;
end;

//显示方法3
procedure TForm1.Load13Click(Sender: TObject);
begin
ShowHtmls(WebBrowser,s)
end;

//保存
procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser.ExecWB(OLECMDID_SAVEAS,OLECMDEXECOPT_PROMPTUSER);
end;

//初始化WebBrowser.Document对象。
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser.Navigate('about:blank');
end;


initialization
OleInitialize(nil);

finalization
try
OleUninitialize;
except
end;
问题点数:200、回复次数:27Top

1 楼outer2000(天外流星) 回复于 2004-09-22 16:32:33 得分 70

procedure TForm1.Button1Click(Sender: TObject);
begin
webbrowser1.Navigate('www.csdn.net');

end;

procedure TForm1.Button2Click(Sender: TObject);
var
Document: IHTMLDocument2;
begin
try
Document := Webbrowser1.Document as IHtmlDocument2;
showmessage(Document.body.innerText);
Document.Close;
except
end;

end;
Top

2 楼outer2000(天外流星) 回复于 2004-09-22 16:33:22 得分 0

Document.body.innerHTML; 这个就可以显示HTML代码了Top

3 楼Dlwxn(Dlwxn) 回复于 2004-09-22 16:36:10 得分 0

并不是这样的,是一段html代码的字符串,用Webbrowser显示出来,然后再保存。Top

4 楼Dlwxn(Dlwxn) 回复于 2004-09-22 16:37:13 得分 0

你的方法刚好和我要做的反了过来。Top

5 楼lzy6204(为了忘却的记忆) 回复于 2004-09-22 16:41:43 得分 0

你要保存的是webbrowser显示的内容,还是网页的源代码Top

6 楼outer2000(天外流星) 回复于 2004-09-22 16:44:12 得分 0

procedure TForm1.Button1Click(Sender: TObject);
begin
// webbrowser1.Navigate('www.csdn.net');
webbrowser1.Navigate('about:blank');
end;
procedure TForm1.Button3Click(Sender: TObject);
var
Document: IHTMLDocument2;
begin

try
Document := Webbrowser1.Document as IHtmlDocument2;
Document.body.innerText:='<html>hello</html>';
except
end;

end;Top

7 楼outer2000(天外流星) 回复于 2004-09-22 16:44:55 得分 0

写这个时间里好了
procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
Document: IHTMLDocument2;
begin

try
Document := Webbrowser1.Document as IHtmlDocument2;
Document.body.innerText:='<html>hello</html>';
except
end;

end;Top

8 楼Dlwxn(Dlwxn) 回复于 2004-09-22 16:45:07 得分 0

to lzy6204
和IE浏览器中的"文件" "另存为..."样,注意那个窗口中的“保存类型”,要求每种都能完整的保存。Top

9 楼Dlwxn(Dlwxn) 回复于 2004-09-22 16:54:14 得分 0

to outer2000(天外流星)
对,就是你这样的,然后我想把它保存起来,用
WebBrowser.ExecWB(OLECMDID_SAVEAS,OLECMDEXECOPT_PROMPTUSER);

你把,保存类型都试验一下,保存后要打开你保存的文件看看,结果是什么?Top

10 楼Dlwxn(Dlwxn) 回复于 2004-09-22 16:57:09 得分 0

还有,是Html格式,不是Text的。Top

11 楼outer2000(天外流星) 回复于 2004-09-22 17:03:27 得分 0

这个就可以了啊,不明白,SHOW可以,写成一个文本文件不就可以了吗?
procedure TForm1.Button2Click(Sender: TObject);
var
Document: IHTMLDocument2;
begin
try
Document := Webbrowser1.Document as IHtmlDocument2;
showmessage(Document.body.innerText);
Document.Close;
except
end;

end;
Top

12 楼lzy6204(为了忘却的记忆) 回复于 2004-09-22 17:05:57 得分 0

WebBrowser1.ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT,
EmptyParam,
EmptyParam);
Top

13 楼lzy6204(为了忘却的记忆) 回复于 2004-09-22 17:07:33 得分 0

我试了,可以的呀,没有任何问题Top

14 楼Dlwxn(Dlwxn) 回复于 2004-09-22 19:08:48 得分 0

outer2000(天外流星) 和 lzy6204(为了忘却的记忆)

单独来说你们都是对的,现在我写一个简单的程序:

//WebBrowser里面是显示出红生的字体。
procedure TForm1.Load1Click(Sender: TObject);
var
ss: String;
begin
ss := '<HTML><HEAD><TITLE> New Document </TITLE></HEAD><BODY>'+
'<FONT SIZE="" COLOR="REd">我试了,可以的呀,没有任何问题</FONT>'+
'</BODY></HTML>';
(WebBrowser.Document as IHtmlDocument2).Body.innerHTML:= ss;
end;

//保存,点后,出现保存对话框,这个也是对的。没有任何问题。
procedure TForm1.Button2Click(Sender: TObject);
begin
//WebBrowser.ExecWB(OLECMDID_SAVEAS,OLECMDEXECOPT_PROMPTUSER);
WebBrowser.ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT,
EmptyParam,
EmptyParam);

end;


但是假如我把它保存到桌面上,文件名称是blank.htm,打开这个文件看看里面的内容。

结果是空值。Top

15 楼Dlwxn(Dlwxn) 回复于 2004-09-22 19:19:23 得分 0

上面这个是比较简单的例子,保存后看看结果是什么,不是出现保存对话框就行了。

而且保存的是多种格式的IE的“文件” “另存为...”的“保存类型” 有多种类型:
“网页,全部(*.htm;*html)”、“Web档案,单一文件(*.mht)”、“网页,仅HTML(*.htm;*.html)”
“文本文件(*.txt)”。

我是从数据库里把已有的html文本文件用WebBrowser显示出来,然后保存成上面的几种类型。
Top

16 楼Dlwxn(Dlwxn) 回复于 2004-09-22 19:55:54 得分 0

我把程序上传到 ftp://Jobin:111111@218.75.15.69/steven/WebBrowser.rar 上,看一下保存的结

果,不是出现对话框框就行了。Top

17 楼dlwhxn(流云) 回复于 2004-09-23 08:32:53 得分 0

看了左轻候的大富翁离线浏览器的代码,他的从数据库里把html代码取出在WebBrowser显示后,并保存的功能和我的代码一样,他的就能保存,我的就不可以,奇怪。Top

18 楼dlwhxn(流云) 回复于 2004-09-23 08:58:07 得分 0

原来左轻候大侠也没有完成这个功能,下面是他的离线浏览器Rich Explorer V2.1 简介里内容:

“不再使用临时文件,而是直接将html字符串读入webbrower中;

支持HTML页面的保存和打印(有BUG,尚未修正)。”
Top

19 楼lzy6204(为了忘却的记忆) 回复于 2004-09-23 09:24:56 得分 0

保存为HTML文件好象是有些问题,其他类型的保存都没有问题,我再看看Top

20 楼lzy6204(为了忘却的记忆) 回复于 2004-09-23 09:49:14 得分 120

:( 搞不懂了

当保存的页面不只是文字的时候,保存成任何文件都没有问题

但是如果保存的页面中只有文本内容的时候,保存成全部类型的时候就是空的,其他的没有问题

期待高手来解答

to dlwhxn(流云) 你一定要把所有功能都实现? 如果只是将其内容保存下来,不是已经实现了吗.
我觉得保存成功与否好像跟显示到WEBBROWSER的内容有关Top

21 楼Dlwxn(Dlwxn) 回复于 2004-09-23 10:05:14 得分 0

to lzy6204(为了忘却的记忆) 谢谢!

Top

22 楼WGYKING(修罗是谁?![就缺孩子了……]) 回复于 2004-09-23 17:54:24 得分 5

UPTop

23 楼masterjames(三月街) 回复于 2004-09-23 18:03:50 得分 5

MEMO.LINES.SAVETOFILE 一样呀Top

24 楼Dlwxn(Dlwxn) 回复于 2004-09-23 20:12:33 得分 0

to masterjames(james):

谢谢你的关心,这和memo是没有关系的。Top

25 楼Dlwxn(Dlwxn) 回复于 2004-09-24 10:03:08 得分 0

http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20886098.html#10370729

uses ActiveX;


procedure LoadStream(WebBrowser: TWebBrowser; Stream: TStream);
var
PersistStreamInit: IPersistStreamInit;
StreamAdapter: IStream;
MemoryStream: TMemoryStream;
begin
{Load empty HTML document into Webbrowser to make "Document" a valid HTML document}
WebBrowser.Navigate('about:blank');
{wait until finished loading}
repeat
Application.ProcessMessages;
Sleep(0);
until
WebBrowser.ReadyState = READYSTATE_COMPLETE;
{Get IPersistStreamInit - Interface}
if WebBrowser.Document.QueryInterface(IPersistStreamInit, PersistStreamInit) = S_OK then
begin
{Clear document}
if PersistStreamInit.InitNew = S_OK then
begin
{Make local copy of the contents of Stream if you want to use Stream directly, you have to
consider, that StreamAdapter will destroy it automatically}
MemoryStream:= TMemoryStream.Create;
try
MemoryStream.CopyFrom(Stream, 0);
MemoryStream.Position:= 0;
except
MemoryStream.Free;
raise;
end;
{Use Stream-Adapter to get IStream Interface to our stream}
StreamAdapter:= TStreamAdapter.Create(MemoryStream, soOwned);
{Load data from Stream into WebBrowser}
PersistStreamInit.Load(StreamAdapter);
end;
end;
end;



{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
S: TStringStream;
begin
S:= TStringStream.Create('<html><h1>Stream Test</h1><p>:This HTML content ' +
'is being loaded from a stream.</html>');
try
LoadStream(WebBrowser1, S);
finally
S.Free;
end;

End;Top

26 楼Dlwxn(Dlwxn) 回复于 2004-09-24 13:15:28 得分 0

上面是把html字符串显示在WebBrowser里,下面是保存成Html文件:

function SaveHTMLCode(WebBrowser: TWebBrowser; const FileName: TFileName): Boolean;
var
ps: IPersistStreamInit;
fs: TFileStream;
sa: IStream;
begin
ps := WebBrowser.Document as IPersistStreamInit;
fs := TFileStream.Create(FileName, fmCreate);
try
sa := TStreamAdapter.Create(fs, soReference) as IStream;
Result := Succeeded(ps.Save(sa, True));
finally
fs.Free;
end;
end;

Call with:
SaveHTMLCode(WebBrowser1, 'C:\MyHTMLDoc.html');

//保存成流:
procedure SaveDocumentSourceToStream(Document: IDispatch; Stream: TStream);
var
PersistStreamInit: IPersistStreamInit;
StreamAdapter: IStream;
begin
Stream.Size := 0;
Stream.Position := 0;
if Document.QueryInterface(IPersistStreamInit, PersistStreamInit) = S_OK then
begin
StreamAdapter := TStreamAdapter.Create(Stream, soReference);
PersistStreamInit.Save(StreamAdapter, False);
StreamAdapter := nil;
end;
end;

Top

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[转载]delphi HTML编辑器
Delphi实现HTMLWebBrowser实现HTML界面
如何用Delphi在TWebBrowser中调用JavaScript
Delphi在TWebBrowser中调用JavaScript
delphi WebBrowser 去边框
webbrower在同一个窗口打开新增窗口
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服