程序中需要显示一个网页的内容,但这个网页的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
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
Document.body.innerHTML; 这个就可以显示HTML代码了Top
并不是这样的,是一段html代码的字符串,用Webbrowser显示出来,然后再保存。Top
你的方法刚好和我要做的反了过来。Top
你要保存的是webbrowser显示的内容,还是网页的源代码Top
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
写这个时间里好了
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
to lzy6204
和IE浏览器中的"文件" "另存为..."样,注意那个窗口中的“保存类型”,要求每种都能完整的保存。Top
to outer2000(天外流星)
对,就是你这样的,然后我想把它保存起来,用
WebBrowser.ExecWB(OLECMDID_SAVEAS,OLECMDEXECOPT_PROMPTUSER);
你把,保存类型都试验一下,保存后要打开你保存的文件看看,结果是什么?Top
还有,是Html格式,不是Text的。Top
这个就可以了啊,不明白,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
WebBrowser1.ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT,
EmptyParam,
EmptyParam);
Top
我试了,可以的呀,没有任何问题Top
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
上面这个是比较简单的例子,保存后看看结果是什么,不是出现保存对话框就行了。
而且保存的是多种格式的IE的“文件” “另存为...”的“保存类型” 有多种类型:
“网页,全部(*.htm;*html)”、“Web档案,单一文件(*.mht)”、“网页,仅HTML(*.htm;*.html)”
“文本文件(*.txt)”。
我是从数据库里把已有的html文本文件用WebBrowser显示出来,然后保存成上面的几种类型。
Top
我把程序上传到 ftp://Jobin:111111@218.75.15.69/steven/WebBrowser.rar 上,看一下保存的结
果,不是出现对话框框就行了。Top
看了左轻候的大富翁离线浏览器的代码,他的从数据库里把html代码取出在WebBrowser显示后,并保存的功能和我的代码一样,他的就能保存,我的就不可以,奇怪。Top
原来左轻候大侠也没有完成这个功能,下面是他的离线浏览器Rich Explorer V2.1 简介里内容:
“不再使用临时文件,而是直接将html字符串读入webbrower中;
支持HTML页面的保存和打印(有BUG,尚未修正)。”
Top
保存为HTML文件好象是有些问题,其他类型的保存都没有问题,我再看看Top
:( 搞不懂了
当保存的页面不只是文字的时候,保存成任何文件都没有问题
但是如果保存的页面中只有文本内容的时候,保存成全部类型的时候就是空的,其他的没有问题
期待高手来解答
to dlwhxn(流云) 你一定要把所有功能都实现? 如果只是将其内容保存下来,不是已经实现了吗.
我觉得保存成功与否好像跟显示到WEBBROWSER的内容有关Top
to lzy6204(为了忘却的记忆) 谢谢!
Top
UPTop
MEMO.LINES.SAVETOFILE 一样呀Top
to masterjames(james):
谢谢你的关心,这和memo是没有关系的。Top
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
上面是把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
联系客服