關於ToolBar共用問題 |
尚未結案
|
kendjoe
一般會員 發表:14 回覆:18 積分:6 註冊:2005-02-02 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
kendjoe
一般會員 發表:14 回覆:18 積分:6 註冊:2005-02-02 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
kendjoe 您好:
引言: Q1.如果我要再每一個form都有這個toolbar呢?而不是移來移去的方式? Q2."除非您在其它 Form 上面要處理的動作與對象都完全一致,否則這樣做是不夠的",這句的意思小弟不太了解~~可否請大大稍加說明一下下~~ ^^關於第一個問題,您可以在 Design mode 直接用複製的方式將 Form1 上的 ToolBar 複製到其它的 Form 上面去。 關於第二個問題,我的意思是說:ToolBar 上面不是都有 ToolButton 嗎?那麼每個 ToolButton 也都有設定它的 OnClick 等事件,在那些事件裡的處理程序也或多或少都有對一些物件做處理,就一般狀況而言,這些被處理的對象應該也會是設在 Form1 上面的,如果您將 ToolBar 移到其它的 Form 上面,但是事件的處理程序仍然是設在 Form1 上面,而前述的處理對象也仍是 Form1 的子物件,這個時候如果您想要處理的對象是在其它的 Form 上面,那就可能會超出您的預期了,例如:ToolButton1 的 OnClick 事件中設定要清除 Form1 上面的 Memo1 內容,那麼當 ToolBar 移到 Form2 去之後,ToolButton1 的處理動作仍然是清除 Memo 的內容,而處理的對象仍然是 Form1 上的 Memo1,如果您想要的動作是清除掉 Form2 上 Memo1 的內容的話,那就需要做些修改了 (這就是我之所以會說單單是將 ToolBar 移到其它的 Form 上面去是 "不夠的" 的原因了)。 7 天天敲鍵盤 v 時時按滑鼠 8 |
kendjoe
一般會員 發表:14 回覆:18 積分:6 註冊:2005-02-02 發送簡訊給我 |
RedSnow兄您好:
嗯~再次感謝大大的回覆。
由於上次大大提到的"不夠的原因",激起小弟的好奇心所以給他試一下,小弟的構想有二個:
1.用sender去執行清除memo內容
2.speedbutton用new的方式產生,然後在取代不同form中的toolbutton
以上二個方法小弟試的結果是,方法一行不通,方法二產生出來的toolbutton在form2就無法delete,(怪怪的是在主form1中卻可以移除掉new出來的toolbutton)。以上是小弟目前想到的笨方法,所以想再次請教大大這方面的問題應該如何著手。
*^_____^*
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
kendjoe
一般會員 發表:14 回覆:18 積分:6 註冊:2005-02-02 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
kendjoe
一般會員 發表:14 回覆:18 積分:6 註冊:2005-02-02 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
kendjoe
一般會員 發表:14 回覆:18 積分:6 註冊:2005-02-02 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
kendjoe 您好: 看過您的程式碼了,您在動態產生新的按鈕時,並未設定對應的 OnClick 事件,因此新增的按鈕無法產生作用,刪除按鈕時的動作也不正確,sb 被 delete 後就不存在了,您不能直接對 sb 做刪除動作,而必須透過指向的動作先指明欲刪除的按鈕,然後才能進行處理,對 Memo 物件的動作則必須先將 Sender 的父屬 Form 先辨別出來,然後再對設置於不同 Form 上面的 Memo1 做處理。 另外您並未說明您的實際需求,因此按鈕的動態添加應該加以限制,否則就必須預先設置好相對應的事件處理程序,我將您的程式修改如下,您自己再針對自己實際的需求加以修改好了:
// 於 Unit1.h 檔案內 public: TSpeedButton *sb; int sbCnt; // 動態增刪按鈕的計數器,最多可新增兩個 // 於 Unit1.cpp 檔案內 // TSpeedButton *sb; <-- Mark 掉原先的宣告 __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { sbCnt = 0; // 動態增刪按鈕的計數器,設初值為 0 } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ToolBar1->Parent = Form2; Form2->Show(); } //--------------------------------------------------------------------------- void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { TForm *form = (TForm*)((TSpeedButton*)Sender)->Parent->Parent; TMemo *memo; if (form == Form1) // 若由 Form1 呼叫的 memo = Form1->Memo1; // 若由 Form1 呼叫的,設定對象為 Form1 的 Memo1 else memo = Form2->Memo1; // 若由 Form2 呼叫的,設定對象為 Form2 的 Memo1 memo->Lines->Add("click speedbutton1 in " form->Name); } //--------------------------------------------------------------------------- void __fastcall TForm1::SpeedButton2Click(TObject *Sender) { TForm *form = (TForm*)((TSpeedButton*)Sender)->Parent->Parent; TMemo *memo; if (form == Form1) // 請參考 SpeedButton1Click 的註解 memo = Form1->Memo1; else memo = Form2->Memo1; memo->Lines->Add("click speedbutton2 in " form->Name); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { if (sbCnt < 2) { // 若動態增刪按鈕的計數器小於 2 (最多可新增兩個),則允許添加按鈕 sb = new TSpeedButton(this); sb->Parent = Form1->ToolBar1; sb->Height = 22; sb->Width = 23; sb->Left = 99; sb->Top = 2; sbCnt ; // 動態增刪按鈕的計數器遞增 if (sbCnt == 1) { // 若為第一個新增按鈕 sb->OnClick = SpeedButton1Click; // 設定 OnClick 事件為 SpeedButton1Click } else { sb->OnClick = SpeedButton2Click; // 設定 OnClick 事件為 SpeedButton2Click } } else { ShowMessage("無法再添加動態按鈕了!"); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { if (sbCnt > 0) { // 若動態增刪按鈕的計數器大於 0,則進行刪除按鈕動作 TSpeedButton *sb = (TSpeedButton*)ToolBar1->Buttons[ToolBar1->ButtonCount-1]; delete sb; sb = NULL; sbCnt--; // 動態增刪按鈕的計數器遞減 } else { ShowMessage("沒有動態按鈕可刪除了!"); } } //--------------------------------------------------------------------------- // 於 Unit2.cpp 檔案內 // TSpeedButton *sb; <-- Mark 掉原先的宣告 void __fastcall TForm2::Button1Click(TObject *Sender) { Form1->ToolBar1->Parent = Form1; Form1->Show(); } //--------------------------------------------------------------------------- void __fastcall TForm2::Button2Click(TObject *Sender) { Form1->Button2Click(Sender); // 直接使用 Form1 內的程序 } //--------------------------------------------------------------------------- void __fastcall TForm2::Button3Click(TObject *Sender) { Form1->Button3Click(Sender); // 直接使用 Form1 內的程序 } //---------------------------------------------------------------------------7 天天敲鍵盤 v 時時按滑鼠 8 |
kendjoe
一般會員 發表:14 回覆:18 積分:6 註冊:2005-02-02 發送簡訊給我 |
RedSnow兄您好:
謝謝你再次的幫忙,但小弟有幾點不了解,想請教大大??
1、(TForm*)((TSpeedButton*)Sender)->Parent->Parent;
這行是意思指:將sender指的物件轉為tspeedbutton物件,然後再轉行form物件的parent。
2、為何有兩個parent呢?
左邊的parent是指toolbar嗎?右邊的parent是指from嗎?
3、小弟一直搞不懂,宣告物件指標(TSpeedButton *sb;)在.h檔和在 . cpp檔宣告不是一樣嗎?而且小弟也將TSpeedButton *sb;寫在.CPP檔的前端所以是全域物件呀~? *^___^*
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
kendjoe 您好:
引言:1、(TForm*)((TSpeedButton*)Sender)->Parent->Parent; 這行是意思指:將sender指的物件轉為tspeedbutton物件,然後再轉行form物件的parent。 2、為何有兩個parent呢? 左邊的parent是指toolbar嗎?右邊的parent是指from嗎?是的,把那行敘述看成是 Parent 的 Parent 就可以了,目的是在取得程序被呼叫時,點選的 SpeedButton 到底是在那一個 Form 上面?如果您的 SpeedButton 與 Form 之間不只隔著 ToolBar 一個物件,那麼您還得再加上足夠數量的 Parent 指向 (或者另尋它法來取得所屬的 Form)。 引言:3、小弟一直搞不懂,宣告物件指標(TSpeedButton *sb;)在.h檔和在 . cpp檔宣告不是一樣嗎?而且小弟也將TSpeedButton *sb;寫在.CPP檔的前端所以是全域物件呀~?不太一樣,您若將該宣告寫在 .cpp 檔案內,那麼另一個 Form 就不認識它了,不要忘了您在另一個 .cpp 中 include 的是 .h 檔。 7 天天敲鍵盤 v 時時按滑鼠 8 |
kendjoe
一般會員 發表:14 回覆:18 積分:6 註冊:2005-02-02 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |