Delphi Ownerdraw VCL网格未拾取VCL样式的预期选定颜色

Delphi Ownerdraw VCL网格未拾取VCL样式的预期选定颜色,delphi,vcl-styles,Delphi,Vcl Styles,我们的产品使用一个所有者绘制网格(TStringGrid)——我们在其中绘制所有网格。我试图使这方面成为应用程序使用的VCL样式。大多数都可以,但当我尝试为网格选择颜色时,它要么是黑色(当使用的样式已经是黑色时就不太好了),要么是看似随机的渐变。这是我用来获取所选颜色的代码(可能是我使用了错误的元素或ElementColor来获取所需的颜色) 任何帮助都将不胜感激。谢谢并非所有的TElementColor(ecBorderColor、ecFillColor、eCExtColor,…)都是为所有可

我们的产品使用一个所有者绘制网格(TStringGrid)——我们在其中绘制所有网格。我试图使这方面成为应用程序使用的VCL样式。大多数都可以,但当我尝试为网格选择颜色时,它要么是黑色(当使用的样式已经是黑色时就不太好了),要么是看似随机的渐变。这是我用来获取所选颜色的代码(可能是我使用了错误的元素或
ElementColor
来获取所需的颜色)


任何帮助都将不胜感激。谢谢

并非所有的
TElementColor
(ecBorderColor、ecFillColor、eCExtColor,…)都是为所有可能的
TThemedElementDetails
定义的,因此您必须始终检查
GetElementColor
函数返回的布尔结果

如果结果为false,则表示未定义颜色。在您的情况下,当元素被选中时,没有为
ecFillColor
定义颜色值

尝试此示例,它使用
tgclassccellselected
元素,如果不存在,则使用活动VCL样式的高亮颜色

if not StyleServices.GetElementColor(StyleServices.GetElementDetails(tgClassicCellSelected), ecFillColor, AColor) then
 AColor := StyleServices.GetSystemColor(clHighlight);

并非所有的
TElementColor
(ecBorderColor、ecFillColor、ecTextColor,…)都是为所有可能的
TThemedElementDetails
定义的,因此您必须始终检查
GetElementColor
函数返回的布尔结果

如果结果为false,则表示未定义颜色。在您的情况下,当元素被选中时,没有为
ecFillColor
定义颜色值

尝试此示例,它使用
tgclassccellselected
元素,如果不存在,则使用活动VCL样式的高亮颜色

if not StyleServices.GetElementColor(StyleServices.GetElementDetails(tgClassicCellSelected), ecFillColor, AColor) then
 AColor := StyleServices.GetSystemColor(clHighlight);

我尝试过将其设置为每种类型的元素,并按照您的建议选择了
tgFixedCellNormal
。后退也是一个很好的方法。(再次感谢)我尝试过将其设置为每种类型的元素,并按照您的建议选择了
tgFixedCellNormal
。后退也是一个很好的方法。谢谢(再次)