如何產生自行定義的class的Onclick事件 |
尚未結案
|
biau
一般會員 發表:25 回覆:32 積分:21 註冊:2003-02-27 發送簡訊給我 |
我寫了一個簡單的class A如下 class A{
public:
String Initial_TEXT;
A(TLabel *text,TPanel *parentPanel){
Initial_TEXT="文字";
text=new TLabel(parentPanel);
text->Parent=parentPanel;
text->Caption=Initial_TEXT;
} 我在執行階段產生一個 A 的Object 名稱 t1,
但是如果我要在 t1上按下滑鼠產生動作,
不知道要將OnClick寫在哪一個地方?
因為 t1是 class A的object,似乎無法直接下OnClick TLabel *txt;
TLPanel *p;
A *t1=new A(txt,p); 請教各位先進,要如何完成這個動作!!謝謝....
|
Isatin
一般會員 發表:0 回覆:1 積分:0 註冊:2003-07-01 發送簡訊給我 |
照你程式的寫法,應該是打算讓A成為一個label的容器
這樣的寫法是有點怪,如果你要用contain的寫法
那就不需要傳label的指標,讓它成為member不是比較好? 用contain寫法的壞處就是你必須自己再重新寫一次界面
如果你覺得太麻煩可用繼承 至於OnClick,label有個property就叫OnClick,可以用來設定
如: Label->OnClick = LabelClick; void __fastcall TForm1::LabelClick(TObject* Sender)
{
}
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
以下是基本測試的 code
// Header File class A { private: TLabel *text; void __fastcall FSetOnClick(Classes::TNotifyEvent event) { text->event; } Classes::TNotifyEvent __fastcall FGetOnClick(void) { return text->OnClick; } public: String Initial_TEXT; __fastcall A(TWinControl* Owner,int X=200,int Y=100) { Initial_TEXT="文字"; text=new TLabel(Owner); text->Parent=Owner; text->Caption=Initial_TEXT; text->Left=X; text->Top=Y; } __fastcall ~A() { delete text; } __property Classes::TNotifyEvent OnClick = {read=FGetOnClick, write=FSetOnClick}; }; class TForm1 : public TForm { __published: // IDE-managed Components private: // User declarations TPanel* myPanel; A* myA; void __fastcall TForm1::MyAClick(TObject *Sender); public: // User declarations __fastcall TForm1(TComponent* Owner); __fastcall ~TForm1(); }; // Source File __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { myPanel = new TPanel(Form1); myPanel->Parent=Form1; myPanel->Width=400; myPanel->Height=200; myA = new A(myPanel); myA->MyAClick; } __fastcall TForm1::~TForm1() { delete myA; delete myPanel; } void __fastcall TForm1::MyAClick(TObject *Sender) { ShowMessage("MyAClick"); }基本上,您的原始構想正如 Isatin 所說,並不是很好的方式。 最好再重新思考一下。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/07/01 08:24:52
------
http://www.ViewMove.com |
biau
一般會員 發表:25 回覆:32 積分:21 註冊:2003-02-27 發送簡訊給我 |
謝謝 dllee 與 Isatin
因為我的程式構想是要在執行階段 讓user不斷的產生panel
在panel上再建立 許多文字物件(我會用TList記錄這些 文字物件 的 指標)
當user點選到其中的文字物件時他可以做拖拉文字到特定位置,他也可以修改
Label文字的內容,所以我才需要處理onclick的事件
因為想用container的形式完成,初次試寫class也不確定class A這種做法是不是可行
所以才請教各位先進,如果我要讓user達到以上的要求
希望dllee您能給我一點您的處理經驗,在此先謝謝您了
感激不盡..... 謝謝 dllee 與 Isatin
因為我的程式構想是要在執行階段 讓user不斷的產生panel
在panel上再建立 許多文字物件(我會用TList記錄這些 文字物件 的 指標)
當user點選到其中的文字物件時他可以做拖拉文字到特定位置,他也可以修改
Label文字的內容,所以我才需要處理onclick的事件
因為想用container的形式完成,初次試寫class也不確定class A這種做法是不是可行
所以才請教各位先進,如果我要讓user達到以上的要求
希望dllee您能給我一點您的處理經驗,在此先謝謝您了
感激不盡.....
引言: 以下是基本測試的 code// Header File class A { private: TLabel *text; void __fastcall FSetOnClick(Classes::TNotifyEvent event) { text->event; } Classes::TNotifyEvent __fastcall FGetOnClick(void) { return text->OnClick; } public: String Initial_TEXT; __fastcall A(TWinControl* Owner,int X=200,int Y=100) { Initial_TEXT="文字"; text=new TLabel(Owner); text->Parent=Owner; text->Caption=Initial_TEXT; text->Left=X; text->Top=Y; } __fastcall ~A() { delete text; } __property Classes::TNotifyEvent OnClick = {read=FGetOnClick, write=FSetOnClick}; }; class TForm1 : public TForm { __published: // IDE-managed Components private: // User declarations TPanel* myPanel; A* myA; void __fastcall TForm1::MyAClick(TObject *Sender); public: // User declarations __fastcall TForm1(TComponent* Owner); __fastcall ~TForm1(); }; // Source File __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { myPanel = new TPanel(Form1); myPanel->Parent=Form1; myPanel->Width=400; myPanel->Height=200; myA = new A(myPanel); myA->MyAClick; } __fastcall TForm1::~TForm1() { delete myA; delete myPanel; } void __fastcall TForm1::MyAClick(TObject *Sender) { ShowMessage("MyAClick"); }基本上,您的原始構想正如 Isatin 所說,並不是很好的方式。 最好再重新思考一下。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/07/01 08:24:52 |
biau
一般會員 發表:25 回覆:32 積分:21 註冊:2003-02-27 發送簡訊給我 |
謝謝 dllee 與 Isatin
因為我的程式構想是要在執行階段 讓user不斷的產生panel
在panel上再建立 許多文字物件(我會用TList記錄這些 文字物件 的 指標)
當user點選到其中的文字物件時他可以做拖拉文字到特定位置,他也可以修改
Label文字的內容,所以我才需要處理onclick的事件
因為想用container的形式完成,初次試寫class也不確定class A這種做法是不是可行
所以才請教各位先進,如果我要讓user達到以上的要求
希望dllee您能給我一點您的處理經驗,在此先謝謝您了
感激不盡..... 謝謝 dllee 與 Isatin
引言: 以下是基本測試的 code// Header File class A { private: TLabel *text; void __fastcall FSetOnClick(Classes::TNotifyEvent event) { text->event; } Classes::TNotifyEvent __fastcall FGetOnClick(void) { return text->OnClick; } public: String Initial_TEXT; __fastcall A(TWinControl* Owner,int X=200,int Y=100) { Initial_TEXT="文字"; text=new TLabel(Owner); text->Parent=Owner; text->Caption=Initial_TEXT; text->Left=X; text->Top=Y; } __fastcall ~A() { delete text; } __property Classes::TNotifyEvent OnClick = {read=FGetOnClick, write=FSetOnClick}; }; class TForm1 : public TForm { __published: // IDE-managed Components private: // User declarations TPanel* myPanel; A* myA; void __fastcall TForm1::MyAClick(TObject *Sender); public: // User declarations __fastcall TForm1(TComponent* Owner); __fastcall ~TForm1(); }; // Source File __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { myPanel = new TPanel(Form1); myPanel->Parent=Form1; myPanel->Width=400; myPanel->Height=200; myA = new A(myPanel); myA->MyAClick; } __fastcall TForm1::~TForm1() { delete myA; delete myPanel; } void __fastcall TForm1::MyAClick(TObject *Sender) { ShowMessage("MyAClick"); }基本上,您的原始構想正如 Isatin 所說,並不是很好的方式。 最好再重新思考一下。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/07/01 08:24:52 |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
不太清您的 Label 數量是否固定,如果是固定的話,可以用一個 Frame 來放所有的 Label ,同時就像在 Form 內一樣,去寫需要的事件函式,例如:
■ Unit2.h // 就在 New Frame 後,放入 4 個 TLabel,並寫其中 Label1 的 Event //----------------------------------------------------------------------------// class TFrame2 : public TFrame { __published: // IDE-managed Components TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4; void __fastcall Label1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall Label1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall Label1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y); private: // User declarations bool Label1Moving; int Label1X,Label1Y; public: // User declarations __fastcall TFrame2(TComponent* Owner); }; ■ Unit2.cpp //----------------------------------------------------------------------------// __fastcall TFrame2::TFrame2(TComponent* Owner) : TFrame(Owner) { } //----------------------------------------------------------------------------// void __fastcall TFrame2::Label1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button==mbRight) { AnsiString OldText; if(InputQuery("Update Text","Please Input Text",OldText)) Label1->Caption=OldText; } else { Label1Moving=true; Label1X=X; Label1Y=Y; } } //----------------------------------------------------------------------------// void __fastcall TFrame2::Label1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Label1Moving=false; } //----------------------------------------------------------------------------// void __fastcall TFrame2::Label1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(Label1Moving) { Label1->Left=Label1->Left X-Label1X; Label1->Top=Label1->Top Y-Label1Y; } } //----------------------------------------------------------------------------// ■ Unit1.cpp #include "Unit2.h" void __fastcall TForm1::Button1Click(TObject *Sender) { // 在此只是測試,真的要用,應該放在 Form1 的屬性內,以便需要時,可以 delete 它 static int Count=0; TFrame2 *test=new TFrame2(this); test->Parent=this; test->Left=Count*10; test->Top=Count*10; test->Name="TestFrame" String(Count ); // 每一個的 Name 都不同,當然也可以自己取 }基本上,由主表單上按 Button1 就可以產生一個 TFrame2 ,同時可以操作上面的 Label1 ,按左鍵不放可以移動它,按右鍵可以改文字內容。 這樣可以處理固定 Label 數的狀況,當然,您也可以依此改成動態 Label 數。 Frame 算是蠻好用的一個東西,像您需要同質、多份,每個裡面還要有一些 VCL 可以操作,這時用 Frame 是最快的了。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |