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

如何產生多分頁視窗?

尚未結案
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-15 16:46:47 IP:61.222.xxx.xxx 未訂閱
想請問各位: 有很多程式,尤其是文書編輯器如 PSPad 與 UltraEdit, 都可以產生很多子視窗,然後可以用上面一排分頁標籤(Tab)來切換視窗。 我想請問的是,這樣的功能要怎麼辦到呢 ? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-15 17:28:19 IP:211.20.xxx.xxx 未訂閱
在bcb裡有提供TabControl元件。    在TabControl的OnChange事件,就是Tab被改變。 可以在此事件裡去處理畫面的切畫、更新。    
void __fastcall TForm1::TabControl1Change(TObject *Sender)
{
        Memo1->Lines->LoadFromFile(TabControl1->Tabs->Strings[TabControl1->TabIndex]);
}
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-18 11:05:17 IP:210.64.xxx.xxx 未訂閱
引言: 在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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-18 13:50:10 IP:59.115.xxx.xxx 未訂閱
chtai 您好:    給您一個範例參考一下,請依下列順序建立測試環境:
  • 在 Form 上設置一個 TPanel,上方的 Panel 高度無需太大,可以放下 Button 物件即可,Align 屬性設為 alTop。
  • 在前述的 Panel 上設置兩個 TButton,分別命名為 btnNewPage 與 btnDelPage,而 btnDelPage 的 Enabled 屬性先設為 false。
  • 在 Form 上設置一個 TPageControl,命名為 PageControl1,設定 Align 屬性為 alClient。
兩個 Button 的 OnClick 事件處理程序分別設定如下:
// 建立新頁籤
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-19 16:02:56 IP:210.64.xxx.xxx 未訂閱
那請問要怎麼產生新的 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-19 18:22:50 IP:61.230.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-19 21:54:21 IP:210.64.xxx.xxx 未訂閱
引言: 至於關閉 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-19 21:56:40 IP:218.175.xxx.xxx 未訂閱
在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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-19 22:10:12 IP:61.230.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-20 14:22:34 IP:61.218.xxx.xxx 未訂閱
請問 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-21 02:10:44 IP:61.230.xxx.xxx 未訂閱
chtai 您好:
引言:我現在有 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.
請問我是哪裡做錯了呢 ?
之所以會出現錯誤訊息,應該是因為您在 Form2 執行 Form1 裡的 delete 頁籤動作,而 Form2 的 Parent 卻是 Form1 的頁籤,當您在刪除頁籤時會刪除頁籤裡的物件,這也包含了 Form2 在內,但是呼叫該動作的程序是在 Form2 本身,程序還未結束就被刪除掉所致。 或許是我的功力不夠或是對這個問題存在著盲點吧?我雖然做了些測試,但是仍無法順利的在 Form2 刪除掉 Form1 的頁籤 (雖然可以 delete 掉但是會產生錯誤訊息),我建議您還是將刪除的動作放在 Form1 裡比較簡單些,要不然您也可以考慮 liangnet 建議的方式,改用 MDI Form 配合 TabControl 來處理,這樣子可以將頁籤與 Form 分別處理,應該不會有上述的那種困擾。 7 天天敲鍵盤 v 時時按滑鼠 8
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-23 12:09:09 IP:211.74.xxx.xxx 未訂閱
感謝各位的寶貴經驗,最後我用 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(TabControl1->Tabs->Objects[TabControl1->TabIndex]);
        Child->BringToFront();
    }
    else if (s == "TfmEnumEditor")
    {
        TfmEnumEditor *Child = dynamic_cast(TabControl1->Tabs->Objects[TabControl1->TabIndex]);
        Child->BringToFront();
    }
}
// 這是在 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
系統時間:2024-03-29 6:06:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!