線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1061
推到 Plurk!
推到 Facebook!

TcppWebBrowser開新視窗後刪除的一個怪現象

尚未結案
qubeley2004
一般會員


發表:52
回覆:71
積分:24
註冊:2004-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-22 23:10:59 IP:211.76.xxx.xxx 未訂閱
就是開視窗和刪除視窗都沒有問題(如同kkman) Tpagecontrol那種... 可是..就是不能刪除到剩下一個視窗(no.1,於TpageControl)..否則在新開啟視窗 後(no.2),切換視窗就會出現警告視窗說什麼記憶體存取錯誤這樣 然後在no.1去讀取網頁時候也會出現這樣的警告視窗..不過還是可以讀取 這樣的狀況是為什麼呢??no.1的視窗是一開始就建立的,一樣可以刪除 總之..不管怎麼刪除或是開啟只要TpageControl變成剩下一個視窗就會出錯.. 這是為什麼呢?
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-23 08:41:52 IP:219.132.xxx.xxx 未訂閱
qubeley2004: 我不知道你用如何處理動態新增視窗, 你方便Post你如何處理動態新增視窗的宣告及方式嗎? Andy Chang
------
Andy Chang
CuteBabyBoy
初階會員


發表:18
回覆:97
積分:48
註冊:2003-07-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-23 11:36:13 IP:218.167.xxx.xxx 未訂閱
提供一下小弟的經驗 , 希望能用的上... (也許不是最好的) 以前我也寫過 Browser , 也遇過類似記憶體的問題 最後我解決的方式如下... 1. 當程式 ShowForm 時 , Form 上的 TccWebBrowser (MainBrowser) 產生新視窗 (Browser_1), 新視窗也就是您的首頁 , 而 (MainBrowser) User 永遠看不到. 2. if 程式啟動後.又再產生新視窗,則會產生 (Browser_2) 3. if User 連續砍掉兩個 Browser (即 Browser_1 & Browser_2) ,此時您的程式上 . 視覺上已無任何 Browser ,事實上有個 (MainBrowser) 等待 User 做新增視窗的動作 Baby
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-23 12:59:24 IP:219.132.xxx.xxx 未訂閱
qubeley2004:
  拜讀過你前面發問的文章,我建議你採用下面方式處理!
void __fastcall TForm1::FormCreate(TObject *Sender)
{  
  // 先將所有動態視窗宣告完成
  for (int i=0; i < 10; i  ) { // 10是你宣告的最大開窗數
    pPage[i] = new TTabSheet(PageControl1);
    pPage[i]->PageControl = NULL; // 先不宣告其父階:PageControl1
    CppWeb[i]=new TFrame2(pPage[i]);
    CppWeb[i]->Parent=pPage[i];   // 指定 Parent 才會顯示
    CppWeb[i]->Align=alClient;
  }
  // 導入第一個視窗開啟
  pPage[0]->PageControl = PageControl1;
  pPage[0]->Caption = IntToStr(0);
}
// 開啟一新視窗
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  for (int i=0; i < 10; i  ) { // 10是你宣告的最大開窗數
    // 該視窗無父階就使用它
    if ( pPage[i]->PageControl == NULL) { 
      pPage[i]->PageControl = PageControl1;
      pPage[i]->Caption = IntToStr(i);
      break;  // 跳離迴圈
    }
  }
}
// 刪除動態視窗
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int iCount_Select=PageControl1->ActivePage->PageIndex;
  if ( iCount_Select < 0) // 沒視窗可刪除跳離
    return ;
  // 只要宣告該視窗父階為NULL即可
  pPage[iCount_Select]->PageControl = NULL;
}
請參考!
Andy Chang
------
Andy Chang
qubeley2004
一般會員


