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

如何產生自行定義的class的Onclick事件

尚未結案
biau
一般會員


發表:25
回覆:32
積分:21
註冊:2003-02-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-01 00:04:23 IP:140.113.xxx.xxx 未訂閱
我寫了一個簡單的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-01 02:58:55 IP:211.75.xxx.xxx 未訂閱
照你程式的寫法,應該是打算讓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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-01 08:20:28 IP:61.224.xxx.xxx 未訂閱
以下是基本測試的 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-01 16:36:19 IP:140.113.xxx.xxx 未訂閱
謝謝 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-01 16:36:43 IP:140.113.xxx.xxx 未訂閱
謝謝 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-01 22:21:41 IP:61.224.xxx.xxx 未訂閱
不太清您的 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
系統時間:2024-05-03 13:56:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!