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

附加程式到原有的事件中

答題得分者是:Mickey
pillar62
資深會員


發表:9
回覆:324
積分:271
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-24 15:27:11 IP:211.23.xxx.xxx 未訂閱
請問各位前輩 要如何將form裡面所有的按鈕的事件 都在附加上去一段程式 例如在原來的程式前面加上 TBitBtn(Sender).SetFocus的事件 , 請各位前輩高手 多多指教 Pillar Wang
------
Pillar Wang
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-24 17:44:00 IP:210.68.xxx.xxx 未訂閱
Hi pillar62: 若是不同Form,您可以設計一個Baseform, 拉一個Tbitbtn..裡面寫些code..    然後使用Form繼承做法, 這樣新增的Form就會有同樣的Tbitbtn..也會 繼承裡面的method... 詳細做法可參考站內繼承文章 Ex: http://delphi.ktop.com.tw/topic.php?topic_id=50178 http://delphi.ktop.com.tw/topic.php?topic_id=45327 http://delphi.ktop.com.tw/topic.php?topic_id=48466 http://delphi.ktop.com.tw/topic.php?topic_id=49147    若是同一個Form, 就簡單多了    先設一個BaseBtn, 然後其他button都先呼叫這個button method    
procedure TForm1.Button1Click(Sender: TObject);
begin
 //Base btn
 showmessage((Sender as TButton).Caption);
 (Sender as TButton).SetFocus;
end;        procedure TForm1.Button2Click(Sender: TObject);
begin
 Button1Click(Sender);
 //...... button2 method
 Showmessage('This is button2');
end;    procedure TForm1.Button3Click(Sender: TObject);
begin
  Button1Click(Sender);
 //...... button3 method
 Showmessage('This is button3');
end;        
發表人 - yachanga 於 2004/05/24 17:50:13
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-24 18:13:49 IP:61.224.xxx.xxx 未訂閱
引言: 請問各位前輩 要如何將form裡面所有的按鈕的事件 都在附加上去一段程式 例如在原來的程式前面加上 TBitBtn(Sender).SetFocus的事件 , 請各位前輩高手 多多指教 Pillar Wang
 //設計一個用來置換的物件
 TReplaceObj=Class(TComponent)
 public
  FOrginalEvent :TNotifyEvent;
  procedure ReplaceEvent(Sender:TObeject);
 end;
 
 //替換原有事件 
 TReplaceObj.ReplaceEvent(Sender:TObeject);
 begin
  TBitBtn(Sender).SetFocus;
  if Assigned(FOrginalEvent) then FOrginalEvent(Sender);
 end;     //置換Form上的全部按鈕的OnClick事件
procedure TMainForm.FormShow(Sender: TObject);
var i:integer;
    replaceObj:TReplaceObj;
    btn:TBitBtn ;
begin
 for i := 0 to ComponentCount-1 do
  if Components[i] is TBitBtn then
  begin
   btn := TBitBtn(Components[i]); 
   replaceObj := TReplaceObj.Create(self);
   replaceObj.FOrginalEvent  := btn.OnClick;
   btn.OnClick := replaceObj.ReplaceEvent; 
  end; 
end;    
混心雜欲 棄修身~唉
------
唉~
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-24 22:12:49 IP:218.32.xxx.xxx 未訂閱
pillar62  你好:   用 TMethod, 參考看看(Button1 Click 後, Click Memo1):
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, typinfo, StdCtrls;    type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure CheckMethod(Sender: TObject);
    procedure Memo1Click(Sender: TObject);
    procedure AddProc(Sender: TObject);
  private
    { Private declarations }
    M : TMethod;
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.Button1Click(Sender: TObject);
begin
  CheckMethod(memo1);
end;    procedure TForm1.CheckMethod(Sender: TObject);
var P : PPropList;
    i,R : integer;
    D : TMethod;
    TTD : TTypeData;
    CM : TMethod;
begin
  R := GetPropList(Sender,P);
  memo2.lines.Clear;
  for i := 0 to R-1 do
    if GetEnumName(TypeInfo(TTypeKind),Ord(P^[i].PropType^.Kind))='tkMethod' then begin
      TTD := GetTypeData(P^[i].PropType^)^;          CM := GetMethodProp(Sender,P^[i].Name);
      if Assigned(CM.Code) then begin
        M.Code := CM.Code;
        M.Data := CM.Data;
        D.Code := Self.MethodAddress('AddProc');
        D.Data := Self;
        SetMethodProp(Sender,P^[i].Name, D);
        memo2.lines.Add(P^[i].Name #9 P^[i].PropType^.Name #9 
        GetEnumName(TypeInfo(TTypeKind),Ord(P^[i].PropType^.Kind)));
      end;
  end;
end;    procedure TForm1.Memo1Click(Sender: TObject);
begin
  showmessage('In Origin Procedure');
end;    procedure TForm1.AddProc(Sender: TObject);
begin
  showmessage('In Add Procedure');
  if Assigned(M.Code) then  // Call Origin Procedure
    TNotifyEvent(M)(Sender);
end;    end.
系統時間:2024-05-19 18:07:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!