發表:52
回覆:71
積分:24
註冊:2004-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-23 15:24:34 IP:211.76.xxx.xxx 未訂閱
我後來用您的方法 可是一樣出現一些問題..就是有的時候在第2頁的視窗去點選連結的時候 會變成1頁的去開啟這樣...就是類似這樣的情況,是不會出現警告視窗... void __fastcall TForm1::PageControl1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { c ; if(c==3){ pPage[PageControl1->ActivePageIndex]->PageControl=NULL; } if(c==3){c=0;} Edit1->Text=PageControl1->ActivePageIndex; }//刪除 void __fastcall TFrame2::CppWebBrowser1NewWindow2(TObject *Sender, LPDISPATCH *ppDisp, VARIANT_BOOL *Cancel) { *Cancel =TOLEBOOL(true);//¤£Åý¥L¶} for (int a=0; a < 100; a ) { // 10¬O§A«Å§iªº³Ì¤j¶}µ¡¼Æ // ¸Óµøµ¡µL¤÷¶¥´N¨Ï¥Î¥¦ if ( pPage[a]->PageControl == NULL) { pPage[a]->PageControl = Form1->PageControl1; CppWeb[a]->CppWebBrowser1->Navigate((WideString)tempurl); pPage[a]->Caption = CppWeb[a]->CppWebBrowser1->LocationName; //pPage[a]->Caption = IntToStr(a); break; // ¸õÂ÷°j°é } } }//新視窗 void __fastcall TForm1::FormCreate(TObject *Sender) { for (int a=0; a < 100; a ) { // 10¬O§A«Å§iªº³Ì¤j¶}µ¡¼Æ pPage[a] = new TTabSheet(PageControl1); pPage[a]->PageControl = NULL; // ¥ý¤£«Å§i¨ä¤÷¶¥:PageControl1 CppWeb[a]=new TFrame2(pPage[a]); CppWeb[a]->Parent=pPage[a]; // «ü©w Parent ¤~·|Å¥Ü CppWeb[a]->Align=alClient; } pPage[0]->PageControl = PageControl1; CppWeb[0]->CppWebBrowser1->GoHome(); }//起始
qubeley2004
一般會員


發表:52
回覆:71
積分:24
註冊:2004-07-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-23 15:28:23 IP:211.76.xxx.xxx 未訂閱
引言: 提供一下小弟的經驗 , 希望能用的上... (也許不是最好的) 以前我也寫過 Browser , 也遇過類似記憶體的問題 最後我解決的方式如下... 1. 當程式 ShowForm 時 , Form 上的 TccWebBrowser (MainBrowser) 產生新視窗 (Browser_1), 新視窗也就是您的首頁 , 而 (MainBrowser) User 永遠看不到. 2. if 程式啟動後.又再產生新視窗,則會產生 (Browser_2) 3. if User 連續砍掉兩個 Browser (即 Browser_1 & Browser_2) ,此時您的程式上 . 視覺上已無任何 Browser ,事實上有個 (MainBrowser) 等待 User 做新增視窗的動作 Baby
嗯..也就是說其實index來說TcppwebBroewer還有多一個最原始的這樣囉 那是index的問題嗎??
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-23 16:28:45 IP:219.132.xxx.xxx 未訂閱
我後來用您的方法 可是一樣出現一些問題..就是有的時候在第2頁的視窗去點選連結的時候 會變成1頁的去開啟這樣...就是類似這樣的情況,是不會出現警告視窗 不懂你的意思,猜測一下刪除第一頁,第二頁開啟新頁卻是已刪除第一頁內容? Andy Chang
------
Andy Chang
qubeley2004
一般會員


