2013-12-16 30 views
2

Delphi XE2如何在運行時和在Delphi中設計時間的單身人士

我是組件開發新手。

我有一個單獨的類「TThemeManager」,它擁有我在應用程序中使用的托盤顏色的集合。只有一個ThemeManager是整個應用程序所必需的,只有一個主題被使用,有一種方法來定義它。

這個類是在聲明它放在一個全局變量單元的初始化部分創建:

var 
    NaharThemeManager: TNaharThemeManager; 

implementation 

...

initialization 
    if Not Assigned(NaharThemeManager) then 
    NaharThemeManager := TNaharThemeManager.Create; 

即應用正常工作,它始終是可用。

然後我創建了一些組件,使用Delphi嚮導,沒有什麼特別的,我只添加了一個屬性,我可以從當前主題中選擇該組件的顏色。

TNaharWEBPanel = class(TPanel) 
    private 
    private 
    FThemeColor : TNaharPalleteColor; 
    procedure OnObserver(Sender: TObject; AParam, AValue: Variant); 
    procedure UpdateColor; 
    procedure SetColor(const Value: TNaharPalleteColor); 
    protected 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    published 
    property ThemeColor: TNaharPalleteColor read FThemeColor write SetColor default npcMainColor; 
    end; 

設置主題顏色時:

procedure TNaharWEBPanel.SetColor(const Value: TNaharPalleteColor); 
begin 
    FThemeColor := Value; 

    UpdateColor; 
end; 

procedure TNaharWEBPanel.UpdateColor; 
begin 
    if FThemeColor <> npcNone then 
    begin 
    Color := NaharThemeManager.CurrentPallete.Color[FThemeColor]; 

    Font.Color := NaharThemeManager.CurrentPallete.HighContrast(FThemeColor); 
    end; 
end; 

這NaharThemeManager是單例類。或者應該是。但是,如果我把這樣幾個面板,他們不使用相同的單身人士。它似乎每個組件都有一個。我不知道如何調試這個,所以我只能看到問題的證據

當我的應用程序運行單例在我的組件和應用程序中是不一樣的。

我必須做什麼trully只有一個這個對象的單身?

+0

您**正在創建和使用單身人士,爲什麼您認爲每個面板都使用不同的經理實例?你如何檢查?你所描述的只有當你的項目在內存中有多個管理員單元實例時纔可能,並且在正常情況下這是不可能的,否則你會得到一個「重複單元」異常。 –

+0

我在我的單例中有一個AddObserver,其中每個可視組件調用ThemeManager.AddObserver(self)。因此,如果主題被改變,單身人士將通知所有組件。我創建了一個非可視組件來顯示關於這個單例的信息,並且我已經放置了一個已發佈的屬性來顯示添加到單例中的觀察者的數量,它只顯示1.如果我改變主題(通過這個非可視化組件),只有一個面板通知通知並更改其顏色。我在同一個TFrame上有很多面板,都應該得到通知。 –

+2

既然你沒有顯示任何代碼,我只能假設你的觀察者邏輯可能有一個錯誤,例如,如果它只保留一個註冊的觀察者,並丟棄其他人。如果您需要幫助,請提供[SCCCE](http://sscce.org),以顯示您所做的一切。 –

回答

3

您正在創建和使用單例,因此每個面板都應該使用同一個管理器實例。你所描述的只有當你的項目在內存中有多個管理員單元實例時纔可能,並且在正常情況下這是不可能的,否則你會得到一個「重複單元」異常。

更可能的罪魁禍首是你的觀察者邏輯有一個錯誤,如果它只保留一個註冊觀察者並丟棄其他人。