全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1659
推到 Plurk!
推到 Facebook!

繼承問題

答題得分者是:william
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-16 15:51:27 IP:211.21.xxx.xxx 未訂閱
各位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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-16 16:16:34 IP:147.8.xxx.xxx 未訂閱
引言: 各位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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-16 18:27:41 IP:211.21.xxx.xxx 未訂閱
william兄: 感謝您的Example,我已經試出來,如果我在Base再加上Edit的Enter Event,那我不就要再Type 一個Record,還是有其它方法,可不可以再寫一個Example給我?感激不盡!!
------
~小弟淺見,參考看看~
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-17 11:35:59 IP:147.8.xxx.xxx 未訂閱
引言: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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-01-17 11:50:35 IP:211.21.xxx.xxx 未訂閱
感謝william兄,我已經了解。
------
~小弟淺見,參考看看~
系統時間:2024-05-18 19:01:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!