【问题标题】:How to disable events when runtime Delphi VCL Style changes如何在运行时 Delphi VCL 样式更改时禁用事件
【发布时间】:2016-11-29 06:09:00
【问题描述】:

我想在我的应用程序中使用 VCL 样式。 我在事件 OnShow、OnResize 中有一些代码...

当更改样式触发其他表单事件时。(FormShow, FormResize)

如何在更改样式时禁用事件。

为了改变风格,我使用代码:

TStyleManager.TrySetStyle(cbStyles.Items[cbStyles.ItemIndex], True);

示例代码:

procedure TForm1.AddLog(AMsg: String);
begin
  if cbEnableLog.Checked
  then  Memo1.Lines.Append(AMsg);
end;

procedure TForm1.bChangeClick(Sender: TObject);
begin
  TStyleManager.TrySetStyle(cbStyles.Items[cbStyles.ItemIndex],True);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  AddLog('FormResize');
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  AddLog('FormShow');
end;

【问题讨论】:

  • 没有自动的方法可以做到这一点。你必须自己编码。通过测试您设置的布尔值,让您的所有事件尽早退出。

标签: delphi delphi-xe3 vcl-styles


【解决方案1】:

声明一个布尔变量 f.ex。 InStyleChange: boolean;。在调用 TStyleManager.TrySetStyle() 之前将其设置为 True,然后立即重置为 False

在您想要绕过事件的所有事件处理程序中编写如下代码:

procedure TForm1.FormResize(Sender: TObject);
begin
  if InStyleChange then exit;
  AddLog('FormResize');
end;

【讨论】:

  • 当我使用这样的代码时。它运行了几次。然后在我的应用程序中引发异常。
  • @zgn,什么类型的异常?如果您在TrySetStyle 之前和之后登录,以后会有事件吗?
  • @zgn 此答案中建议的更改不会导致您描述的行为。不要指望我们调试我们看不到的东西。是时候学习调试自己的代码了。
  • @LU-RD 异常是:创建 Windows 设备上下文时出错。谢谢。
  • 使用您为两个事件处理程序显示的代码,我建议的修改不可能是异常的原因。显示引发异常的事件处理程序的真实完整代码
猜你喜欢
  • 2016-03-20
  • 1970-01-01
  • 2012-08-25
  • 2012-01-25
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多