【问题标题】:Is there a way to temporarily suspend VCL styles when redrawing a form?有没有办法在重绘表单时暂时暂停 VCL 样式?
【发布时间】:2019-07-25 17:54:28
【问题描述】:

我正在使用这款旧版 Delphi 应用程序,该应用程序可以通过 VCL 样式获得更现代的外观。一种形式导致了性能问题。

此问题表单根据规范动态创建控件。不仅如此,它还不会一次创建所有控件。它有一个分层组织,控件绘制在组框上,单击复选框或单选按钮可以创建一个新的嵌套组框,其中包含新控件。至少在某些时候,表单上的所有控件都会保存它们的状态、删除它们,然后重新创建它们并恢复它们的状态。这适用于老式(想想 Windows NT 3.51)控件,但是当添加 VCL 样式时,此表单可能需要一分钟以上的时间来重绘自身。

我认为正在发生的事情是样式导致了遗留表单绘制代码正在响应的 Windows 事件,导致它重复它已经完成的事情。我想知道是否有办法暂时关闭样式以允许此表单在应用样式所做的任何更改之前完全绘制自己。

我注定要失望吗?

编辑:这是使用 Delphi XE3。

【问题讨论】:

  • 几乎不可能在没有细节的情况下说出任何有用的东西。我们需要代码和特定的版本号。创建minimal reproducible example
  • 问题是“有没有办法暂时阻止 VCL 样式做它的事情”,而不是请求帮助理解代码在做什么。
  • 答案是肯定的,这对您有帮助吗?我不这么认为。几乎可以肯定,您的问题的解决方案与您的想象不同。但是,嘿,祝你好运!

标签: delphi vcl-styles vcl-styles.-utils


【解决方案1】:

使用Vcl.Themes.TStyleManager 切换要使用的样式,Windows(表示正常样式)或您在以下测试代码中选择的Vcl style

uses ..., Vcl.Themes;

TForm11 = class(TForm)
// ... 
private
  StylesDisabled: boolean;
// ...
end;

procedure TForm11.Button1Click(Sender: TObject);
begin
  StylesDisabled := not StylesDisabled;

  if StylesDisabled then
    TStyleManager.SetStyle('Windows')
  else
    TStyleManager.SetStyle('Amethyst Kamri');
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多