2016-04-15 110 views
-1

我怎樣才能動態值,我的組件的屬性變量德爾福組件屬性動態值

在我的部分,我有一個名爲ColorDefault領域,我希望能夠在程序中動態設置它的值。

原始代碼

var // global 
    _V_TB_DefaultColor: TColor 

type 
    TMyClass = class 
    ... 
    property ColorDefault: tcolor read _V_TB_DefaultColor write FDefaultColor; 
    //[dcc32 Error] MyButton.pas(85): E2168 Field or method identifier expected 
    ... 
    end; 

編輯:

我照下面所描述的湯姆但顏色沒有改變根據全局變量,顏色停留當它遵守作爲例如我的全球顏色是clyellow,我遵守我的組件,並將其放在窗體上,之後我將全局顏色變量更改爲clwhite,當我運行該程序時,它仍然是clyellow

type 
    TTestClass = class(TPanel) 
    private 
    { Private declarations } 
    protected 
    { Protected declarations } 
    FColorDefault:tcolor; 
    public 
    { Public declarations } 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    function GetGlobalColorVariable:TColor; 
    published 
    { Published declarations } 
    property DefaultColor:TColor read GetGlobalColorVariable write FColorDefault; 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('MyComponents', [TTestClass]); 
end; 


constructor TTestClass.Create(AOwner: TComponent); 
begin 
    ColorInitiate; 
    inherited; 
    color:=DefaultColor; 
end; 

destructor TTestClass.Destroy; 
begin 
    inherited; 
end; 

function TTestClass.GetGlobalColorVariable: TColor; 
begin 
    result:=_V_TB_DefaultColor; 
end; 

end. 
+0

沒有多大意義在'FDefaultColor'字段中,如果你想從另一個變量 – MBo

+0

中讀取屬性值,我看不到'ColorDefault'的任何屬性聲明,也沒有'_V_TB_DefaultColor'的任何聲明。請與您的標識符一致。這個問題與你最初提出的問題不同,並且變得一團糟。你讀過關於房產的文檔嗎?如果你想改變一個屬性,你必須爲它分配一個新的值。 –

+0

如果您希望'ColorDefault'屬性發生變化,只需更改'_V_TB_DefaultColor',答案是否定的,否則不會發生,不存在這樣的automagic。我在我的回答中添加了一段關於此的內容。 –

回答

0

看着你的問題,似乎你正在處理兩個問題。

第一個問題是如何使用屬性訪問某個全局​​變量。

可以使用你的財產的getter方法,像這樣做:

type 
    TTestClass = class(TPanel) 
    private 
    { Private declarations } 
    protected 
    { Protected declarations } 
    public 
    { Public declarations } 
    constructor Create(AOwner: TComponent); override; 
    function GetDefaultColor: TColor; 
    published 
    { Published declarations } 
    property DefaultColor: TColor read GetDefaultColor; 
    end; 

var // global 
    _V_TB_DefaultColor: TColor 

implementation 

function TTestClass.GetGlobalColorVariable: TColor; 
begin 
    result := _V_TB_DefaultColor; 
end; 

這就像你在你的問題編輯一樣。這將使您的DefaultColor屬性返回與存儲在全局_V_TB_DefaultColor變量中相同的值。

但請注意,當_V_TB_DefaultColor變量發生變化時,這不會檢測到。所以如果你想在更改後更新你的組件,你需要爲它們自己執行一些更新過程。

還要記住,使用這樣的全局變量不是一個好習慣。

如果您希望所有組件的某些屬性具有相同的值,那麼將該屬性聲明爲類屬性會更好,如下面的代碼所示。

type 
    TTestClass = class(TPanel) 
    private 
    { Private declarations } 
    class var FDefaultColor: TColot; 
    protected 
    { Protected declarations } 
    public 
    { Public declarations } 
    constructor Create(AOwner: TComponent); override; 
    class function GetDefaultColor: TColor; 
    published 
    { Published declarations } 
    class property DefaultColor: TColor read FDefaultColor write FDefaultColor; 
    end; 

現在在一個組件中更改DefaultColor將更改同一類的所有組件的DefaultColor。但請記住,您仍然必須爲每個組件執行適當的過程來自行更新。這不會自動完成。


現在你的第二個問題是檢測DefaultColor變量的變化並相應地更新你的組件。

現在,如果使用全局變量,那麼就沒有機制來檢測這個。但是,如果您使用的是類過程,那麼您至少可以編寫一個setter方法,它將執行需要更新的所有組件的更新方法,或者向它們發送必要的通知,以便它們可以自行執行必要的更新。

如何實現這個?

一種方法是循環檢查所有窗體組件的類型並執行必要的更新過程。但是,如果您有許多其他組件需要檢查它們是否正確,那可能會很慢。

另一個可能更好的方法是將您的組件添加到單獨的列表中,因此您不需要進行類型檢查,因爲您知道此列表僅包含正確的組件。

+0

謝謝,通過你的解釋,我得到了關於如何在自定義組件中使用全局變量以及如何在組件上使用全局變量的想法,我必須使用funcitons來獲取全局變量的值, (在運行時)被通知/應用新的值,當全局變量的值改變時,我必須使用觸發器 –

0

您neeed審查文檔中關於性能 http://docwiki.embarcadero.com/RADStudio/XE7/en/Properties

您的代碼

property ColorDefault:tcolor read _V_TB_DefaultColor write FDefaultColor; 

不是由編譯器獲得批准,因爲_V_TB_DefaultColor不是字段或類的方法。該物業或許應該被聲明爲:

property ColorDefault:tcolor read FDefaultColor write FDefaultColor; 

要設置FDefaultColor等於全局變量_V_TB_DefaultColor你需要

MyClass.ColorDefault := _V_TB_DefaultColor; 

在一個合適的地方在你的代碼,f.ex在類的構造函數。

請注意,要更改組件的顏色,您需要爲ColorDefault屬性指定一個新值。更改全局變量_V_TB_DefaultColor的值不會自動更改該屬性的值。


在你修改後的代碼,你加入

function TTestClass.GetGlobalColorVariable: TColor; 
begin 
    result:=_V_TB_DefaultColor; 
end; 

,如果你不分配的功能的東西的結果是什麼都不會做。由於該功能是TTestCalss成員,我相信你想 直接在此功能設置Color屬性:

function TTestClass.GetGlobalColorVariable: TColor; 
begin 
    Color:=_V_TB_DefaultColor; 
end; 

如果是這樣的話,你可以將它,因爲你不使用的返回值更改爲procedure

procedure TTestClass.GetGlobalColorVariable; 
begin 
    Color:=_V_TB_DefaultColor; 
end; 
+0

@Tom Brunberg關於'automagically change' - 我們可以把'Get readDefaultColor'當作自動切換,其中'GetDefaultColor'是讀取全局變量的函數。但'FDefaultColor'字段變得毫無用處。 – MBo

+0

@MBo是的,但吸氣劑仍然必須被觸發。改變全球不會那樣做。 –

+0

@Tom Brunberg目前還不清楚他是否使用FDefaultColor字段。如果沒有,吸氣劑可能會有所幫助。 – MBo

-1

感謝大家,

與所有建議,我要做的就是用一個函數來獲取從全局變量的值,並使用Windows消息作爲觸發新的價值觀適用於組件