發表:52
回覆:71
積分:24
註冊:2004-07-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-23 21:28:00 IP:211.76.xxx.xxx 未訂閱
引言: 我後來用您的方法 可是一樣出現一些問題..就是有的時候在第2頁的視窗去點選連結的時候 會變成1頁的去開啟這樣...就是類似這樣的情況,是不會出現警告視窗 不懂你的意思,猜測一下刪除第一頁,第二頁開啟新頁卻是已刪除第一頁內容? Andy Chang
不是...刪除到後面,會變的有的不能刪除了... 在我c=3的時候因該是可以刪除的 就是開啟一些,刪除一些之後 譬如因該在我的active page是在2,在2的上面點選回首頁 結果變成active page1回首頁去了...
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-24 08:28:00 IP:219.130.xxx.xxx 未訂閱
我沒有你的程式可以偵測! 但我建議你應該用DeBug Mode來追蹤,或用一個Label來顯示 你目前的TabSheet,或你的Frame或你的TPagecontrol或你的 TCppWebBrowser的事件變化。 因為我的測試程式並沒此類問題! Andy Chang
------
Andy Chang
qubeley2004
一般會員


發表:52
回覆:71
積分:24
註冊:2004-07-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-26 15:43:08 IP:211.76.xxx.xxx 未訂閱
引言:
qubeley2004:
  拜讀過你前面發問的文章,我建議你採用下面方式處理!
void __fastcall TForm1::FormCreate(TObject *Sender)
{  
  // 先將所有動態視窗宣告完成
  for (int i=0; i < 10; i  ) { // 10是你宣告的最大開窗數
    pPage[i] = new TTabSheet(PageControl1);
    pPage[i]->PageControl = NULL; // 先不宣告其父階:PageControl1
    CppWeb[i]=new TFrame2(pPage[i]);
    CppWeb[i]->Parent=pPage[i];   // 指定 Parent 才會顯示
    CppWeb[i]->Align=alClient;
  }
  // 導入第一個視窗開啟
  pPage[0]->PageControl = PageControl1;
  pPage[0]->Caption = IntToStr(0);
}
// 開啟一新視窗
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  for (int i=0; i < 10; i  ) { // 10是你宣告的最大開窗數
    // 該視窗無父階就使用它
    if ( pPage[i]->PageControl == NULL) { 
      pPage[i]->PageControl = PageControl1;
      pPage[i]->Caption = IntToStr(i);
      break;  // 跳離迴圈
    }
  }
}
// 刪除動態視窗
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int iCount_Select=PageControl1->ActivePage->PageIndex;
  if ( iCount_Select < 0) // 沒視窗可刪除跳離
    return ;
  // 只要宣告該視窗父階為NULL即可
  pPage[iCount_Select]->PageControl = NULL;
}
請參考!
Andy Chang
嗯...這樣的弄法會出錯吧... 譬如開了五個視窗01234 然後刪除掉了active page的第三個個page[x]內變成0.1.3.4有值 可是Active page卻是0.1.2.3 在刪active page地2個的時候這樣page[x]已經沒有值了..所以變成刪不掉
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-26 16:21:04 IP:61.142.xxx.xxx 未訂閱
qubeley2004: 沒錯其實我並沒有真正刪除它,我只是將其父階變成NULL而已。 因為如此整個陣列還是滿足的請參考! 重點是如此不容易出錯也比較好控制! Andy Chang
------
Andy Chang
qubeley2004
一般會員


發表:52
回覆:71
積分:24
註冊:2004-07-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-26 17:05:15 IP:211.76.xxx.xxx 未訂閱
引言: qubeley2004: 沒錯其實我並沒有真正刪除它,我只是將其父階變成NULL而已。 因為如此整個陣列還是滿足的請參考! 重點是如此不容易出錯也比較好控制! Andy Chang
嗯..我了解你的意思只是變成NULL 可是以我剛剛說的例子來說 變成NULL兩次了... 所以會變成無法null的狀況即便成畫面不會消失 有辦法pPage[]內部沒有null的全部都往前移這樣嗎? EX:pPage中0.1.2.4.5的位置沒有NULL..把他弄城0.1.2.3.4沒有NULL這樣?? 我有弄了一下..可是還是失敗
qubeley2004
一般會員


