全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1516
推到 Plurk!
推到 Facebook!

關於ToolBar共用問題

尚未結案
kendjoe
一般會員


發表:14
回覆:18
積分:6
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-20 14:49:48 IP:211.23.xxx.xxx 未訂閱
大家好: 小弟在設計時,想將form1的ToolBar共用到form2、form3....。因為小弟猜想即然一樣為什麼不用共享了。所以想請教各路前輩這個該如何解決呢? PS:在站上有找到一篇類似的問題,但是使用delphi加上內容太深奧了,看不 懂(http://delphi.ktop.com.tw/topic.php?topic_id=30042),因此再pos一次。若有違反版規,還請版主多多原諒
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-20 18:24:19 IP:59.115.xxx.xxx 未訂閱
kendjoe 您好:    您可以透過將 ToolBar 的 Parent 指向其它的 Form 來達成 "將 ToolBar 放置到其它的 Form 上面" 這樣的動作,但是除非您在其它 Form 上面要處理的動作與對象都完全一致,否則這樣做是不夠的,您先試試看吧,有問題的話再來逐一討論吧。 7 天天敲鍵盤 v 時時按滑鼠 8
kendjoe
一般會員


發表:14
回覆:18
積分:6
註冊:2005-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-24 23:00:59 IP:220.143.xxx.xxx 未訂閱
RedSnow兄您好: 首先要別你道歉~~這麼久才回覆真是不好意思~ 二、謝謝版主的指導,我試過redsnow的方法,結果可以 三、小弟可再請教redsnow兄問題嗎? Q1.如果我要再每一個form都有這個toolbar呢?而不是移來移去的方式? Q2."除非您在其它 Form 上面要處理的動作與對象都完全一致,否則這樣做是不夠的",這句的意思小弟不太了解~~可否請大大稍加說明一下下~~ ^^ 四、redsnow真的客氣~~
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-25 00:54:10 IP:61.230.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-26 09:13:28 IP:211.23.xxx.xxx 未訂閱
RedSnow兄您好: 嗯~再次感謝大大的回覆。 由於上次大大提到的"不夠的原因",激起小弟的好奇心所以給他試一下,小弟的構想有二個: 1.用sender去執行清除memo內容 2.speedbutton用new的方式產生,然後在取代不同form中的toolbutton 以上二個方法小弟試的結果是,方法一行不通,方法二產生出來的toolbutton在form2就無法delete,(怪怪的是在主form1中卻可以移除掉new出來的toolbutton)。以上是小弟目前想到的笨方法,所以想再次請教大大這方面的問題應該如何著手。 *^_____^*
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-26 17:24:10 IP:59.115.xxx.xxx 未訂閱
kendjoe 您好:    請把您的相關程式碼貼上來或是將整個測試檔案打包上傳至 "會員求助程式檔案上傳區",讓我知道您是怎麼寫的?然後將您的操作步驟與發生的問題描述一下,我再針對您的現況提供意見好了。 7 天天敲鍵盤 v 時時按滑鼠 8
kendjoe
一般會員


發表:14
回覆:18
積分:6
註冊:2005-02-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-27 17:47:59 IP:211.23.xxx.xxx 未訂閱
RedSnow兄您好: 謝謝你的建議我會將程式碼上傳在"會員求助程式檔案上傳區"~~ ^___^ 謝謝RedSnow長久的的幫助,所以我一定投票給RedSnow兄
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-27 21:07:28 IP:61.217.xxx.xxx 未訂閱
kendjoe 您好:    您打包上傳的檔案裡邊並沒有 Unit1 與 Unit2 模組的相關檔案,請重新上傳一次,同時打包成壓縮檔時可以不要將 Project1.tds 檔打進去。      7 天天敲鍵盤 v 時時按滑鼠 8
kendjoe
一般會員


發表:14
回覆:18
積分:6
註冊:2005-02-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-28 08:55:05 IP:211.23.xxx.xxx 未訂閱
RedSnow兄您好: redsnow兄對不起我不知道該如何將相關模組包在一起,我有試著將 options->packages中不必要的不勾選,但我想可能還是不行,我想可能是indy物件,因為公司有需要所以我有加indy。又想將其中一個coride50.bpl檔壓縮上傳,但我又不確定這樣是否可行,因此為了不再增加大大困擾,我想晚上回到家中再重寫程式再上傳。(家裡是沒有新增任何元件是最最標準的安裝)。 ps:謝謝大大的用心 *^____^*
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-28 09:40:04 IP:59.115.xxx.xxx 未訂閱
kendjoe 您好:    我前文寫道 "您打包上傳的檔案裡邊並沒有 Unit1 與 Unit2 模組的相關檔案" 的意思是指:您上傳的壓縮檔裡面沒有 Unit1.cpp, Unit1.h, Unit1.dfm, Unit2.cpp, Unit2.h, Unit2.dfm 這些檔案,僅有 Project1.cpp 是無法瞭解您的問題是出在那裡的? 7 天天敲鍵盤 v 時時按滑鼠 8
kendjoe
一般會員


發表:14
回覆:18
積分:6
註冊:2005-02-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-29 09:01:36 IP:211.23.xxx.xxx 未訂閱
RedSnow兄您好: 再次謝謝大大的提點,小弟己再次將傳案上檔。願這次不要再有失誤的發生。 *^___^*
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-10-02 16:27:43 IP:220.143.xxx.xxx 未訂閱
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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-10-02 17:15:45 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-10-02 22:40:54 IP:220.143.xxx.xxx 未訂閱
RedSnow兄您好: 嗯~~我懂了~~謝謝大大這麼熱心的指導與幫忙,經過多少的發問也讓小弟感到世界上還是有好心人在的,小弟真的好感激大大~~ 我要每天打禱一定要為大大祈福~~ *^___^*
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-10-03 01:43:03 IP:61.230.xxx.xxx 未訂閱
kendjoe 您好:    您太客氣啦,祝您順心~ <> <>> 天天敲鍵盤 <>> 時時按滑鼠 <>>
系統時間:2024-05-04 13:02:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!