如何產生多分頁視窗? |
尚未結案
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
|
liangnet
中階會員 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: 在bcb裡有提供TabControl元件。 在TabControl的OnChange事件,就是Tab被改變。 可以在此事件裡去處理畫面的切畫、更新。或許是我表達的不好吧。 我問的是,要如何 1. 產生一個新分頁, 2. 然後產生新視窗, 3. 藉著切換分頁的分籤就可以切換視窗。 4. 把視窗關閉時,相對應的分頁也就關閉了。 5. 視窗也可以放大縮小,或是最大化。 就像是目前許多的文字編輯器,或是 Maxthon, MyIE 這類多分頁瀏覽器一樣。 -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
chtai 您好: 給您一個範例參考一下,請依下列順序建立測試環境:
// 建立新頁籤 void __fastcall TForm2::btnNewPageClick(TObject *Sender) { // 新增頁籤 TTabSheet *pPage = new TTabSheet(PageControl1); pPage->PageControl = PageControl1; pPage->Caption = "未命名"; // 新增 Memo 物件 TMemo *pEdit = new TMemo(pPage); // 設定 Memo 的各個相關屬性 pEdit->Parent = pPage; pEdit->Align = alClient; pEdit->WantTabs = true; pEdit->Font->Name = "Arial"; pEdit->Font->Charset = CHINESEBIG5_CHARSET; pEdit->Font->Color = clBlue; pEdit->Font->Size = 12; pEdit->Color = clWhite; // .... 其它屬性的設定 .... // 視需要設定 Memo 相關事件的處理程序 (處理程序請自行建立,此處不再列舉) // pEdit->OnChange = EditChange; // pEdit->OnKeyDown = EditKeyDown; // pEdit->OnKeyUp = EditKeyUp; // pEdit->OnMouseDown = EditMouseDown; // pEdit->OnMouseUp = EditMouseUp; // .... 其它事件的設定 .... PageControl1->ActivePage = pPage; btnDelPage->Enabled = true; } // 刪除作用中的頁籤 void __fastcall TForm2::btnDelPageClick(TObject *Sender) { // 刪除作用中的頁籤與其內的物件 delete PageControl1->Pages[PageControl1->ActivePage->PageIndex]; if(PageControl1->PageCount > 0){ btnDelPage->Enabled = false; } }老話一句,範例程式並未做最佳化處理,請自行加強之。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/07/18 17:44:56 |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
那請問要怎麼產生新的 Form 到分頁呢?
又要如何關閉這個 Form 呢? 在一般情形下我都是這樣產生 new Form
TfmNew *fmNew = new TfmNew(Application); fmNew->ShowModal();關閉則是在 OnClose 事件裡頭寫 Action = caFree;那我現在若是想要按個按鈕,就產生一個新 Form 於一個新的 Tab Sheet 裡頭, 要怎麼辦到呢? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
chtai 您好:
引言:那請問要怎麼產生新的 Form 到分頁呢? 又要如何關閉這個 Form 呢?要產生新的 Form 放到新的頁籤中,可比照我前一個範例的作法即可,例如: .... 前略 .... TTabSheet *pPage = new TTabSheet(PageControl1); pPage->PageControl = PageControl1; pPage->Caption = "未命名"; TForm *pForm = new TForm(pPage); pForm->Parent = pPage; pForm->Align = alClient; pForm->BorderStyle = bsNone; pForm->Show(); .... 後略 ....至於關閉 Form 的問題,我並不去處理這個動作,而是直接 delete 掉頁籤,就像我在前一個範例中的處理方式相同,如果對於這一點有疑惑的話,可以參考一下這一篇討論: 要如何用BCB自動產生BUTTON物件並設定屬性呢? http://delphi.ktop.com.tw/topic.php?topic_id=68309 7 天天敲鍵盤 v 時時按滑鼠 8 |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: 至於關閉 Form 的問題,我並不去處理這個動作,而是直接 delete 掉頁籤,就像我在前一個範例中的處理方式相同RedSnow 兄您好,感謝您的回應, 我的意思是,當我 Form 的右上角[X]被按下, 或是 Form 裡頭有個 Button 按下之後執行 Close(); 這時 Form 被關掉了,要怎麼同時關掉相對應的頁籤呢 ? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁 發表人 - chtai 於 2005/07/19 21:56:14
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
liangnet
中階會員 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
在BCB裡建新一個新的Project
File -> New -> Other....
然後切到Project那一頁,選擇MDI Application
然後放上一個TabControl到MDI上。
再修改以下的函式 void __fastcall TMainForm::FileNew1Execute(TObject *Sender) { TabControl1->Tabs->Add("NONAME" IntToStr(MDIChildCount 1)); CreateMDIChild("NONAME" IntToStr(MDIChildCount 1)); } 在TabControl的OnChange裡加入 void __fastcall TMainForm::TabControl1Change(TObject *Sender) { TControl *Control; for (int i = 0; i < Application->ComponentCount; i ) { if (Application->Components[i]->ClassNameIs("TMDIChild")) { TMDIChild *Child = (TMDIChild *)Application->Components[i]; if (TabControl1->Tabs->Strings[TabControl1->TabIndex] == Child->Caption) { Child->BringToFront(); break; } } } } |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
chtai 您好:
引言:我的意思是,當我 Form 的右上角[X]被按下, 或是 Form 裡頭有個 Button 按下之後執行 Close(); 這時 Form 被關掉了,要怎麼同時關掉相對應的頁籤呢 ?我將 Form 的 BorderStyle 屬性設為 bsNone 就是要避免使用者自行關閉掉頁籤裡的 Form,如果您提供了關閉 Form 的 Button,那麼在 Button 的 OnClick 事件中,直接設定 delete 頁籤的敘述即可,如果您習慣要逐個物件關閉與刪除,那麼就在設定 Form 的 Close 指令敘述之後,再加上 delete 頁籤的敘述也可以。 7 天天敲鍵盤 v 時時按滑鼠 8 |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
請問 RedSnow 大哥,
我現在有 Form1, Form2,
在 Form1 有一個 Button1 跟一個 PageControl1。
我現在要做的是,按下 Button1 之後,PageControl1 會產生一個新頁籤,
然後產生 Form2 在這個新分頁裡頭。
而在 Form2 裡頭只有一個 Button2,按下之後會關閉視窗。
Button1 按下的程式碼如下 :
void __fastcall TForm1::Button1Click(TObject *Sender) { TTabSheet *pPage = new TTabSheet(PageControl1); pPage->PageControl = PageControl1; pPage->Caption = "Untitled"; PageControl1->ActivePageIndex = PageControl1->PageCount-1; TForm2 *Form2 = new TForm2(pPage); Form2->Parent = pPage; Form2->Align = alClient; Form2->BorderStyle = bsNone; Form2->Show(); }Button2 按下的程式碼如下: // Close(); <-- 不管有沒有這一行都會有同樣錯誤 delete Form1->PageControl1->Pages[Form1->PageControl1->ActivePageIndex];按下 Button2 想關閉視窗時會出現 Error Project Project1.exe raised exception class EAbstractError with message 'Abstract Error'. Process stopped. Use Step or Run to continue.請問我是哪裡做錯了呢 ? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
chtai 您好:
引言:我現在有 Form1, Form2, 在 Form1 有一個 Button1 跟一個 PageControl1。 我現在要做的是,按下 Button1 之後,PageControl1 會產生一個新頁籤, 然後產生 Form2 在這個新分頁裡頭。 而在 Form2 裡頭只有一個 Button2,按下之後會關閉視窗。 Button1 按下的程式碼如下 :之所以會出現錯誤訊息,應該是因為您在 Form2 執行 Form1 裡的 delete 頁籤動作,而 Form2 的 Parent 卻是 Form1 的頁籤,當您在刪除頁籤時會刪除頁籤裡的物件,這也包含了 Form2 在內,但是呼叫該動作的程序是在 Form2 本身,程序還未結束就被刪除掉所致。 或許是我的功力不夠或是對這個問題存在著盲點吧?我雖然做了些測試,但是仍無法順利的在 Form2 刪除掉 Form1 的頁籤 (雖然可以 delete 掉但是會產生錯誤訊息),我建議您還是將刪除的動作放在 Form1 裡比較簡單些,要不然您也可以考慮 liangnet 建議的方式,改用 MDI Form 配合 TabControl 來處理,這樣子可以將頁籤與 Form 分別處理,應該不會有上述的那種困擾。 7 天天敲鍵盤 v 時時按滑鼠 8void __fastcall TForm1::Button1Click(TObject *Sender) { TTabSheet *pPage = new TTabSheet(PageControl1); pPage->PageControl = PageControl1; pPage->Caption = "Untitled"; PageControl1->ActivePageIndex = PageControl1->PageCount-1; TForm2 *Form2 = new TForm2(pPage); Form2->Parent = pPage; Form2->Align = alClient; Form2->BorderStyle = bsNone; Form2->Show(); }Button2 按下的程式碼如下:// Close(); <-- 不管有沒有這一行都會有同樣錯誤 delete Form1->PageControl1->Pages[Form1->PageControl1->ActivePageIndex];按下 Button2 想關閉視窗時會出現 ErrorProject Project1.exe raised exception class EAbstractError with message 'Abstract Error'. Process stopped. Use Step or Run to continue.請問我是哪裡做錯了呢 ? |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
感謝各位的寶貴經驗,最後我用 TabControl 配合 MDI Form,
提供給大家參考看看。
// 這是產生 Form 的 code TfmMsgEditor *fmMsgEditor = new TfmMsgEditor(Application); fmMsgEditor->Caption = IntToStr(MDIChildCount); fmMsgEditor->OnClose = this->ChildFrmClose; // 為新視窗指定關閉函式 TabControl1->Tabs->AddObject(IntToStr(MDIChildCount), fmMsgEditor); TabControl1->TabIndex = TabControl1->Tabs->Count-1; // 關閉視窗的函式 void __fastcall TfmMain::ChildFrmClose(TObject *Sender, TCloseAction &Action) { for(int i = 0; i < TabControl1->Tabs->Count; i) { if (TabControl1->Tabs->Objects[i] == Sender) { TabControl1->Tabs->Delete(i); TabControl1->Refresh(); } } Action = caFree; } // Tab 切換的函式 void __fastcall TfmMain::TabControl1Change(TObject *Sender) { AnsiString s = TabControl1->Tabs->Objects[TabControl1->TabIndex]->ClassName(); // 若有多種不同的 MDI Child Form, 就可以這樣判斷 if (s == "TfmMsgEditor") { TfmMsgEditor *Child = dynamic_cast // 這是在 Child Form 的 OnActivate 事件裡的 code, 這樣點選視窗時,Tab 也能跟著切換了 for (int i = 0; i < fmMain->TabControl1->Tabs->Count; i) { if (fmMain->TabControl1->Tabs->Strings[i] == Caption) { fmMain->TabControl1->TabIndex = i; } }目前還有一個小缺點,就是在切換 Tab 的時候, 會有閃一下的現象產生,不知是否有方法可以避免呢? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁 發表人 - chtai 於 2005/07/23 12:12:06
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |