在Delphi 7中,從TGraphicControl
下降一個新組件,並添加一個TFont
屬性,實現paint方法以使用TFont
屬性編寫一些字符串。安裝組件。如何響應Delphi中對象屬性字段的變化
在設計時,當您使用屬性對話框更改TFont
屬性時,它將立即反映在您的組件中。但是,如果更改TFont
的各個屬性(如Color
或Size
),則只有在將鼠標懸停在其上後,纔會重新繪製組件。
如何正確處理對象屬性字段中的更改?
在Delphi 7中,從TGraphicControl
下降一個新組件,並添加一個TFont
屬性,實現paint方法以使用TFont
屬性編寫一些字符串。安裝組件。如何響應Delphi中對象屬性字段的變化
在設計時,當您使用屬性對話框更改TFont
屬性時,它將立即反映在您的組件中。但是,如果更改TFont
的各個屬性(如Color
或Size
),則只有在將鼠標懸停在其上後,纔會重新繪製組件。
如何正確處理對象屬性字段中的更改?
將事件處理程序分配給TFont.OnChange
事件。在處理程序中,您可以使用Invalidate()
來觸發重繪。例如:
type
TMyControl = class(TGraphicControl)
private
FMyFont: TFont;
procedure MyFontChanged(Sender: TObject);
procedure SetMyFont(Value: TFont);
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property MyFont: TFont read FMyFont write SetMyFont;
end;
constructor TMyControl.Create(AOwner: TComponent);
begin
inherited;
FMyFont := TFont.Create;
FMyFont.OnChange := MyFontChanged;
end;
destructor TMyControl.Destroy;
begin
FMyFont.Free;
inherited;
end;
procedure TMyControl.MyFontChanged(Sender: TObject);
begin
Invalidate;
end;
procedure TMyControl.SetMyFont(Value: TFont);
begin
FMyFont.Assign(Value);
end;
procedure TMyControl.Paint;
begin
// use MyFont as needed...
end;
..或執行一個'CM_FONTCHANGED'來達到同樣的效果。 –
@SertacAkyuz:''TControl.Font'屬性被改變時(使用'OnChange'處理程序來觸發對控件的重繪),'CM_FONTCHANGED'被使用。對於基於自定義'TFont'的屬性,你必須手動掛接他們的'OnChange'事件,不應該發出'CM_FONTCHANGED',直接觸發重繪。 –
@Remy - 你必須爲'OnChange'設置一個處理程序,我沒有說過。在處理程序中,您可以執行「CM_FONTCHANGED」 - 它將使控件失效。沒有理由不在'OnChange'處理程序中發出'CM_FONTCHANGED',相反它更好*。如果'TControl.CMFontChanged'的實現發生變化,則不需要重新調整。它也是*更好的*因爲消息路由本質上是可覆蓋的 - 例如見'TWinControl.CM_FONTCHANGED'。 –
你已經得到控制具有字體屬性,你只需要發佈它。有關示例,請參閱TSpeedButton。 –