我有一個類是 TImage32 的后代。我需要使用像 onm ouseMove 這樣的事件,因此代碼在 Create() 中分配了我的 onm ouseMove 事件。但是如果用戶在 Delphi 中安裝了這個組件并分配了另一個 onm ouseMove 事件,我的事件就會被替換。
我目前的解決方案是繼承自 TCustomImage32 并且不發布 onm ouseMove 屬性(所有其他屬性都是),而是創建一個可由用戶分配的新 onm ouseMove2 屬性,如果分配了 onm ouseMove2,則代碼在我分配的 onm ouseMove 事件中呼叫 onm ouseMove2 .
這個問題有更好的解決方案嗎?保留事件名稱,例如 onm ouseMove 并分配我自己的事件?
type
TAudioBezierCurvesInteractive = class (TCustomImage32)
private
FOnMouseMove2: TImgMouseMoveEvent;
procedure ImgMouseMoveEvent(Sender: TObject; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer);
public
Constructor Create(AOwner: TComponent); override;
published
property onm ouseMove2: TImgMouseMoveEvent read FOnMouseMove2 write FOnMouseMove2;
//* Original published properties
property Align;
property Anchors;
property AutoSize;
etc. ...
constructor TAudioBezierCurvesInteractive.Create(AOwner: TComponent);
begin
inherited;
onm ouseMove := ImgMouseMoveEvent;
end;
procedure TAudioBezierCurvesInteractive.ImgMouseMoveEvent(Sender: TObject; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer);
begin
...my code here...
if Assigned(FOnMouseMove2) then begin
FOnMouseMove2(Sender, Shift, X, Y, Layer);
end;
end;
uj5u.com熱心網友回復:
組件永遠不應該將處理程式分配給它自己的事件。正如您所發現的,這會給用戶帶來問題。
正確的解決方案是覆寫觸發事件的虛擬方法,例如:
type
TAudioBezierCurvesInteractive = class (TImage32)
protected
procedure MouseMove(Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); override;
end;
procedure TAudioBezierCurvesInteractive.MouseMove(Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer;
begin
...my code here...
inherited;
end;
uj5u.com熱心網友回復:
更好地覆寫MouseMove,做你的代碼并呼叫繼承。無需連接事件或引入第二個事件。
type
TAudioBezierCurvesInteractive = class (TCustomImage32)
protected
procedure MouseMove(Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); override;
published
//* Original published properties
procedure TAudioBezierCurvesInteractive.MouseMove(Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer);
begin
{ ...my code here... }
inherited;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/525725.html
標籤:德尔福事件
上一篇:無法將psql插入本地轉發的dockerpostgres影像埠
下一篇:應用程式沒有收到意圖廣播
