請問 Tstatusbar OnChange event 要怎樣才可以實踐? |
尚未結案
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
以下是我看過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 發送簡訊給我 |
你好:
constructor TSamStatusPanels.Create(StatusBar: TSamStatusBar); //StatusBar: TSamStatusBar传的参数不对吧~ begin============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ |
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
我這樣改之後
為什麼當我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 發送簡訊給我 |
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
您應該去看 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 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |