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只有一個這個對象的單身?
您**正在創建和使用單身人士,爲什麼您認爲每個面板都使用不同的經理實例?你如何檢查?你所描述的只有當你的項目在內存中有多個管理員單元實例時纔可能,並且在正常情況下這是不可能的,否則你會得到一個「重複單元」異常。 –
我在我的單例中有一個AddObserver,其中每個可視組件調用ThemeManager.AddObserver(self)。因此,如果主題被改變,單身人士將通知所有組件。我創建了一個非可視組件來顯示關於這個單例的信息,並且我已經放置了一個已發佈的屬性來顯示添加到單例中的觀察者的數量,它只顯示1.如果我改變主題(通過這個非可視化組件),只有一個面板通知通知並更改其顏色。我在同一個TFrame上有很多面板,都應該得到通知。 –
既然你沒有顯示任何代碼,我只能假設你的觀察者邏輯可能有一個錯誤,例如,如果它只保留一個註冊的觀察者,並丟棄其他人。如果您需要幫助,請提供[SCCCE](http://sscce.org),以顯示您所做的一切。 –