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

請問 Tstatusbar OnChange event 要怎樣才可以實踐?

尚未結案
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-08 10:18:08 IP:218.103.xxx.xxx 未訂閱
以下是我看過comctrls 去試改的 但有問題, 紅色的部分不能編譯 請問是我漏掉了什麼嗎?     
 unit SamStatusBar;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls;    type
  TSamStatusBar       = class;      TSamStatusPanels    = class(TStatusPanels)
  private
    FonChange : TNotifyEvent;
  protected
    procedure Change; dynamic;
  public
    constructor Create(StatusBar: TSamStatusBar);reintroduce;
  published
    property onChange : TNotifyEvent read FonChange write FonChange;
  end;      TSamStatusBar = class(TStatusBar)
  private
    { Private declarations }
    FPanels : TSamStatusPanels;
    procedure SetPanels(Value: TSamStatusPanels);reintroduce;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent);override;
  published
    { Published declarations }
    Property Panels : TSamStatusPanels read FPanels write SetPanels;
  end;    procedure Register;    implementation    { TSamStatusPanels }    constructor TSamStatusPanels.Create(StatusBar: TSamStatusBar);
begin
  inherited Create(TStatusPanel); 
//  FStatusBar := StatusBar;
end;    procedure TSamStatusPanels.Change;
begin
     if Assigned(FonChange) then Fonchange(Self);
end;    { TSamStatusBar }    {*R *.res}    constructor TSamStatusBar.Create(AOwner: TComponent);
begin
     inherited Create(AOwner);
     FPanels := TSamStatusPanels.Create(Self);
end;    procedure TSamStatusBar.SetPanels(Value: TSamStatusPanels);
begin
  FPanels.Assign(Value);
end;    procedure Register;
begin
  RegisterComponents('Samples', [TSamStatusBar]);
end;    end.    
可能不是最好的方法 !!! 我也是初學者 !!! 不要怪我呀.. 我最喜歡吃零食啦^.^
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-08 11:18:45 IP:218.15.xxx.xxx 未訂閱
你好:  
 
constructor TSamStatusPanels.Create(StatusBar: TSamStatusBar); //StatusBar: TSamStatusBar传的参数不对吧~
begin
  inherited Create(TStatusPanel); 
改为:inherited Create(StatusBar); //试试
//  FStatusBar := StatusBar;
end;    
============================ 为什么经过多年以后,得失的过程如此冷漠 ============================
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-08 12:15:21 IP:218.103.xxx.xxx 未訂閱
deity 你好 我試過你的建議了, 是可以編譯了 但我想問那為什麼在 comctrls.pas 裡的同一地方是 用 inherited Create(TStatusPanel); 呢? 可以講解一下嗎? 可能不是最好的方法 !!! 我也是初學者 !!! 不要怪我呀.. 我最喜歡吃零食啦^.^
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-08 12:23:04 IP:218.103.xxx.xxx 未訂閱
我這樣改之後 為什麼當我add panels 之後, panels 沒有 onchange event 呢? 謝謝     
     unit SamStatusBar;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls;    type
  TSamStatusBar       = class;      TSamStatusPanel     = class(TStatusPanel)
  private
    FonChange : TNotifyEvent;
  protected
    procedure Change; dynamic;
  public
  published
    property onChange : TNotifyEvent read FonChange write FonChange;
  end;    //***************************************************************************//      TSamStatusPanels    = class(TStatusPanels)
  private
    FStatusBar: TSamStatusBar;
    function GetItem(Index: Integer): TSamStatusPanel;reintroduce;
    procedure SetItem(Index: Integer; Value: TSamStatusPanel);reintroduce;
  protected
  public
    constructor Create(StatusBar: TSamStatusBar);reintroduce;
    function Add: TSamStatusPanel;reintroduce;
    property Items[Index: Integer]: TSamStatusPanel read GetItem write SetItem; default;
  published
  end;    //***************************************************************************//
  TSamStatusBar = class(TStatusBar)
  private
    { Private declarations }
    FPanels : TSamStatusPanels;
    procedure SetPanels(Value: TSamStatusPanels);reintroduce;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent);override;
  published
    { Published declarations }
    Property Panels : TSamStatusPanels read FPanels write SetPanels;
  end;    procedure Register;    implementation    { TSamStatusPanel }    procedure TSamStatusPanel.Change;
begin
     if Assigned(FonChange) then Fonchange(Self);
end;    { TSamStatusPanels }    constructor TSamStatusPanels.Create(StatusBar: TSamStatusBar);
begin
  inherited Create(StatusBar);
  FStatusBar := StatusBar;
end;    function TSamStatusPanels.GetItem(Index: Integer): TSamStatusPanel;
begin
  Result := TSamStatusPanel(inherited GetItem(Index));
end;    procedure TSamStatusPanels.SetItem(Index: Integer; Value: TSamStatusPanel);
begin
  inherited SetItem(Index, Value);
end;    function TSamStatusPanels.Add: TSamStatusPanel;
begin
  Result := TSamStatusPanel(inherited Add);
