2016-05-18 36 views
3

在Delphi 7中,從TGraphicControl下降一個新組件,並添加一個TFont屬性,實現paint方法以使用TFont屬性編寫一些字符串。安裝組件。如何響應Delphi中對象屬性字段的變化

在設計時,當您使用屬性對話框更改TFont屬性時,它將立即反映在您的組件中。但是,如果更改TFont的各個屬性(如ColorSize),則只有在將鼠標懸停在其上後,纔會重新繪製組件。

如何正確處理對象屬性字段中的更改?

+0

你已經得到控制具有字體屬性,你只需要發佈它。有關示例,請參閱TSpeedButton。 –

回答

4

將事件處理程序分配給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; 
+0

..或執行一個'CM_FONTCHANGED'來達到同樣的效果。 –

+1

@SertacAkyuz:''TControl.Font'屬性被改變時(使用'OnChange'處理程序來觸發對控件的重繪),'CM_FONTCHANGED'被使用。對於基於自定義'TFont'的屬性,你必須手動掛接他們的'OnChange'事件,不應該發出'CM_FONTCHANGED',直接觸發重繪。 –

+0

@Remy - 你必須爲'OnChange'設置一個處理程序,我沒有說過。在處理程序中,您可以執行「CM_FONTCHANGED」 - 它將使控件失效。沒有理由不在'OnChange'處理程序中發出'CM_FONTCHANGED',相反它更好*。如果'TControl.CMFontChanged'的實現發生變化,則不需要重新調整。它也是*更好的*因爲消息路由本質上是可覆蓋的 - 例如見'TWinControl.CM_FONTCHANGED'。 –

相關問題