程序中需要顯示一個網(wǎng)頁的內(nèi)容,但這個網(wǎng)頁的html文本是在程序中動態(tài)從數(shù)據(jù)庫里查詢出來的。用WebBrowser顯示出來,沒有任何問題。但是保存的時候,選擇不同的保存類型,有的保存是空的html頁面,保存成文本的時候,有時候是亂碼。
我用以下三種方法把html代碼顯示在WebBrowser中,沒有一個能完整保存成功的,不知道是顯示的問題還是保存的問題。請做過這方面的幫助一下,謝謝!
其中,'c:\s.txt'文件是隨便找一個網(wǎng)頁,查看源文件,保存成txt文件,此為了演示方便。代碼有點多,直接貼到delphi里面就可以運行。
uses mshtml,ActiveX;
var s: String;
//方法2調(diào)用 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調(diào)用 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; 問題點數(shù):200、回復次數(shù):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顯示的內(nèi)容,還是網(wǎng)頁的源代碼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);
你把,保存類型都試驗一下,保存后要打開你保存的文件看看,結(jié)果是什么?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(為了忘卻的記憶)
單獨來說你們都是對的,現(xiàn)在我寫一個簡單的程序:
//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;
//保存,點后,出現(xiàn)保存對話框,這個也是對的。沒有任何問題。 procedure TForm1.Button2Click(Sender: TObject); begin //WebBrowser.ExecWB(OLECMDID_SAVEAS,OLECMDEXECOPT_PROMPTUSER); WebBrowser.ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
end;
但是假如我把它保存到桌面上,文件名稱是blank.htm,打開這個文件看看里面的內(nèi)容。
結(jié)果是空值。Top
15 樓Dlwxn(Dlwxn) 回復于 2004-09-22 19:19:23 得分 0
上面這個是比較簡單的例子,保存后看看結(jié)果是什么,不是出現(xiàn)保存對話框就行了。
而且保存的是多種格式的IE的“文件” “另存為...”的“保存類型” 有多種類型: “網(wǎng)頁,全部(*.htm;*html)”、“Web檔案,單一文件(*.mht)”、“網(wǎng)頁,僅HTML(*.htm;*.html)” “文本文件(*.txt)”。
我是從數(shù)據(jù)庫里把已有的html文本文件用WebBrowser顯示出來,然后保存成上面的幾種類型。 Top
16 樓Dlwxn(Dlwxn) 回復于 2004-09-22 19:55:54 得分 0
我把程序上傳到 ftp://Jobin:111111@218.75.15.69/steven/WebBrowser.rar 上,看一下保存的結(jié)
果,不是出現(xiàn)對話框框就行了。Top
17 樓dlwhxn(流云) 回復于 2004-09-23 08:32:53 得分 0
看了左輕候的大富翁離線瀏覽器的代碼,他的從數(shù)據(jù)庫里把html代碼取出在WebBrowser顯示后,并保存的功能和我的代碼一樣,他的就能保存,我的就不可以,奇怪。Top
18 樓dlwhxn(流云) 回復于 2004-09-23 08:58:07 得分 0
原來左輕候大俠也沒有完成這個功能,下面是他的離線瀏覽器Rich Explorer V2.1 簡介里內(nèi)容:
“不再使用臨時文件,而是直接將html字符串讀入webbrower中;
支持HTML頁面的保存和打?。ㄓ蠦UG,尚未修正)?!? Top
19 樓lzy6204(為了忘卻的記憶) 回復于 2004-09-23 09:24:56 得分 0
保存為HTML文件好象是有些問題,其他類型的保存都沒有問題,我再看看Top
20 樓lzy6204(為了忘卻的記憶) 回復于 2004-09-23 09:49:14 得分 120
:( 搞不懂了
當保存的頁面不只是文字的時候,保存成任何文件都沒有問題
但是如果保存的頁面中只有文本內(nèi)容的時候,保存成全部類型的時候就是空的,其他的沒有問題
期待高手來解答
to dlwhxn(流云) 你一定要把所有功能都實現(xiàn)? 如果只是將其內(nèi)容保存下來,不是已經(jīng)實現(xiàn)了嗎. 我覺得保存成功與否好像跟顯示到WEBBROWSER的內(nèi)容有關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./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
|