TcppWebBrowser開新視窗後刪除的一個怪現象 |
尚未結案
|
qubeley2004
一般會員 發表:52 回覆:71 積分:24 註冊:2004-07-13 發送簡訊給我 |
就是開視窗和刪除視窗都沒有問題(如同kkman) Tpagecontrol那種... 可是..就是不能刪除到剩下一個視窗(no.1,於TpageControl)..否則在新開啟視窗 後(no.2),切換視窗就會出現警告視窗說什麼記憶體存取錯誤這樣 然後在no.1去讀取網頁時候也會出現這樣的警告視窗..不過還是可以讀取 這樣的狀況是為什麼呢??no.1的視窗是一開始就建立的,一樣可以刪除 總之..不管怎麼刪除或是開啟只要TpageControl變成剩下一個視窗就會出錯.. 這是為什麼呢?
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
|
CuteBabyBoy
初階會員 發表:18 回覆:97 積分:48 註冊:2003-07-11 發送簡訊給我 |
提供一下小弟的經驗 , 希望能用的上... (也許不是最好的) 以前我也寫過 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 發送簡訊給我 |
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 發送簡訊給我 |
我後來用您的方法 可是一樣出現一些問題..就是有的時候在第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 發送簡訊給我 |
引言: 提供一下小弟的經驗 , 希望能用的上... (也許不是最好的) 以前我也寫過 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 發送簡訊給我 |
|
qubeley2004
一般會員 發表:52 回覆:71 積分:24 註冊:2004-07-13 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
|
qubeley2004
一般會員 發表:52 回覆:71 積分:24 註冊:2004-07-13 發送簡訊給我 |
引言:嗯...這樣的弄法會出錯吧... 譬如開了五個視窗01234 然後刪除掉了active page的第三個個page[x]內變成0.1.3.4有值 可是Active page卻是0.1.2.3 在刪active page地2個的時候這樣page[x]已經沒有值了..所以變成刪不掉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 |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
|
qubeley2004
一般會員 發表:52 回覆:71 積分:24 註冊:2004-07-13 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
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 發送簡訊給我 |
引言:真謝謝您的幫忙... 怪現象還是有的.. 變成說一開始只有一個視窗no.0,然後新開一個no.1,刪除新開的no.1 再開一個新的視窗no.1,此最後新開的視窗不會去抓取網頁的資料 要是再開一個no.2就可以,然後... 如果在最原始的視窗no.0中按首頁或是打入網址 會變成no.1的網頁去讀取資料, 如果是直接在no.0點選超連結就是no.0本身去抓取網頁內容 在no.1網址列或是點選首頁或是超連結就變成no.2去桌... 所以我想因該是某個地方的參數弄錯了.. 不過起始的網頁no.0都沒有動過..覺得有點奇怪.. 弄了好久弄不出來..昏倒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 |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 真謝謝您的幫忙... 怪現象還是有的.. 變成說一開始只有一個視窗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 #includeAndy Chang
------
Andy Chang |
qubeley2004
一般會員 發表:52 回覆:71 積分:24 註冊:2004-07-13 發送簡訊給我 |
謝謝幫忙~ 我知道我的問題在哪邊了... 全部都是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 發送簡訊給我 |
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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |