附加程式到原有的事件中 |
答題得分者是:Mickey
|
pillar62
資深會員 發表:9 回覆:324 積分:271 註冊:2002-04-15 發送簡訊給我 |
|
yachanga
資深會員 發表:24 回覆:335 積分:296 註冊:2003-09-27 發送簡訊給我 |
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 發送簡訊給我 |
引言: 請問各位前輩 要如何將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 發送簡訊給我 |
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. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |