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

Delphi Interceptor Classes

答題得分者是:pprayer
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-08-29 14:59:01 IP:211.20.xxx.xxx 訂閱
根據參考(http://grandruru.blogspot.tw/2012/11/delphi-interceptor-classes-tbutton.html)

參考遇到的問題是覆寫 TMaskEdit 的 事件 由於訊息錯誤。

我遇到類似的問題發生在 TFMTBcdField 的 SetAsString 中,因此想參照此方法做覆寫這個事件。

測試了很久最後終於 compile 過了,但是不幸的是,他沒有跑進我覆寫新的副程式當中。

不知道我是觀念錯誤,還是語法不正確。


[code delphi]
TFMTBcdField = class(Data.DB.TFMTBCDField)
procedure SetAsString(const Value: string); override;
end;

...

{ TFMTBcdField }

procedure TFMTBcdField.SetAsString(const Value: string);
begin
//inherited;
//
end;

[/code]

pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-08-30 17:23:04 IP:124.109.xxx.xxx 訂閱
如果你想改寫TFMTBcdField這個元件,
那要先確定TFMTBcdField. SetAsString這方法後面是否有virtual、dynamic、或者abstract
類似這樣 procedure SetAsString; abstract;
之後你在建立一個繼承TFMTBcdField的元件 ex TMYBcdField來改寫SetAsString
TMYBcdField = class(TFMTBCDField)
procedure SetAsString(const Value: string); override;
end;

如果那個方法是private或者是static,就不能改寫了。

===================引 用 boy330077 文 章===================
根據參考(http://grandruru.blogspot.tw/2012/11/delphi-interceptor-classes-tbutton.html)

參考遇到的問題是覆寫 TMaskEdit 的 事件 由於訊息錯誤。

我遇到類似的問題發生在 TFMTBcdField 的 SetAsString 中,因此想參照此方法做覆寫這個事件。

測試了很久最後終於 compile 過了,但是不幸的是,他沒有跑進我覆寫新的副程式當中。

不知道我是觀念錯誤,還是語法不正確。


[code delphi]
TFMTBcdField = class(Data.DB.TFMTBCDField)
procedure SetAsString(const Value: string); override;
end;

...

{ TFMTBcdField }

procedure TFMTBcdField.SetAsString(const Value: string);
begin
//inherited;
//
end;

[/code]

boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-08-30 22:14:27 IP:59.126.xxx.xxx 訂閱
關於這點

TFMTBCDField = class(TNumericField)

TNumericField = class(TField)

TField = class(TComponent)
...
protected
procedure SetAsString(const Value: string); virtual;
...

然後 FMTBcdField 有再覆寫過一次
TFMTBCDField = class(TNumericField)
...
protected
procedure SetAsString(const Value: string); override;
...


所以原生在 Data.DB 裡面已經override過了
按照範例的 TMaskEdit 的 ValidateError 也是在 protected 裡面
我以為可以一樣攔截,但是實做以後都會略過我多寫出來的副程式,完全沒有進入。

或是希望被攔截的事件一定要 virtual 我就不能理解了

編輯記錄
boy330077 重新編輯於 2016-08-30 22:28:15, 註解 無‧
系統時間:2017-10-18 6:32:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!