gpt4 book ai didi

delphi - VCL 样式随机中断

转载 作者:行者123 更新时间:2023-12-03 14:43:54 27 4
gpt4 key购买 nike

我有一个源自 TMemo 的控件。它工作得很好,直到我第一次使用 Delphi XE7 VCL Styles。在Delphi XE7下,样式不应用于控件的滚动条。如果使用深色主题/风格,看起来很糟糕,而滚动条是银色的。

bug

尝试创建一个可以重现错误的最小项目,我发现了一些非常有趣的东西:添加/删除随机代码行(或 DFM 控件),将使错误出现/消失。

问题:到底是什么导致了这种奇怪的行为以及如何解决它?

源代码在这里:

http://s000.tinyupload.com/index.php?file_id=24129853712119260018

最佳答案

为自定义类注册 StyleHook 解决了问题:

  TMyMemo = class(TMemo)
strict private
class constructor Create;
class destructor Destroy;
end;

class constructor TMyMemo.Create;
begin
TCustomStyleEngine.RegisterStyleHook(TMyMemo, TMemoStyleHook);
end;

class destructor TMyMemo.Destroy;
begin
TCustomStyleEngine.UnRegisterStyleHook(TMyMemo, TMemoStyleHook);
end;

TStyleEngine.HandleMessage 函数中存在错误,特别是在尝试找到适当的 StyleHook 类来处理消息的部分

if RegisteredStyleHooks.ContainsKey(Control.ClassType) then
// The easy way: The class is registered
LStyleHook := CreateStyleHook(RegisteredStyleHooks[Control.ClassType])
else
begin
// The hard way: An ancestor is registered
for LItem in RegisteredStyleHooks do
if Control.InheritsFrom(LItem.Key) then
begin
LStyleHook := CreateStyleHook(Litem.Value);
Break;
end;

如果为确切的类注册了StyleHook,那么就没有问题,并且将返回适当的StyleHook类。然而,“艰难之路”部分是有缺陷的。它将尝试查找已注册 StyleHook 的类祖先。但它会返回它遇到的第一个祖先。如果它首先找到 TEditStyleHook(为 TCustomEdit 类注册),它将使用该类而不是 TMemoStyleHook。由于 TEditStyleHook 不知道如何处理滚动条问题的出现。

错误行为的随机性是由于 RegisteredStyleHooks 的存储方式造成的。它们存储在字典中,其中键为TClass。顺序由 TClass 哈希确定,该哈希基本上是指向类信息的指针,并且可以随着代码的更改而更改。

问题报告为 RSP-10066并且有一个复制它的附加项目。

借助以下代码,可以轻松查看当您添加/删除代码和/或其他控件时注册类的顺序如何变化。

type
TStyleHelper = class(TCustomStyleEngine)
public
class function GetClasses: TArray<TClass>;
end;

class function TStyleHelper.GetClasses: TArray<TClass>;
begin
Result := Self.RegisteredStyleHooks.Keys.ToArray;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
LItem: TClass;
Classes: TArray<TClass>;
begin
Classes := TStyleHelper.GetClasses;
for LItem in Classes do
MyMemo1.Lines.Add(LItem.ClassName);
end;

关于delphi - VCL 样式随机中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28463556/

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