Delphi 无法获取选定的VCL主题样式

Delphi 无法获取选定的VCL主题样式,delphi,vcl-styles,delphi-10.1-berlin,Delphi,Vcl Styles,Delphi 10.1 Berlin,在Delphi 10.1 Berlin VCL应用程序中,在外观页面的项目选项中,我向默认的窗口样式添加了两种样式: 在FormShow事件处理程序中,我有以下代码: procedure TForm1.FormShow(Sender: TObject); var s: string; begin // Show all available in application styles: ComboBox1.Items.BeginUpdate; try ComboBox1.

在Delphi 10.1 Berlin VCL应用程序中,在外观页面的项目选项中,我向默认的窗口样式添加了两种样式:

FormShow
事件处理程序中,我有以下代码:

procedure TForm1.FormShow(Sender: TObject);
var
  s: string;
begin
  // Show all available in application styles:
  ComboBox1.Items.BeginUpdate;
  try
    ComboBox1.Items.Clear;
    for s in TStyleManager.StyleNames do
      ComboBox1.Items.Add(s);
    ComboBox1.Sorted := True;
    ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(TStyleManager.ActiveStyle.Name);
  finally
    ComboBox1.Items.EndUpdate;
  end;
end;
但不幸的是,在运行时,组合框只包含一个项:默认的Windows样式:


那么,如何在项目选项中检查所有样式呢?

TStyleManager
Vcl.Themes
中的一个类(包含在单元的
uses
子句中),并且问题中的代码示例不会产生任何编译器错误,
TStyleManager.StyleNames
没有给出正确的结果:它没有返回在“项目选项”对话框中激活的其他VCL样式

要使
TStyleManager.StyleNames
实际工作,项目文件(.DPR)的
uses
子句中必须包含
Vcl.Themes
Vcl.Styles
。(我不确定文件中是否提到了这一点)


我的测试已经证实了这一点。感谢@Uwe Raabe的建议

你的代码非常适合我。我在组合框中看到所有三种样式名称。我看到的唯一区别是在外观对话框的屏幕盖上;在我的列表中,当我下拉列表时,它是按字母顺序排序的,而你的不是。(事实上,这不正确;如果我退出对话框并返回,它们将再次被取消排序并与您的匹配。)是否有其他选项来激活/注册VCL样式?没有。我正在设置一台新机器,因此我在一个漂亮、干净的柏林安装上进行了测试。你绝对没有什么特别需要做的。(实际上,我复制并粘贴了您的代码,除了在表单上删除组合框并将Vcl.Themes添加到uses子句之外,我没有做其他任何事情。)您需要在dpr uses部分中使用Vcl.Themes和Vcl.style。嗯,至少在您选择非Windows Themes.BTW时IDE包括了这一点,不幸的是,“模态”错误仍然没有修复:当在模态对话框中更改VCL样式时,该对话框将丢失其模态!