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

OnExit無法觸發

答題得分者是:ccchen
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-16 11:34:38 IP:61.218.xxx.xxx 未訂閱
請問我在formcreate寫了以下了code,若我在任一TDbedit元件的OnExit寫何code都無法觸發,請問是為什麼?? 但是我的做法是繼承此form,所以應該除了原來onexit會觸發,繼承後的Onexit也會觸發,可是卻不做事??? procedure TBaseForm.FormCreate(Sender: TObject); var i: Integer; begin SetonEnter(self); end; procedure TBaseForm.SetonEnter(Control:TWinControl); var i: integer; begin if (Control is TDbEdit) then begin Tedit(Control).OnEnter :=EdtEnter; Tedit(Control).OnExit :=EdtExit; end else if Control.ControlCount >0 then for i := 0 to Control.ControlCount-1 do if Control.controls[i] is TWinControl then SetOnEnter(TWinControl(Control.Controls[i])); end; procedure TBaseForm.EdtEnter(Sender: TObject); begin OldColor:=TDbedit(Sender).Color; Tedit(Sender).Color :=clyellow; end; procedure TBaseForm.EdtExit(Sender: TObject); begin Tedit(Sender).Color :=OldColor; end; 發表人 - cyl 於 2003/01/16 11:50:44 發表人 - cyl 於 2003/01/16 12:14:25
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-16 13:47:57 IP:61.219.xxx.xxx 未訂閱
onEnter, onExit都只有一個property, 你將他指向那一個procedure他就執行那一個procedure.    假設NewForm繼承TBaseForm, 在DesignTime你寫入DBEdit1之onEnter, 此時DBEdit1之onEnter指向TNewForm.Dbedit1Enter, 當程式開始執行TNewForm之create, 先完成各元件之create, 此時onEnter=TNewForm.Dbedit1Enter,之後開始執行FormCreate內之inherited, 於是onEnter=EdtEnter, 故dbedit1Enter永遠不會被執行    你必須改架構, 以下給你參考    一.直接繼承EdtEnter, 如此NewForm中所有DBEDit均會執行所有程式碼
  1. 在BaseForm中
  TBaseForm = class(TForm)
    ,,,
    procedure EdtEnter(Sender: TObject);dynamic;
    procedure EdtExit(Sender: TObject);dynamic;
    { Public declarations }
  end;
  2. 在NewForm中
  TNewForm = class(TBaseForm)
    ,,,
    procedure EdtEnter(Sender: TObject);override;
    procedure EdtExit(Sender: TObject);override;
    { Public declarations }
  end;      procedure TNewForm.EdtEnter(Sender: TObject);
  begin
    inherited;
    //以下執行新加之程式碼      end;    二. 針對特定DBEdit重導onEnter Event
  1. 針對NewForm DesignTime仍寫enEnter
  procedure TNewForm.DBEdit1Enter(Sender: TObject);
  begin
    EdtEnter(self);  //直接呼叫,而不是inherited, inherited會找baseForm之DBEdit1Enter
    //以下執行新加之程式碼
  end;
  2. 在formCreate重導onEnter Event
  procedure TNewForm.FormCreate(Sender: TObject);
  begin
    inherited;
    Dbedit1.OnEnter:=DBEdit1Enter;//重導onEnter Event
  end;
發表人 - ccchen 於 2003/01/16 13:49:40
系統時間:2024-05-13 15:17:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!