繼承問題 |
答題得分者是:william
|
channel
尊榮會員 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
各位Delphi先進、高手們:
我有一個TestForm繼承一個BaseForm,在BaseForm寫有關Edit的Exit Event並且Asigned給所有的TEdit,但是在TestForm所有的Edit屬於自已的Exit Event卻無法執行,因為在BaseForm,我已經Asigned過Event,所以僅會執行BaseForm的Exit。
請問如果我要在BaseForm Asigned Event,並且要能夠在TestForm 再Asinged一次Event,也就是先做BaseForm的Event,再做TestForm的Event,我要如何做?感激不盡!!
------
~小弟淺見,參考看看~
附加檔案:25064_Test.zip
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
引言: 各位Delphi先進、高手們: 我有一個TestForm繼承一個BaseForm,在BaseForm寫有關Edit的Exit Event並且Asigned給所有的TEdit,但是在TestForm所有的Edit屬於自已的Exit Event卻無法執行,因為在BaseForm,我已經Asigned過Event,所以僅會執行BaseForm的Exit。 請問如果我要在BaseForm Asigned Event,並且要能夠在TestForm 再Asinged一次Event,也就是先做BaseForm的Event,再做TestForm的Event,我要如何做?感激不盡!!You should store the event assigned in TestForm first: e.g. unit BaseFm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, stdctrls; type TBaseForm = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FEditList: TList; procedure EditOnExit(Sender: TObject); procedure SetEditEvent(Sender: TObject); public { Public declarations } end; var BaseForm: TBaseForm; implementation {$R *.DFM} type PEditRec = ^TEditRec; TEditRec = record Edit: TObject; OnExit: TNotifyEvent; end; procedure TBaseForm.EditOnExit(Sender: TObject); var i: integer; f: boolean; begin ShowMessage('Base OnExit!'); i := 0; f := False; while (i < FEditList.Count) and (not f) do begin f := (PEditRec(FEditList.Items[i])^.Edit=Sender); inc(i); end; if f then PEditRec(FEditList.Items[i-1])^.OnExit(Sender); end; procedure TBaseForm.SetEditEvent(Sender: TObject); var R: PEditRec; begin with TEdit(Sender) do begin if Assigned(OnExit) then begin new(R); R^.Edit := Sender; R^.OnExit := OnExit; FEditList.Add(R); end; OnExit := EditOnExit; end; end; procedure TBaseForm.FormCreate(Sender: TObject); var i: integer; begin FEditList := TList.Create; for I := 0 to ComponentCount-1 do if Components[I] is TEdit then SetEditEvent(Components[I]); end; procedure TBaseForm.FormDestroy(Sender: TObject); var i: integer; begin for i := 0 to FEditList.Count-1 do dispose(PEditRec(FEditList.Items[i])); FEditList.Free; end; end. |
channel
尊榮會員 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
引言:william兄: 感謝您的Example,我已經試出來,如果我在Base再加上Edit的Enter Event,那我不就要再Type 一個Record,還是有其它方法,可不可以再寫一個Example給我?感激不盡!! TEditRec = record Edit: TObject; OnExit: TNotifyEvent; OnEnter: TNotifyEvent; end; procedure TBaseForm.SetEditEvent(Sender: TObject); var R: PEditRec; begin with TEdit(Sender) do begin if Assigned(OnExit) or Assigned(OnEnter) then begin new(R); R^.Edit := Sender; R^.OnExit := OnExit; R^.OnEnter := OnEnter; FEditList.Add(R); end; OnExit := EditOnExit; OnEnter := EditOnEnter; end; end;and write a new EditOnEnter event handler |
channel
尊榮會員 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |