全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5784
推到 Plurk!
推到 Facebook!

在 TCppWebBrowser 中,如何存取 HTML 的內容

缺席
skcc
中階會員


發表:36
回覆:96
積分:88
註冊:2002-08-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-14 11:05:21 IP:203.198.xxx.xxx 未訂閱
我希望可以利用 BCB 在 TCppWebBrowser 中動態地變更其 HTML 的內容,例如動態地加入文字、tag …等,然後 TCppWebBrowser 動態地更新。我現在的作法是利用 Stream 形式,把內容變更後,重新把全部內容再存入 TCppWebBrowser 中顯示出來,但這作法太慢了。畫面有很明顯的閃爍,最糟的是,當使用者在 HTML 表單中的 Textbox 輸入文字時,若此時畫面更新,使用者所輸入的資料便清空了。所以我希望能直接變更 TCppWebBrowser 其中的部份內容。不知大家有沒有好的建議,可供參考呢?謝謝各位。 Anthony Lee
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-16 08:30:27 IP:203.73.xxx.xxx 未訂閱
引言: 我希望可以利用 BCB 在 TCppWebBrowser 中動態地變更其 HTML 的內容,例如動態地加入文字、tag …等,然後 TCppWebBrowser 動態地更新。我現在的作法是利用 Stream 形式,把內容變更後,重新把全部內容再存入 TCppWebBrowser 中顯示出來,但這作法太慢了。畫面有很明顯的閃爍,最糟的是,當使用者在 HTML 表單中的 Textbox 輸入文字時,若此時畫面更新,使用者所輸入的資料便清空了。所以我希望能直接變更 TCppWebBrowser 其中的部份內容。不知大家有沒有好的建議,可供參考呢?謝謝各位。
skcc 你好: 方便把你的做法貼上來嗎?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
skcc
中階會員


發表:36
回覆:96
積分:88
註冊:2002-08-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-16 10:30:48 IP:203.198.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-22 22:32:13 IP:61.221.xxx.xxx 未訂閱
引言: 若果把 Stream 的 HTML 內容更新,然後再以上述方法,重新存到 Browser 中。但這作法太慢了。畫面有很明顯的閃爍,最糟的是,當使用者在 HTML 表單中的 Textbox 輸入文字時,若此時畫面更新,使用者所輸入的資料便清空了。其實我的最終目的是想在 BCB 中作 HTML Dialog,不知 RaynorPao 兄或其他大大有什麼好建議。
skcc 你好: 請問一下~~你的程式碼中是不是少了什麼呢?? 例如: > --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
skcc
中階會員


發表:36
回覆:96
積分:88
註冊:2002-08-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-23 09:44:20 IP:203.198.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-23 13:35:51 IP:203.73.xxx.xxx 未訂閱
引言: 由於這些 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-23 13:55:54 IP:203.198.xxx.xxx 未訂閱
引言:
引言: 由於這些 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-12-23 14:24:41 IP:203.73.xxx.xxx 未訂閱
引言: 是缺了個 else,加上去行一定可以了!我重新測試過的。
skcc 你好: 真是不好意思~~本來想幫忙你的 卻反而要你幫忙看問題~~希望你不要笑我 我試了一下你的 > --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
skcc
中階會員


發表:36
回覆:96
積分:88
註冊:2002-08-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-12-23 15:07:00 IP:203.198.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-12-26 18:13:05 IP:203.99.xxx.xxx 未訂閱
解決了!我終於可在 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-12-26 18:17:21 IP:61.221.xxx.xxx 未訂閱
引言: 解決了!我終於可在 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
哇< >~~好厲害耶< > 謝謝 skcc 的熱心分享 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
skcc
中階會員


發表:36
回覆:96
積分:88
註冊:2002-08-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-12-26 19:13:07 IP:203.99.xxx.xxx 未訂閱
引言:
引言: 解決了!我終於可在 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
哇< >~~好厲害耶< > 謝謝 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:
    Variant Doc = CppWebBrowser1->Document;
    Doc.OlePropertyGet("body").OleFunction(
                 "insertAdjacentHTML",
                 "AfterBegin",
                 "大家好!");
上述的 Code 會使 HTML 的內容加入 "大家好!" 字串在開端。 還有很多 Method 和 Property 的實用方法,我也試了出來。有興趣的朋友,可以大家討論討論。 Anthony Lee
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-12-26 19:19:16 IP:61.221.xxx.xxx 未訂閱
引言: 為了解決這個問題,我曾經在 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:
    Variant Doc = CppWebBrowser1->Document;
    Doc.OlePropertyGet("body").OleFunction(
                 "insertAdjacentHTML",
                 "AfterBegin",
                 "大家好!");
上述的 Code 會使 HTML 的內容加入 "大家好!" 字串在開端。 還有很多 Method 和 Property 的實用方法,我也試了出來。有興趣的朋友,可以大家討論討論。 Anthony Lee
skcc 你好: 果然是一個很好、很實用的 Interface 值得好好的研究、研究 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
Blueberrug
一般會員


發表:14
回覆:50
積分:17
註冊:2005-05-22

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-03-28 20:22:03 IP:59.120.xxx.xxx 訂閱
 

您好:
我照著你的方式
試著用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
系統時間:2017-12-16 20:57:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!