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

自製VCL關於Event的問題..

答題得分者是:lcsboy
trumpet
一般會員


發表:6
回覆:8
積分:2
註冊:2002-12-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-11 10:26:23 IP:61.13.xxx.xxx 未訂閱
各位大大: 我有一個新作的元件(TWinControl),這元件上有加入幾個原有VCL元件(TShape) ,請問如何將加入的元件(TShape)原來的Event,新增到我要作的元件的Event上呢?
trumpet
一般會員


發表:6
回覆:8
積分:2
註冊:2002-12-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-11 10:53:31 IP:61.13.xxx.xxx 未訂閱
補充一下 我要把TShape的像OnMouseMove的一些Event 新增到TwinControl的Event上(新增一個OnShapeMouseMove) BUT 在TWinControl的OnShapeNMouuseMove的code動作前.. 又需要用TSahpe的OnMouseMove的X及Y去作一些動作....... 這樣該怎麼寫呢~~~~~
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-11 11:04:31 IP:211.23.xxx.xxx 未訂閱
那你只能在你要的OnMouseMove的code裡 使用API去取得mouse的X和Y
trumpet
一般會員


發表:6
回覆:8
積分:2
註冊:2002-12-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-11 11:59:18 IP:61.13.xxx.xxx 未訂閱
謝謝你的回應... 可是我還不是很清楚要如何增加我要的Event 在H檔的 __private中 TShape *Shape1; __fastcall Shape1MouseMove(..... __publiched中 __property TNotifyEvent AShapeMouseMove = {read = Shape1MouseMove , write=Shape1MouseMove} 在CPP檔中 void __fastcall TWincontrol1::Shape1MouseMove(TObject *Sender, TShiftState Shift,int X, int Y) { TControl::MouseMove(Sender,Shift,X,Y); } 這樣作果然不行.... 那要如何寫才能把Shape的Event加到TWincontrol的Event上呢~~
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-11 12:16:36 IP:203.73.xxx.xxx 未訂閱
引言: 各位大大: 我有一個新作的元件(TWinControl),這元件上有加入幾個原有VCL元件(TShape) ,請問如何將加入的元件(TShape)原來的Event,新增到我要作的元件的Event上呢?
trumpet 你好: 有一個走後門的方法~~給你做參考< > 但是我並不確定可不可行~~試試看吧< >
class TMyWinControl: public TWinControl
{
public:
   class TMyShape: public TShape
   {
      ...................
   };
   TMyShape *MyShape;
};
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-11 13:30:18 IP:211.23.xxx.xxx 未訂閱
To Trumpet兄: 經過你的說明! 比較知道你要幹嘛了, 不過.......原則上好像沒有人一次 把那麼多的event想要串在一起的! 不過我是有我的解法! 請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22595 原理是! 使用串接法! 這樣子, 你愛串幾百個Event在同一個procedure 都隨 你高興, 而且要不要呼叫爸爸的event也是由你來決定
trumpet
一般會員


發表:6
回覆:8
積分:2
註冊:2002-12-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-11 16:20:55 IP:61.13.xxx.xxx 未訂閱
To Icsboy大大: 我看了 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23435 但是我還是有點不清楚 因為Shape是放在TWinControl上頭的,. 所以要攔Shape上的WM_MOUSEMOVE.. 那我就要做一個新的MyShape:TShape.. 然後再去MyShape中攔Message... 可是這樣不是直接用(TShape::OnMouseMove)就好了嗎... 我現在用這種方式有增加了WinControl的Event(ShapeOnMouseMove) 但是 X,Y 無法傳進新增的Event... 這個部分要怎麼作呢~~? 還是我這個方式不行呢>? 還有23245中的VCL串接的部份我沒有看懂... 可以再說清楚一點嗎 謝謝你 我把現在的狀況POP出來給大家參考 H檔中 private: TNotifyEvent FSmallMouseMove; void __fastcall SmallShapeMouseMove(TObject *Sender, TShiftState Shift,int X, int Y); __published: __property TNotifyEvent FSmallShapeMMove={read =FSmallMouseMove,write=FSmallMouseMove}; CPP檔中 void __fastcall TWinControl1::SmallShapeMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { /* 需要用作X,Y處理一些東東....*/ FSmallMouseMove(this); /// Event 發生,但 X.Y 無法傳入 ~>_<~ }
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-12-11 17:55:23 IP:211.23.xxx.xxx 未訂閱
串接法的原理! 是把原來Event所在procedure的指標記錄下來, 然後將我 們自己要作的procedure, 接上去! 用我那種寫法, BCB Complier就會幫你把 指標接對地方!    至於你寫FSmallMouseMove(this); <---這種寫法跟本是在亂寫    山不轉! 路轉! 路不轉, 人轉!    不知道你要達成什麼樣的功能! 一定要好幾個Event都run過嗎? 目前為止還沒看過人家是這樣寫的, 雖然對你來說很簡單, 但是如果讓你 作成功了, 想必這樣的VCL效率一定很差!!!    你要的功能, 說不定多寫個一, 二個API就可以搞定了說 加油囉
trumpet
一般會員


發表:6
回覆:8
積分:2
註冊:2002-12-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-12-12 09:49:30 IP:61.13.xxx.xxx 未訂閱
To Icsboy大大: 抱歉亂寫挨罵~>_<~ 找到了TMouseMoveEvent,, (也有其它的TMouseXXXXEvent ) 可以產生OnMouseMove的Event.. ^_^/" 如Icsboy所說的一樣.. 若沒有用上很多其它的東西.. 就用API來寫效率可以提高很多.. 感謝Icsboy大大 以上完結 ^_^..
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-12-12 10:17:17 IP:61.219.xxx.xxx 未訂閱
雖然完結了, 我仍來玩一下吧 如果沒誤會你的意思, 你要在一個新元件中加入一個TShape,希望能published TShape之Event, 其實這很平常, 很多組合元件都須如此寫.    以下主元件繼承TPanel, 內加一個Shape    
class TMyClass : public TPanel  
{
private:
  TShape *Shape1;
//設定此新Event時直接設定到Shape1去
  void __fastcall SetShapeMouseMove(TMouseMoveEvent Value){Shape1->OnMouseMove = Value;}
//取此新Event時直接向Shape1取
  TMouseMoveEvent __fastcall GetShapeMouseMove(){return Shape1->OnMouseMove;}
public:
  __fastcall TMyClass(TComponent *Owner);
  __fastcall ~TMyClass();    //增一publshed Event,read write 如上
  __property TMouseMoveEvent OnShapeMouseMove = {read=GetShapeMouseMove, write=SetShapeMouseMove};
};
系統時間:2024-04-27 3:08:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!