發表:52
回覆:71
積分:24
註冊:2004-07-13

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-08-26 17:35:21 IP:211.76.xxx.xxx 未訂閱
奇怪的是.. 要是用您的方法 一樣如果只有刪除剩下一個視窗 然後在另開視窗 那心開的視窗會出現 可是卻不會去抓網站的內容
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-08-26 17:53:33 IP:61.142.xxx.xxx 未訂閱
qubeley2004:
刪除的Button試試這樣
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int iCount_Select=PageControl1->ActivePage->PageIndex;
  if ( iCount_Select < 0)
    return ;
  pPage[iCount_Select]->PageControl = NULL;
  for (int i=iCount_Select; i < Max-1; i  ) {
      pPage[i] = pPage[i 1];
      pPage[i]->Caption = IntToStr(i);
      CppWeb[i]=CppWeb[i 1];
      CppWeb[i]->Parent=pPage[i]; // 指定 Parent 才會顯示
  }
  pPage[Max-1]->PageControl = NULL;
}
請參考
Andy Chang
------
Andy Chang
qubeley2004
一般會員


發表:52
回覆:71
積分:24
註冊:2004-07-13

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-08-26 18:11:26 IP:211.76.xxx.xxx 未訂閱
引言:
qubeley2004:
刪除的Button試試這樣
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int iCount_Select=PageControl1->ActivePage->PageIndex;
  if ( iCount_Select < 0)
    return ;
  pPage[iCount_Select]->PageControl = NULL;
  for (int i=iCount_Select; i < Max-1; i  ) {
      pPage[i] = pPage[i 1];
      pPage[i]->Caption = IntToStr(i);
      CppWeb[i]=CppWeb[i 1];
      CppWeb[i]->Parent=pPage[i]; // 指定 Parent 才會顯示
  }
  pPage[Max-1]->PageControl = NULL;
}
請參考
Andy Chang
真謝謝您的幫忙... 怪現象還是有的.. 變成說一開始只有一個視窗no.0,然後新開一個no.1,刪除新開的no.1 再開一個新的視窗no.1,此最後新開的視窗不會去抓取網頁的資料 要是再開一個no.2就可以,然後... 如果在最原始的視窗no.0中按首頁或是打入網址 會變成no.1的網頁去讀取資料, 如果是直接在no.0點選超連結就是no.0本身去抓取網頁內容 在no.1網址列或是點選首頁或是超連結就變成no.2去桌... 所以我想因該是某個地方的參數弄錯了.. 不過起始的網頁no.0都沒有動過..覺得有點奇怪.. 弄了好久弄不出來..昏倒
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-08-26 20:26:39 IP:61.142.xxx.xxx 未訂閱
引言: 真謝謝您的幫忙... 怪現象還是有的.. 變成說一開始只有一個視窗no.0,然後新開一個no.1,刪除新開的no.1 再開一個新的視窗no.1,此最後新開的視窗不會去抓取網頁的資料 要是再開一個no.2就可以,然後... 如果在最原始的視窗no.0中按首頁或是打入網址 會變成no.1的網頁去讀取資料, 如果是直接在no.0點選超連結就是no.0本身去抓取網頁內容 在no.1網址列或是點選首頁或是超連結就變成no.2去桌... 所以我想因該是某個地方的參數弄錯了.. 不過起始的網頁no.0都沒有動過..覺得有點奇怪.. 弄了好久弄不出來..昏倒 < face="Verdana, Arial, Helvetica"> 奇怪我按你的敘述實際操作,我一切正常! 再一次Post我測試程式
.hpp
private:        // User declarations
  TFrame2 *CppWeb[10];
  TTabSheet *pPage[10];
  int Max;
