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

請教如何繼承TButton ?

 
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-21 02:35:10 IP:211.74.xxx.xxx 未訂閱
各位先進好... 請教一下....(因為繼承的關念...實在是搞不清楚) 如果我想要建立一個新元件...而此元件是繼承TButton.... 請問...這個新元件可以自訂一個同樣的屬性Caption....但是此屬性的讀寫 ...我要自行控制.....也就是說新元件的所有屬性及事件都和TButton相同... 但是...Caption部份..則是由新元件中來控管.... 這樣子行得通嗎? 如果...不行的話...又該如何做呢? 不管是否行得通...可否煩請大家簡單舉個例子呢? 多謝!!
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-07-21 10:03:39 IP:211.23.xxx.xxx 未訂閱
引言: 各位先進好... 請教一下....(因為繼承的關念...實在是搞不清楚) 如果我想要建立一個新元件...而此元件是繼承TButton.... 請問...這個新元件可以自訂一個同樣的屬性Caption....但是此屬性的讀寫 ...我要自行控制.....也就是說新元件的所有屬性及事件都和TButton相同... 但是...Caption部份..則是由新元件中來控管.... 這樣子行得通嗎? 如果...不行的話...又該如何做呢? 不管是否行得通...可否煩請大家簡單舉個例子呢? 多謝!!
可以啊override掉就可以啊 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-07-22 00:35:27 IP:211.74.xxx.xxx 未訂閱
引言: 可以啊override掉就可以啊 @@~~飛翔在天際的精靈~~@@
不好意思.... 這個override...不是用來取代父類別的程序或函數用的嗎? 可以適用在屬性方面嗎? 比如說: property Caption : TCaption read FCaption write SetCaption;override; 我試過...好像編譯時就會錯了...!! 煩請再解答...謝謝!!
ccchen
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-07-22 07:51:24 IP:61.219.xxx.xxx 未訂閱
這個override...不是用來取代父類別的程序或函數用的嗎? 可以適用在屬性方面嗎? Property是無法override的 故你可以很容易增加新屬性, 卻無法override原有屬性. 尤其是Caption, 其實Caption是由window中Standard Controls中來的, 任何Window(不論你用何種語言)均相同, 還是不要改它吧
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-07-22 10:23:07 IP:210.200.xxx.xxx 未訂閱
引言: 各位先進好... 請教一下....(因為繼承的關念...實在是搞不清楚) 如果我想要建立一個新元件...而此元件是繼承TButton.... 請問...這個新元件可以自訂一個同樣的屬性Caption....但是此屬性的讀寫 ...我要自行控制.....也就是說新元件的所有屬性及事件都和TButton相同... 但是...Caption部份..則是由新元件中來控管.... 這樣子行得通嗎? 如果...不行的話...又該如何做呢? 不管是否行得通...可否煩請大家簡單舉個例子呢?
這是可以的! 程式碼如下
unit xxButton;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;    type
  TxxButton = class(TButton)
  private
    { Private declarations }
    function GetCaption: TCaption;
    procedure SetCaption(const Value: TCaption);
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property Caption: TCaption read GetCaption write SetCaption;
  end;    procedure Register;    implementation    procedure Register;
begin
  RegisterComponents('Samples', [TxxButton]);
end;    { TxxButton }    function TxxButton.GetCaption: TCaption;
begin
  Result := inherited Caption;
  // 您要作的事
end;    procedure TxxButton.SetCaption(const Value: TCaption);
begin
  inherited Caption := Value;
  // 您要作的事
end;    end.
------
將問題盡快結案也是一種禮貌!
ccchen
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-07-22 11:12:16 IP:203.217.xxx.xxx 未訂閱
果真可以.
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-07-22 23:09:27 IP:211.74.xxx.xxx 未訂閱
引言: 這是可以的! 程式碼如下
unit xxButton;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;    type
  TxxButton = class(TButton)
  private
    { Private declarations }
    function GetCaption: TCaption;
    procedure SetCaption(const Value: TCaption);
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property Caption: TCaption read GetCaption write SetCaption;
  end;    procedure Register;    implementation    procedure Register;
begin
  RegisterComponents('Samples', [TxxButton]);
end;    { TxxButton }    function TxxButton.GetCaption: TCaption;
begin
  Result := inherited Caption;
  // 您要作的事
end;    procedure TxxButton.SetCaption(const Value: TCaption);
begin
  inherited Caption := Value;
  // 您要作的事
end;    end.
謝謝您... 果真是可以了..... 不過還要煩請您再幫一下下.... (
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-07-23 11:11:59 IP:210.200.xxx.xxx 未訂閱
(1) 是否只要加上inherited後...就可以做到所謂的...先繼承到父類別的屬性 或事件或程序或函數...然後就可以繼續我的加工部份呢? (不管父類別是那一 個) 簡單說就是使用和同父類別的任何東東(相同名稱)...而在新類別中卻呈現 出父類別原有的功能加上我所加工的部份....是嗎?    可以這麼說, 但並不是都可以. 您這情形是因為您宣告了一個 property name 是父類別中已經存在的, 所以您所宣告的這個 property name 是和父類別無關的(也就是失去關連了), 所以您必需自己存取父類別的 property , 當然您高興也可以存取其他的 property (2)procedure TxxButton.SetCaption(const Value: TCaption); begin inherited Caption := Value; end; 我將上面的inherited Caption := Value; 改成......inherited Caption := Value 'ABC'; 然後在拉入新元件時,假設此時Caption預設是MyButton1,且元件上也呈現 MyButton1....(此時...我沒有去變更Caption) 接著執行專案時,該元件的Caption卻變成MyButton1ABC.... 請問...像這種屬性的讀值及設值等的動作...是否也是會反應到執行時期的 情形呢? 元件的 name 有一定的命名規則(您也可以自訂), Create Component 後Caption 內定是和 name 一樣, 因為您又將 Caption 'ABC' 才會出現您這種情形, 我不知道您是要作何用途, 所以您必須先想想 property name 是否有設為 Caption 的必要. (3)不好意思...再請教一個很簡單的問題...但是我不知道要從那裡得知..因為 其關鍵字...我忘了怎麼寫.... 就是....要判斷此時是設計時期還是執行時期....要用那一個關鍵字呢? if (csDesigning in ComponentState) then // Design Time if not (csDesigning in ComponentState) then // Run Time
------
將問題盡快結案也是一種禮貌!
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-07-23 11:51:22 IP:211.74.xxx.xxx 未訂閱
多謝版主Danny.... 已有點了解了...!! Thanks!!
系統時間:2024-04-20 11:43:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!