若二個元件內裡所編寫程式相近,該如何避免程式重複敘述? |
尚未結案
|
YingChyuan
一般會員 發表:3 回覆:5 積分:1 註冊:2004-08-31 發送簡訊給我 |
是這樣的: 我在程式中分別使用Button1與ToolButton2二個按鍵。
但是開頭的第一段是相同的,只有在第二段因為細部功能有些微差異。 舉例:
void __fastcall TForm1::ButtonClick1(TObject *Sender)
{
第一段
第二段
} void __fastcall TForm1::ToolButton2Click(TObject *Sender)
{
第一段
第二段
} 因為第一段較多,在瀏覽以及編輯起來尚且不便又麻煩。
所以請教各位高手,是否可以直接在Button2引用或是呼叫前面Button1的第一段?
有什麼函數或方法可以達成此目的呢?說明差了請見諒,謝謝!
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 是這樣的: 我在程式中分別使用Button1與ToolButton2二個按鍵。 但是開頭的第一段是相同的,只有在第二段因為細部功能有些微差異。 舉例: void __fastcall TForm1::ButtonClick1(TObject *Sender) { 第一段 第二段 } void __fastcall TForm1::ToolButton2Click(TObject *Sender) { 第一段 第二段 } 因為第一段較多,在瀏覽以及編輯起來尚且不便又麻煩。 所以請教各位高手,是否可以直接在Button2引用或是呼叫前面Button1的第一段? 有什麼函數或方法可以達成此目的呢?說明差了請見諒,謝謝!YingChyuan你好: 應該是 class="code"> Button1->MyButtonClick; Button2->MyButtonClick; 並於.cpp中撰寫這個事件的內容, such as : void __fastcall TForm1::MyButtonClick(TObject *Sender) { TButton* now_button=(TButton*)Sender; 第一段 第二段 if (now_button->Name=="Button1") // whatever you want if ((now_button->Name=="Button2") // whatever you want } 不過照你所言應該是直接把第一段寫成一個function也可的! All,參著! 發表人 - |
JPTseng
一般會員 發表:14 回覆:22 積分:7 註冊:2004-10-27 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
YingChyuan 你好: 如果不用到Sender這個參數,可以這麼用:
void TForm1::CommonPart(void) //別忘了在檔頭要宣告 { //第一段 } void __fastcall TForm1::ButtonClick1(TObject *Sender) { CommonPart(); //不同的部分 } void __fastcall TForm1::ToolButton2Click(TObject *Sender) { CommonPart(); //不同的部分 }發表人 - pwipwi 於 2004/11/03 23:04:02 |
YingChyuan
一般會員 發表:3 回覆:5 積分:1 註冊:2004-08-31 發送簡訊給我 |
|
YingChyuan
一般會員 發表:3 回覆:5 積分:1 註冊:2004-08-31 發送簡訊給我 |
謝謝pwipwi的回答 <>< face="Verdana, Arial, Helvetica">引言: [code]
void TForm1::CommonPart(void) //別忘了在檔頭要宣告
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 抱歉,請問應該加在哪裡?檔頭的前面有
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
} 我有試著加上您所敘述的那一行,但似乎會產生錯誤?此外需要在.h做修改嗎?實在是很不好意思... 發表人 - pwipwi 於 2004/11/03 23:04:02
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 謝謝m8815010的回覆。 按照您的方式下去做,的確可行。但是卻衍生了另一個問題……… 由於我是修改美化關於影像處理的程式,其功能是按下按鈕後可以放大或固定倍率之>> >>>>>>>>>>>>>>>>>>>>>>< face="Verdana, Arial, Helvetica"> YingChyuan你好: 感覺你的 >,所以我舉個簡單的例子: < class="code"> In Unit1.h ~~ class TForm1 : public TForm { __published: // IDE-managed Components TImage *Image1; TButton *Button1; TButton *Button2; void __fastcall FormCreate(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); void __fastcall MyButtonClick(TObject* Sender); <--our personal new event }; ~~ In Unit1.cpp ~~ TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Button1->MyButtonClick; //event assign Button2->MyButtonClick; } //--------------------------------------------------------------------------- void __fastcall TForm1::MyButtonClick(TObject* Sender) { Image1->Picture->LoadFromFile("C:\\background.bmp"); //共同會做的事 TButton* now_btn=(TButton*)Sender; if (now_btn->Name=="Button1") //個別要做的事 Image1->Stretch=true; if (now_btn->Name=="Button2") Image1->Stretch=false; } 這個例就是說button1和button2按下後首先同樣都會載入image1一張圖,不同的後來做的事,button1會設Image1->Stretch=true;而button2不會! 嗯,這是依你一開始的問題的解,但如果你有特殊的變化就要再說了! |
YingChyuan
一般會員 發表:3 回覆:5 積分:1 註冊:2004-08-31 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
看了你的程式碼後,我覺得用m8815010大大的方法是比較適合你的。 你上上一篇的程式碼中:
//------------------------------------------------------------------- void __fastcall TForm1::ToolButton2Click(TObject *Sender) { ToolButton1->Button1Click; //這行可以刪除 Button1Click(ToolButton1); //加入這一行即可~ } //--------------------------------------------------------------------- |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 謝謝pwipwi的回覆 >-------------------------------> >>> ↑> >>>>>>>>>>>↓ > >>//------------------------------------------箭頭所指二處整個為> >> <> >>>>>> >(不包括紅色部分)>,而><>>> } >>> <> >>>>>> > >>< face="Verdana, Arial, Helvetica"> YingChyuan你好: 你的問題是因為把部份>先取消之前>): < class="code"> In Unit1.h ~~ class TForm1 : public TForm { __published: // IDE-managed Components TImage *Image1; TButton *Button1; TButton *Button2; void __fastcall FormCreate(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); void __fastcall MyButtonClick(TObject* Sender); <--our personal new event }; ~~ In Unit1.cpp ~~ TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Button1->OnClick = MyButtonClick; //event assign ToolButton2->OnClick = MyButtonClick; } //--------------------------------------------------------------------------- //這個事件是自已全部撰寫的,不是用inspect object快捷點出來的 void __fastcall TForm1::MyButtonClick(TObject* Sender) { Graphics::TBitmap *pSourceBitmap = Image1->Picture->Bitmap; ↑ Graphics::TBitmap *pDestBitmap = new Graphics::TBitmap(); pDestBitmap->Width = Edit1->Text.ToInt(); pDestBitmap->Height = Edit2->Text.ToInt(); pDestBitmap->PixelFormat = pf24bit; Image1->Width = pDestBitmap->Width; Image1->Height = pDestBitmap->Height; Pic->Begin(); ImageProcess(pSourceBitmap, pDestBitmap);//↓ Pic->End();//------------------------------------------箭頭所指二處整個為A段 pSourceBitmap->Assign(pDestBitmap); if (Sender->ClassName()=="ToolButton") { //判斷是不是ToolButton2按的,方法不唯一 Edit1->Text = IntToStr(pSourceBitmap->Width*125/100); Edit2->Text = IntToStr(pSourceBitmap->Height*125/100); } delete pDestBitmap; delete Pic; } All! 發表人 - m8815010 於 2004/11/04 15:06:26 |
YingChyuan
一般會員 發表:3 回覆:5 積分:1 註冊:2004-08-31 發送簡訊給我 |
再次謝謝m8815010&pwipwi二位熱心的回覆 首先我根據>< face="Verdana, Arial, Helvetica">引言:
//--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Button1->OnClick = MyButtonClick; //event assign ToolButton2->OnClick = MyButtonClick; } //--------------------------------------------------------------------------- //這個事件是自已全部撰寫的,不是用inspect object快捷點出來的 void __fastcall TForm1::MyButtonClick(TObject* Sender) { Pic = new TPerformanceCounter();---補上 Graphics::TBitmap *pSourceBitmap = Image1->Picture->Bitmap; Graphics::TBitmap *pDestBitmap = new Graphics::TBitmap(); pDestBitmap->Width = Edit1->Text.ToInt(); pDestBitmap->Height = Edit2->Text.ToInt(); pDestBitmap->PixelFormat = pf24bit; Image1->Width = pDestBitmap->Width; Image1->Height = pDestBitmap->Height; Pic->Begin(); ImageProcess(pSourceBitmap, pDestBitmap);// Pic->End(); pSourceBitmap->Assign(pDestBitmap); if (Sender->ClassName()=="ToolButton2") { //判斷是不是ToolButton2按的,方法不唯一 Edit1->Text = IntToStr(pSourceBitmap->Width*125/100); Edit2->Text = IntToStr(pSourceBitmap->Height*125/100); } delete pDestBitmap; delete Pic; }All! 發表人 - m8815010 於 2004/11/04 15:06:26 執行後剩下一個錯誤在if (Sender->ClassName()=="ToolButton2") 訊息是:'operator==' not implemented in type 'ShortString' for arguments of type 'char *' 訊息說User沒有設定一個ShortString的參數 "char*"? 我不瞭解所他代表的意義,該怎麼更正? |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 執行後剩下一個錯誤在if (Sender->ClassName()=="ToolButton2") 訊息是:'operator==' not implemented in type 'ShortString' for arguments of type 'char *' 訊息說User沒有設定一個ShortString的參數 "char*"? 我不瞭解所他代表的意義,該怎麼更正?YingChyuan你好: 嗯,歹勢歹勢,記得我貼上的是 >! 那一行修正成: < class="code"> if (AnsiString(Sender->ClassName())=="TToolButton") 嗯,就這樣,注意是 TToolButton (<--class name) , 不是 TToolButton2 (<-- variable name) 哦! |
YingChyuan
一般會員 發表:3 回覆:5 積分:1 註冊:2004-08-31 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
YingChyuan你好: 我大至聽得懂你的問題,但是不好意思哦,因為沒有你的全部程式碼,所以沒辦法幫你測問題到到底在那!
只能幫你猜測而已! 首先下面是是原來的程式碼,不曉得對不對: < class="code"> Button1的click事件
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Pic = new TPerformanceCounter();-------------------------------
Graphics::TBitmap *pSourceBitmap = Image1->Picture->Bitmap; ↑
Graphics::TBitmap *pDestBitmap = new Graphics::TBitmap();
pDestBitmap->Width = Edit1->Text.ToInt();
pDestBitmap->Height = Edit2->Text.ToInt();
pDestBitmap->PixelFormat = pf24bit; Image1->Width = pDestBitmap->Width;
Image1->Height = pDestBitmap->Height; Pic->Begin();
ImageProcess(pSourceBitmap, pDestBitmap);//↓
Pic->End();//------------------------------------------箭頭所指二處整個為A段 pSourceBitmap->Assign(pDestBitmap); delete pDestBitmap;
delete Pic;
} ToolButton2的click事件 void __fastcall TForm1::ToolButton2Click(TObject *Sender)
{
Pic = new TPerformanceCounter();-------------------------------
Graphics::TBitmap *pSourceBitmap = Image1->Picture->Bitmap; ↑
Graphics::TBitmap *pDestBitmap = new Graphics::TBitmap();
pDestBitmap->Width = Edit1->Text.ToInt();
pDestBitmap->Height = Edit2->Text.ToInt();
pDestBitmap->PixelFormat = pf24bit; Image1->Width = pDestBitmap->Width;
Image1->Height = pDestBitmap->Height; Pic->Begin();
ImageProcess(pSourceBitmap, pDestBitmap);//↓
Pic->End();//------------------------------------------箭頭所指二處整個為A段 pSourceBitmap->Assign(pDestBitmap);
Edit1->Text = IntToStr(pSourceBitmap->Width*125/100); 就是多了這兩行,其它都一樣
Edit2->Text = IntToStr(pSourceBitmap->Height*125/100); delete pDestBitmap;
delete Pic;
}
我的建議使用事件 void __fastcall TForm1::MyButtonClick(TObject* Sender)
{
Pic = new TPerformanceCounter();
Graphics::TBitmap *pSourceBitmap = Image1->Picture->Bitmap;
Graphics::TBitmap *pDestBitmap = new Graphics::TBitmap();
pDestBitmap->Width = Edit1->Text.ToInt();
pDestBitmap->Height = Edit2->Text.ToInt();
pDestBitmap->PixelFormat = pf24bit; Image1->Width = pDestBitmap->Width;
Image1->Height = pDestBitmap->Height; Pic->Begin();
ImageProcess(pSourceBitmap, pDestBitmap);//
Pic->End(); pSourceBitmap->Assign(pDestBitmap); if (AnsiString(Sender->ClassName())=="TToolButton") {
Edit1->Text = IntToStr(pSourceBitmap->Width*125/100);
Edit2->Text = IntToStr(pSourceBitmap->Height*125/100);
} delete pDestBitmap;
delete Pic;
}
以上如果都沒錯的話,應該是不會有你所說的問題,如果有的話,那應該你原來的程式也會有,建議你可
以同樣的操作步驟測試你原來的程式和我的範例,做為比對依據! 另外再加一個TToolButton3的話,判斷可以是:
if (AnsiString(Sender->ClassName())=="TToolButton") { TToolButton* now_btn=(TToolButton*)Sender; if (now_btn->Name=="ToolButton2") //do something if (now_btn->Name=="ToolButton3") // do something }就是類似這樣的一個同理類推而已!也就是說比如今天有十個button共用一個事件的話,當然你要在事件 中判斷是那一個button驅動這事件的,那判斷的方法也就是那幾招了! All! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |