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

自己寫 VCL 如(MyButton)元件如何在Form或其它物件的 OnCreate 及 OnCl

答題得分者是:wameng
jeffreck
高階會員


發表:247
回覆:340
積分:197
註冊:2003-01-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-30 12:52:33 IP:61.218.xxx.xxx 未訂閱
請教各位前輩 自己寫 VCL 如(MyButton)元件如何在Form或其它物件的 OnCreate 及 OnClick 事件加入程式 ?? 自己寫的 VCL 元件,如 MyButton 1.如何為加入這元件的Form 在OnCreate 及 OnClick 加入事件 例:如Form加入 VCL 元件後, 當FORM 的 OnClick 事件會先執行 VCL的程式再執行本自的程式 2.和上面相同但是要控制 Form 上的其它元件 的 OnClick 謝謝各位前輩!! 有了你這世界變的更美好!!
jeffreck
高階會員


發表:247
回覆:340
積分:197
註冊:2003-01-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-30 13:10:39 IP:61.218.xxx.xxx 未訂閱
引言: 請教各位前輩 自己寫 VCL 如(MyButton)元件如何在Form或其它物件的 OnCreate 及 OnClick 事件加入程式 ?? 自己寫的 VCL 元件,如 MyButton 1.如何為加入這元件的Form 在OnCreate 及 OnClick 加入事件 例:如Form加入 VCL 元件後, 當FORM 的 OnClick 事件會先執行 VCL的程式再執行本自的程式 2.和上面相同但是要控制 Form 上的其它元件 的 OnClick 謝謝各位前輩!! 有了你這世界變的更美好!!
剛才想到 DosMove 因該也是這樣作,所以去看一下 http://delphi.ktop.com.tw/topic.php?topic_id=25454 原來是在執行期改變 TKeyEvent 但在新的 TKeyEvent 也要先執行原TKeyEvent
 
procedure TDosMove.SetKeyEvent;
begin
  // Intercept with OnKeyDown event and OnKeyPress event of 'Owner'      // Run Time
  if not (csDesigning in ComponentState) then
  begin
    if FActive then
    begin
      // 設定
      FOwnerKeyDown := (Self.Owner as TForm).OnKeyDown;
      (Self.Owner as TForm).OnKeyDown := NewKeyDown;
      FOwnerKeyPress := (Self.Owner as TForm).OnKeyPress;
      (Self.Owner as TForm).OnKeyPress := NewKeyPress;
    end else
    begin
      // 還原
      (Self.Owner as TForm).OnKeyDown := FOwnerKeyDown;
      (Self.Owner as TForm).OnKeyPress := FOwnerKeyPress;
    end;
  end;
end;
 
真是太神奇了,有很多想要功能都能能做了,, 再請教各位前輩還有其它的作法嗎?? 發表人 - jeffreck 於 2004/11/30 15:15:14
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-30 15:24:58 IP:61.222.xxx.xxx 未訂閱
大概是如此吧! 只不過使用這種方法,需要顧慮的地方有很多。 這種狸貓換太子的作法, 需注意在替換後在替換的事件仍然要呼叫原事件。 由於非直接繼承該元件,只能間接使用Form公開的方法或事件。 應該是沒有其他的作法。 事實上,換各角度。 本身元件的 Load 與 Form的 Create 事件,沒什麼兩樣。 使用物件本身CM_CancelMode 與 Form的 OnClick 有異取同工之妙。 僅提供參考。
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-30 15:32:23 IP:218.170.xxx.xxx 未訂閱
    procedure TForm1.FormClick(Sender: TObject);
begin
  if assigned(button1.OnClick) then
     button1.Click;    end;    
jeffreck
高階會員


發表:247
回覆:340
積分:197
註冊:2003-01-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-30 15:59:12 IP:61.218.xxx.xxx 未訂閱
引言: 大概是如此吧! 只不過使用這種方法,需要顧慮的地方有很多。 這種狸貓換太子的作法, 需注意在替換後在替換的事件仍然要呼叫原事件。 由於非直接繼承該元件,只能間接使用Form公開的方法或事件。 應該是沒有其他的作法。 事實上,換各角度。 本身元件的 Load 與 Form的 Create 事件,沒什麼兩樣。 使用物件本身CM_CancelMode 與 Form的 OnClick 有異取同工之妙。 僅提供參考。
謝謝前輩 ,又學到了一招 CM_CancelMode http://delphi.ktop.com.tw/topic.php?topic_id=58592 但 OnClick 及 OnCreate 只是舉例, 是我想要把自己的BaseForm做的更方便 再前感謝 wameng 及 hahalin 前輩, 我真的感覺自己不會寫程式了,一堆程式都是抄別人的< >< >
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-30 16:31:29 IP:61.222.xxx.xxx 未訂閱
如果您要接管所有物件的 OnClick 事件。 倒不如透過 Application.OnMessage 事件。
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  Handled := false;
  { MouseDown }
  if Msg.message=WM_LBUTTONDOWN then
  begin
    ListBox1.Items.add(inttostr(Msg.hwnd));
  end;
end;
系統時間:2024-11-23 20:18:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!