gpt4 book ai didi

delphi - 如何使Singleton在Delphi中的运行时和设计时有效

转载 作者:行者123 更新时间:2023-12-03 18:31:57 24 4
gpt4 key购买 nike

德尔福XE2

我是组件开发的新手。

我有一个单例类“ 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是单例类。还是应该的。但是,如果我这样放置多个面板,则它们不会使用相同的单例。似乎每个组件都有一个。我不知道如何调试它,所以我只能看到问题的证据

而且,当我让应用程序运行时,在我的组件和应用程序中,单例操作并不相同。

我该怎么做才能使这个对象只有一个单例?

最佳答案

您正在创建和使用单例,因此每个面板应使用同一管理器实例。仅当您的项目在内存中具有经理单位的多个实例时,您描述的内容才可能实现,而在正常情况下则不应该这样做,否则您将引发“重复单位”异常。

更有可能的罪魁祸首是您的观察者逻辑中存在一个错误,例如,如果它仅保留一个注册的观察者而丢弃了其他观察者,则该错误。

关于delphi - 如何使Singleton在Delphi中的运行时和设计时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20617751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com