在 TCppWebBrowser 中,如何存取 HTML 的內容 |
缺席
|
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
我希望可以利用 BCB 在 TCppWebBrowser 中動態地變更其 HTML 的內容,例如動態地加入文字、tag …等,然後 TCppWebBrowser 動態地更新。我現在的作法是利用 Stream 形式,把內容變更後,重新把全部內容再存入 TCppWebBrowser 中顯示出來,但這作法太慢了。畫面有很明顯的閃爍,最糟的是,當使用者在 HTML 表單中的 Textbox 輸入文字時,若此時畫面更新,使用者所輸入的資料便清空了。所以我希望能直接變更 TCppWebBrowser 其中的部份內容。不知大家有沒有好的建議,可供參考呢?謝謝各位。 Anthony Lee
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 我希望可以利用 BCB 在 TCppWebBrowser 中動態地變更其 HTML 的內容,例如動態地加入文字、tag …等,然後 TCppWebBrowser 動態地更新。我現在的作法是利用 Stream 形式,把內容變更後,重新把全部內容再存入 TCppWebBrowser 中顯示出來,但這作法太慢了。畫面有很明顯的閃爍,最糟的是,當使用者在 HTML 表單中的 Textbox 輸入文字時,若此時畫面更新,使用者所輸入的資料便清空了。所以我希望能直接變更 TCppWebBrowser 其中的部份內容。不知大家有沒有好的建議,可供參考呢?謝謝各位。skcc 你好: 方便把你的做法貼上來嗎?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
引言: skcc 你好: 方便把你的做法貼上來嗎?? -- >>< face="Verdana, Arial, Helvetica"> 沒問題,以下為小弟將 HTML 以 stream 方式存入 Browser 的方法TMemoryStream *stm = new TMemoryStream(); Memo1->Lines->SaveToStream( HTMLstm ); //假設 Memo1 的內容為HTML IPersistStreamInit *psi = NULL; stm->Seek( 0, 0 ); if ( sa == NULL ) { delete stm; return; } _di_IDispatch doc = browser->Document; if ( doc == NULL ) { TVariant url = "about:blank"; browser->Navigate2( &url ); while ( doc == NULL ) { Application->ProcessMessages(); doc = browser->Document; } } if ( doc->QueryInterface( IID_IPersistStreamInit, (void**)&psi ) == S_OK ) { if ( psi ) { psi->Load( *sa ); } } delete sa; delete stm;若果把 Stream 的 HTML 內容更新,然後再以上述方法,重新存到 Browser 中。但這作法太慢了。畫面有很明顯的閃爍,最糟的是,當使用者在 HTML 表單中的 Textbox 輸入文字時,若此時畫面更新,使用者所輸入的資料便清空了。其實我的最終目的是想在 BCB 中作 HTML Dialog,不知 RaynorPao 兄或其他大大有什麼好建議。 Anthony Lee |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 若果把 Stream 的 HTML 內容更新,然後再以上述方法,重新存到 Browser 中。但這作法太慢了。畫面有很明顯的閃爍,最糟的是,當使用者在 HTML 表單中的 Textbox 輸入文字時,若此時畫面更新,使用者所輸入的資料便清空了。其實我的最終目的是想在 BCB 中作 HTML Dialog,不知 RaynorPao 兄或其他大大有什麼好建議。skcc 你好: 請問一下~~你的程式碼中是不是少了什麼呢?? 例如: > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
引言: skcc 你好: 請問一下~~你的程式碼中是不是少了什麼呢?? 例如: > -- >>< face="Verdana, Arial, Helvetica"> RaynorPao 大大,對不起,由於這些 Code 我是撮錄出來,所以導致不清不楚,我重新把 code 再登一次好了。TMemoryStream *stm = new TMemoryStream(); TStreamAdapter *sa = new TStreamAdapter( stm, soReference ); Memo1->Lines->SaveToStream( stm ); //假設 Memo1 的內容為HTML IPersistStreamInit *psi = NULL; stm->Seek( 0, 0 ); if ( sa == NULL ) { delete stm; return; } _di_IDispatch doc = browser->Document; //browser 為 TCppWebBrowser 元件 if ( doc == NULL ) { TVariant url = "about:blank"; browser->Navigate2( &url ); while ( doc == NULL ) { Application->ProcessMessages(); doc = browser->Document; } } if ( doc->QueryInterface(IID_IPersistStreamInit, (void**)&psi ) == S_OK ) { if ( psi ) { psi->Load( *sa ); } } delete sa; delete stm;再次謝謝 RaynorPao 的幫忙。 Anthony Lee 發表人 - skcc 於 2002/12/23 12:15:04 |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 由於這些 Code 我是撮錄出來,所以導致不清不楚,我重新把 code 再登一次好了。skcc 你好: 不知道是不是我誤解了你的意思?? 我把你的 > < class="code"> void __fastcall TForm1::Button1Click(TObject *Sender) { Memo1->Clear(); Memo1->Lines->LoadFromFile("WBHtml.htm"); TMemoryStream *stm = new TMemoryStream(); TStreamAdapter *sa = new TStreamAdapter( stm, soReference ); Memo1->Lines->SaveToStream( stm ); //假設 Memo1 的內容為HTML IPersistStreamInit *psi = NULL; stm->Seek( 0, 0 ); if ( sa == NULL ) { delete stm; return; } _di_IDispatch doc = CppWebBrowser1->Document; //browser 為 TCppWebBrowser 元件 if ( doc == NULL ) { TVariant url = "about:blank"; CppWebBrowser1->Navigate2( &url ); while ( doc == NULL ) { Application->ProcessMessages(); doc = CppWebBrowser1->Document; } } if ( doc->QueryInterface(IID_IPersistStreamInit, (void**)&psi ) == S_OK ) { if ( psi ) { psi->Load( *sa ); } } delete sa; delete stm; } -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
引言:引言: 由於這些 Code 我是撮錄出來,所以導致不清不楚,我重新把 code 再登一次好了。skcc 你好: 不知道是不是我誤解了你的意思?? 我把你的 > >>< face="Verdana, Arial, Helvetica"> 是缺了個 else,加上去行一定可以了!我重新測試過的。if ( doc->QueryInterface(IID_IPersistStreamInit, (void**)&psi ) == S_OK ) { if ( psi ) { psi->Load( *sa ); } } else delete sa;Anthony Lee |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
|
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
引言: skcc 你好: 真是不好意思~~本來想幫忙你的 卻反而要你幫忙看問題~~希望你不要笑我 我試了一下你的 > >>< face="Verdana, Arial, Helvetica"> 我想你可能誤會我的意思了,我的問題可分為以下兩個情況: 1. 假若這個browser control 的畫面內容是由自己的 App 自動更新資料,由於這個作法是相等於把一個 HTML 文件重新載入該 browser 中,所以會出現明顯的閃動。不信?試試快速不停地按 F5鍵不停refresh 吧。所以我想是否可以利用 javascript 來幫忙解決資料更新的問題。以我所知,祇要在該 HTML 中置入 <div>..</div>便可利用 javascript 把這 tag 的內容改變,但我卻想不到如何才可把資料從我的 App 傳給該 browser control 中的某個 javascript 的 function 並呼叫它。 2. 假若當目前 browser control 畫面為一個所供使用者輸入的 form 時,當畫面某項目需要由我的 App 更新資料時,若使用者正在輸入中的話,使用者在該 form 中所輸入的內容則清空。 找了許多網站仍找不到相關資料,目前我正在試試另一個方法,就是不用 browser control 而改用 Flash 的 ActiveX control 來作。有關flash 的資料輸入和輸出的問題也解決了,但我還是希望用 HTML 來作,因為我不太熟識 Actionscript 和不想花太多時間來畫畫,所以最好的解決方法仍是 browser control HTML 來達成。無論如何,先多謝 RaynorPao 兄的熱心幫助。 Anthony Lee |
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
解決了!我終於可在 TCppWebBrowser 中直接存取它的 tag,其作法十分簡單,對一些欲作 DHTML Dialog 的朋友十分有用,我現在就把方法公開。
首先假設你的 HTML 中含有以下 statement:
.. .. <body> <P ID="para1"> This is the first paragraph on a simple page. </P> <P ID="para2"> This is the second paragraph on a simple page. </P> .. ..假設上述的 HTML 已經載入了 TCppWebBrowser 中。現在假設我們要將 ID 為 para2 的 tag 之內容變更: void __fastcall TForm1::Button1Click(TObject *Sender) { Variant Doc = CppWebBrowser1->Document; Variant Tag_all = Doc.OlePropertyGet("all"); Variant Tag_para2 = Tag_all.OleFunction("item","para2"); Tag_para2.OlePropertySet("innerText","Hello"); }當使用者在你的程式中按下 Button1,在 TCppWebBrowser 元件中的 para2 的 tag 之內容馬上變為 Hello 字串。 Anthony Lee |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 解決了!我終於可在 TCppWebBrowser 中直接存取它的 tag,其作法十分簡單,對一些欲作 DHTML Dialog 的朋友十分有用,我現在就把方法公開。 首先假設你的 HTML 中含有以下 statement:哇< >~~好厲害耶< > 謝謝 skcc 的熱心分享 --.. .. <body> <P ID="para1"> This is the first paragraph on a simple page. </P> <P ID="para2"> This is the second paragraph on a simple page. </P> .. ..假設上述的 HTML 已經載入了 TCppWebBrowser 中。現在假設我們要將 ID 為 para2 的 tag 之內容變更:void __fastcall TForm1::Button1Click(TObject *Sender) { Variant Doc = CppWebBrowser1->Document; Variant Tag_all = Doc.OlePropertyGet("all"); Variant Tag_para2 = Tag_all.OleFunction("item","para2"); Tag_para2.OlePropertySet("innerText","Hello"); }當使用者在你的程式中按下 Button1,在 TCppWebBrowser 元件中的 para2 的 tag 之內容馬上變為 Hello 字串。 Anthony Lee
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
引言:引言: 解決了!我終於可在 TCppWebBrowser 中直接存取它的 tag,其作法十分簡單,對一些欲作 DHTML Dialog 的朋友十分有用,我現在就把方法公開。 首先假設你的 HTML 中含有以下 statement:哇< >~~好厲害耶< > 謝謝 skcc 的熱心分享 -- >>< face="Verdana, Arial, Helvetica"> 為了解決這個問題,我曾經在 MSDN 中找到 WebBrowser Control 中的 HTML 之 DOM,而其中的 "IHTMLElement Interface" 一章中,更有介紹 IHTMLElement 的 Method 和 Property,其網止如下: http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/ihtmlelement/insertadjacenthtml.asp 內裡還有很多實用的 Method ,例如:"insertAdjacentHTML",以下為小弟的小小 demo:.. .. <body> <P ID="para1"> This is the first paragraph on a simple page. </P> <P ID="para2"> This is the second paragraph on a simple page. </P> .. ..假設上述的 HTML 已經載入了 TCppWebBrowser 中。現在假設我們要將 ID 為 para2 的 tag 之內容變更:void __fastcall TForm1::Button1Click(TObject *Sender) { Variant Doc = CppWebBrowser1->Document; Variant Tag_all = Doc.OlePropertyGet("all"); Variant Tag_para2 = Tag_all.OleFunction("item","para2"); Tag_para2.OlePropertySet("innerText","Hello"); }當使用者在你的程式中按下 Button1,在 TCppWebBrowser 元件中的 para2 的 tag 之內容馬上變為 Hello 字串。 Anthony LeeVariant Doc = CppWebBrowser1->Document; Doc.OlePropertyGet("body").OleFunction( "insertAdjacentHTML", "AfterBegin", "大家好!");上述的 Code 會使 HTML 的內容加入 "大家好!" 字串在開端。 還有很多 Method 和 Property 的實用方法,我也試了出來。有興趣的朋友,可以大家討論討論。 Anthony Lee |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 為了解決這個問題,我曾經在 MSDN 中找到 WebBrowser Control 中的 HTML 之 DOM,而其中的 "IHTMLElement Interface" 一章中,更有介紹 IHTMLElement 的 Method 和 Property,其網止如下: http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/ihtmlelement/insertadjacenthtml.asp 內裡還有很多實用的 Method ,例如:"insertAdjacentHTML",以下為小弟的小小 demo:skcc 你好: 果然是一個很好、很實用的 Interface 值得好好的研究、研究 --Variant Doc = CppWebBrowser1->Document; Doc.OlePropertyGet("body").OleFunction( "insertAdjacentHTML", "AfterBegin", "大家好!");上述的 Code 會使 HTML 的內容加入 "大家好!" 字串在開端。 還有很多 Method 和 Property 的實用方法,我也試了出來。有興趣的朋友,可以大家討論討論。 Anthony Lee
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
Blueberrug
一般會員 發表:14 回覆:50 積分:17 註冊:2005-05-22 發送簡訊給我 |
您好: 我照著你的方式 試著用TMemoryStream讀一個EML檔案, 不知道WebBrowser會將信件的原始碼一起顯示呢? 而不像WebBrowser直接讀EML檔案時, 只會顯示信件內容而已。 是否可以教教小弟呢? 謝謝您們的幫忙啊! ===================引 用 文 章=================== 引言: skcc 你好: 方便把你的做法貼上來嗎?? -- Enjoy Researching & Developing -- 沒問題,以下為小弟將 HTML 以 stream 方式存入 Browser 的方法TMemoryStream *stm = new TMemoryStream(); Memo1->Lines->SaveToStream( HTMLstm ); //假設 Memo1 的內容為HTML IPersistStreamInit *psi = NULL; stm->Seek( 0, 0 ); if ( sa == NULL ) { delete stm; return; } _di_IDispatch doc = browser->Document; if ( doc == NULL ) { TVariant url = "about:blank"; browser->Navigate2( &url ); while ( doc == NULL ) { Application->ProcessMessages(); doc = browser->Document; } } if ( doc->QueryInterface( IID_IPersistStreamInit, (void**)&psi ) == S_OK ) { if ( psi ) { psi->Load( *sa ); } } delete sa; delete stm;若果把 Stream 的 HTML 內容更新,然後再以上述方法,重新存到 Browser 中。但這作法太慢了。畫面有很明顯的閃爍,最糟的是,當使用者在 HTML 表單中的 Textbox 輸入文字時,若此時畫面更新,使用者所輸入的資料便清空了。其實我的最終目的是想在 BCB 中作 HTML Dialog,不知 RaynorPao 兄或其他大大有什麼好建議。 Anthony Lee |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |