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

TFrame 沒有 OnCreate, 怎辦?

尚未結案
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-04 12:59:51 IP:218.103.xxx.xxx 未訂閱
若由 TForm 代做, 又覺不夠 OO, 有好提議嗎? -- 小卜子
------
--
小卜子
danny
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-04 13:32:39 IP:211.76.xxx.xxx 未訂閱
引言: 若由 TForm 代做, 又覺不夠 OO, 有好提議嗎?
TFrame 本身是依附在 Form 上的沒有 OnCreate 是可以理解的. 如果硬是要有 OnCreate 就自己繼承 TFrame 做一個新的 TFrame
type
  TNewFrame = class(TFrame)
  private
    { Private declarations }
    FOnCreate: TNotifyEvent;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  published
    property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  end;    implementation    constructor TNewFrame.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);      if Assigned(FOnCreate) then
    FOnCreate(Self);
end;
------
將問題盡快結案也是一種禮貌!
danny
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-04 13:36:29 IP:211.76.xxx.xxx 未訂閱
QuickReport 也是沒有 OnCreate 一樣比照以上方法
------
將問題盡快結案也是一種禮貌!
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-04 15:02:35 IP:218.103.xxx.xxx 未訂閱
引言:
引言: 若由 TForm 代做, 又覺不夠 OO, 有好提議嗎?
TFrame 本身是依附在 Form 上的沒有 OnCreate 是可以理解的. 如果硬是要有 OnCreate 就自己繼承 TFrame 做一個新的 TFrame
type
  TNewFrame = class(TFrame)
  private
    { Private declarations }
    FOnCreate: TNotifyEvent;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  published
    property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  end;    implementation    constructor TNewFrame.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);      if Assigned(FOnCreate) then
    FOnCreate(Self);
end;
那麼 Frame 的 OnCreate 的實際程式碼, 仍然是放在 Form 的 .pas 處嗎? 即是 說, FOnCreate 仍是指向 Form 的某個 Procedure 嗎? 這也不甚 OO, 達不到把 Frame 的 Coding 完全分立出去的目的。
-- 小卜子
------
--
小卜子
danny
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-05 11:56:41 IP:211.76.xxx.xxx 未訂閱
引言:
引言:
引言: 若由 TForm 代做, 又覺不夠 OO, 有好提議嗎?
TFrame 本身是依附在 Form 上的沒有 OnCreate 是可以理解的. 如果硬是要有 OnCreate 就自己繼承 TFrame 做一個新的 TFrame
type
  TNewFrame = class(TFrame)
  private
    { Private declarations }
    FOnCreate: TNotifyEvent;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  published
    property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  end;    implementation    constructor TNewFrame.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);      if Assigned(FOnCreate) then
    FOnCreate(Self);
end;
那麼 Frame 的 OnCreate 的實際程式碼, 仍然是放在 Form 的 .pas 處嗎? 即是 說, FOnCreate 仍是指向 Form 的某個 Procedure 嗎? 這也不甚 OO, 達不到把 Frame 的 Coding 完全分立出去的目的。
不是! TNewFrame 是新的元件, 您可以 registry 到元件盤中使用. 但和原來的 TFrame 不同處就在您可以在元件的 OnCreate 事件中寫程式(和在 OnFormCreate 寫程式是一樣的) 不過您說的東西和 OO 不太有關, 不知未何一直強調 OO ? 如果這樣的話, 使用RAD工具寫程式其實也是不甚 OO 要registry 到元件盤中使用, 請再加以下程式碼:
procedure Register;    ...(省略) ...    implementation    procedure Register;
begin
  RegisterComponents('Samples', [TNewFrame]);
end;
------
將問題盡快結案也是一種禮貌!
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-05 12:28:42 IP:203.67.xxx.xxx 未訂閱
type
  TFrame2 = class(TFrame)
  private
    { Private declarations }
  public
    constructor Create(AOwner: TComponent); override; //重新改寫Create方法!
    property OnCreate;override;
  end;    constructor TFrame2.Create(AOwner: TComponent);
begin
  inherited;
  //處理的程序..
end;    
ABCD分開看的懂,連起來像鬼劃符~~!!!
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-06-07 11:48:41 IP:218.103.xxx.xxx 未訂閱
引言: 不是! TNewFrame 是新的元件, 您可以 registry 到元件盤中使用.
我沒理解錯誤, 我知道這是新元件, 而且在製作這個元件的過程中, 遇到了一些問題, 我自己再試一下, 搞不來來再請教, 先謝謝您。
引言: 但和原來的 TFrame 不同處就在您可以在元件的 OnCreate 事件中寫程式(和在 OnFormCreate 寫程式是一樣的) 不過您說的東西和 OO 不太有關, 不知未何一直強調 OO ? 如果這樣的話, 使用RAD工具寫程式其實也是不甚 OO
你沒理解錯我的意思, 我的確覺得用 VCL 絕大部份的 Components 的時候不夠 OO, 因為我其實很想把特定的 DataSet 把它所屬的工作封裝好。例如當使用 TClientDataSet 製作一個 cdsCustomer 時, 若它有一項工作是 BuyProduct(), 則我很想把這個 method 封裝於 cdsCustomer 中, 以後便使用 cdsCustomer.BuyProduct() 來寫, 現在卻是 BuyProduct 放於某 DataModule 中, 若硬要把 cdsCustomer.BuyProduct() 實現出來, 除非替一個案子專門製作一大堆 Components (真的很大量, 想想一個案子要用多少個 Tables)。 現在我覺得若把 Frame 的 Method 要指到 Form 來封裝不夠 OO, 是相同的意思。因為雖然 Delphi 有以上問題, 但至少其 TForm 及 TDataModule 亦能做到封裝屬於自己的 Event handlers, 所以希望 TFrame 也能做到, 畢竟 TFrame 跟 TForm 用法上差不多, 只是把同一個畫面分開來做, 我覺得既然在視覺上分工來做, 處理邏輯上也該能分開處理, 方能物盡其用, 而事實上 TFrame 亦差不多做到了, 目前我只欠的, 是欠了 OnCreate 及 OnShow events 而已。剛看到 jest0024 君的解答很合用。 至於 OnShow, 看來不是由 TFrame 管的, 而是由 TForm 做的, 即是說, TForm 內的 OnShow event handler 內的程式碼, 不能分派到 TFrame 中了, 不知是不是呢。 -- 小卜子 發表人 - diviner 於 2004/06/07 12:56:29
------
--
小卜子
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-06-10 10:01:02 IP:210.200.xxx.xxx 未訂閱
To Diviner 所謂OO ,並不是只限於繼承這一個觀念;將所有Object組合成一個新的Object 這也是OO觀念的一種!!
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-06-10 11:33:30 IP:218.103.xxx.xxx 未訂閱
引言: To Diviner 所謂OO ,並不是只限於繼承這一個觀念;將所有Object組合成一個新的Object 這也是OO觀念的一種!!
我當然知道。我現在覺得 Delphi 不夠 OO 的, 是它的 Method 的「封裝」部份, 而非「繼承」部份。舉例說, DataModule 只是眾 DataSet 的 Container, 可是硬要把自己的 Method handler 放在 Container 上, 不會是最好的 OO 吧? -- 小卜子
------
--
小卜子
系統時間:2024-05-17 16:33:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!