.cpp
#include     void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Max=10;
  for (int i=0; i < Max; i  ) {
    pPage[i] = new TTabSheet(PageControl1);
    pPage[i]->PageControl = NULL; // PageControl1;
    CppWeb[i]=new TFrame2(pPage[i]);
    CppWeb[i]->Parent=pPage[i];         // 指定 Parent 才會顯示
    CppWeb[i]->Align=alClient;      }
  pPage[0]->PageControl = PageControl1;
  pPage[0]->Caption = IntToStr(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  int iCount_Select=PageControl1->ActivePage->PageIndex;
  CppWeb[iCount_Select]->CppWebBrowser->Navigate((WideString)Edit1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  // 清除元件暫存檔
  delete Component_List;
  for (int iCount = 0; iCount < Max; iCount  )  {
    delete CppWeb[iCount];
  }
  delete CppWeb;
  for (int iCount = 0; iCount < Max; iCount  )  {
    delete pPage[iCount];
  }
  delete pPage;    }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  for (int i=0; i < Max; i  ) {
    if ( pPage[i]->PageControl == NULL) { // PageControl1;
      pPage[i]->PageControl = PageControl1;
      pPage[i]->Caption = IntToStr(i);
      break;
    }
  }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormShow(TObject *Sender)
{
  CppWeb[0]->CppWebBrowser->Navigate((WideString)"http://www.seednet.net.tw");
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int iCount_Select=PageControl1->ActivePage->PageIndex;
  if ( iCount_Select < 0)
    return ;
  pPage[iCount_Select]->PageControl = NULL;
  for (int i=iCount_Select; i < Max-1; i  ) {
      pPage[i] = pPage[i 1];
      pPage[i]->Caption = IntToStr(i);
      CppWeb[i]=CppWeb[i 1];
      CppWeb[i]->Parent=pPage[i]; // 指定 Parent 才會顯示
  }
  pPage[Max-1]->PageControl = NULL;
}
//---------------------------------------------------------------------------        
Andy Chang
------
Andy Chang
qubeley2004
一般會員


發表:52
回覆:71
積分:24
註冊:2004-07-13

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-08-26 23:02:48 IP:211.76.xxx.xxx 未訂閱
謝謝幫忙~ 我知道我的問題在哪邊了... 全部都是PageControl1->ActivePageIndex害的... 因為我發現我是在刪除之後直接用 PageControl1->ActivePageIndex帶入那個迴圈 也就是說..PageControl1->ActivePageIndex在刪除之後自己就會先減1 而我沒有先用icount把他刪除前的數字存起來..導致第一頁會出錯的問題.. 被他卡死了好久的時間了.. 可是我還是有幾個問題想要請教一下 1.我沒有把TFrame2 *CppWeb[20]; TTabSheet *pPage[20]; 這個放在.h檔的private裡面 因為我放進去的話會出現說沒有定義CppWeb的錯誤... 2.像如果使用您說的方法的話..不就是一開始就先全部把資源先弄出來. 這樣的開啟網頁來說會不會耗很多資源呢??還是說這樣的方法開啟會比較快? 自己測試一下您的方法好像比較耗記憶體 3. CppWeb[i]->Parent=pPage[i]; 這個我沒有加上去依然可以跑,這行的功用是指定cppweb的parent吧 為什麼沒有加上也可以跑呢??
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-08-27 09:03:55 IP:61.142.xxx.xxx 未訂閱
1.我沒有把TFrame2 *CppWeb[20];
TTabSheet *pPage[20]; 
這個放在.h檔的private裡面
因為我放進去的話會出現說沒有定義CppWeb的錯誤...

我不會,因為#include "CppFrame.h"    2.像如果使用您說的方法的話..不就是一開始就先全部把資源先弄出來.
這樣的開啟網頁來說會不會耗很多資源呢??還是說這樣的方法開啟會比較快?
自己測試一下您的方法好像比較耗記憶體    見仁見智,早在DOS時代是節省記憶體還是提升效率?!各家有不同說法,
DOS早期還只能用640K的RAM,到Windows-95出現的最少也要16MB的RAM,今天
我的電腦也有512MB記憶體。不要擔心資源。    3. CppWeb[i]->Parent=pPage[i];
這個我沒有加上去依然可以跑,這行的功用是指定cppweb的parent吧
為什麼沒有加上也可以跑呢??    我不知道你的Fram及Form處理方式?但基本上我一向習慣做好設定。    
Andy Chang
------
Andy Chang
系統時間:2024-05-14 1:40:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!