end;    { TSamStatusBar }    {*R *.res}    constructor TSamStatusBar.Create(AOwner: TComponent);
begin
     inherited Create(AOwner);
     FPanels := TSamStatusPanels.Create(Self);
end;    procedure TSamStatusBar.SetPanels(Value: TSamStatusPanels);
begin
  FPanels.Assign(Value);
end;    procedure Register;
begin
  RegisterComponents('Samples', [TSamStatusBar]);
end;    end.
可能不是最好的方法 !!! 我也是初學者 !!! 不要怪我呀.. 我最喜歡吃零食啦^.^
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-09 00:22:23 IP:61.219.xxx.xxx 未訂閱
引言: 我試過你的建議了, 是可以編譯了 但我想問那為什麼在 comctrls.pas 裡的同一地方是 用 inherited Create(TStatusPanel); 呢?
因為 TStatusPanels 的 父類別是 TCollectionItem
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-10 15:44:38 IP:218.103.xxx.xxx 未訂閱
想請問那我這樣寫是沒辦法現實onchange 的嗎?? 可能不是最好的方法 !!! 我也是初學者 !!! 不要怪我呀.. 我最喜歡吃零食啦^.^
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-10 16:48:10 IP:203.69.xxx.xxx 未訂閱
您應該去看 TCustomEdit 的原始碼 (StdCtrls.pas)
...
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
...
procedure TCustomEdit.CNCommand(var Message: TWMCommand);
begin
  if (Message.NotifyCode = EN_CHANGE) and not FCreating then Change;
end;
在 TCustomEdit 中因為 TCustomEdit 實作了 Windows 系統提供的Edit物件 (CreateSubClass(Params, 'EDIT');) 所以當Edit內容有改變時, 會由系統送出 Message 給TCustomEdit物件, 引發TCustomEdit.CNCommand, 再引發 Change. 你定義了 Change, 可是問題是誰來呼叫他? 我看不出來要在什麼時候去呼叫你的 Change.... 是在 Panels 切換的時候嗎? StatusBar 有 Panels "切換" 這樣的行為嗎? 也許你應該先說明 你想 Change 什麼....
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-10 17:00:18 IP:218.103.xxx.xxx 未訂閱
不好意思 我是想在panels 的 text 改變的時候 觸發change 另外我現在的寫法, 在panels 的published 已經 定義了onchange 但在design time 的時候, property menu 看不到有這個的地方.... 所以我的問題就停在這裡, 都還沒去想怎樣去觸法.. 可能不是最好的方法 !!! 我也是初學者 !!! 不要怪我呀.. 我最喜歡吃零食啦^.^
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-10 19:09:07 IP:203.69.xxx.xxx 未訂閱
原因是在design time 的時候, 你加進去的 Panel 是 TStatusPanel 而不是 TSamStatusPanel.... 建議你不要繼承 TStatusPanel, TStatusPanels, TStatusBar 而是 完全直接仿 ComCtrls 的作法來做 自己的元件.
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-11-11 12:39:21 IP:218.103.xxx.xxx 未訂閱
malanlk 你好: 請問是我那裡錯呢? tsamstatuspanels 裡不是 reintroduce function Add: TSamStatusPanel;reintroduce; 了嗎? 呀為什麼那個panels 是從tstatuspanel 來的? 可能不是最好的方法 !!! 我也是初學者 !!! 不要怪我呀.. 我最喜歡吃零食啦^.^
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-11 13:44:44 IP:203.69.xxx.xxx 未訂閱
constructor TStatusPanels.Create(StatusBar: TCustomStatusBar);
begin
  if StatusBar <> nil then
    inherited Create(StatusBar.GetPanelClass)
  else
    inherited Create(TStatusPanel);
  FStatusBar := StatusBar;
end;
紅色處是關鍵
  TSamStatusBar = class(TStatusBar)
  private
    { Private declarations }
    FPanels : TSamStatusPanels;
    procedure SetPanels(Value: TSamStatusPanels);reintroduce;
  protected
    { Protected declarations }
    function GetPanelClass: TStatusPanelClass; override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent);override;
  published
    { Published declarations }
    Property Panels : TSamStatusPanels read FPanels write SetPanels;
  end;
....    function TSamStatusBar.GetPanelClass: TStatusPanelClass;
begin
  Result := TSamStatusPanel;
end;    
改成這樣應該就可以換成 TSamStatusPanels 了, 但是還是無法正常運作 建議你完全模仿的主要原因 就是 TStatusPanel, TStatusPanels, TCustomStatusBar 相關性太強, 要達到您的目的 勢必要動到 ComCtrls.pas 這是我所不樂見的.....
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-11-11 16:44:08 IP:218.103.xxx.xxx 未訂閱
malanlk 你好: 因為這樣所以你建議我從ComCtrls重新寫一個 oo... 我只是要作看似很簡單的事情.... 只要statusbar 改變的時告訴我就可以了...唉 可能不是最好的方法 !!! 我也是初學者 !!! 不要怪我呀.. 我最喜歡吃零食啦^.^
系統時間:2024-05-19 17:22:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!