【问题标题】:Changing VCL Styles on runtime在运行时更改 VCL 样式
【发布时间】:2014-07-22 11:08:48
【问题描述】:

我正在使用 Delphi XE5。我想将 VCL 样式添加到我的一个项目中,但遇到了问题。设置新的 vcl 样式后,所有句柄都会更改。例如,如果已经有项目并且如果我有活动的 tcp 套接字,那么我对 listview 有问题,它们不再工作了。我需要重新启动应用程序并在启动时选择样式,或者我需要重新创建所有内容,但这很烦人。我现在无法粘贴任何代码,因为我不在我的开发电脑上。不过相信你也遇到过这个问题吧?

谁能告诉我在运行时更改 vcl 样式的最佳和最安全的方法?

谢谢

【问题讨论】:

  • 这是您不应该将数据与 UI 控件绑定的另一个原因。如果你有一个集合并在虚拟模式下使用列表视图,你就不会有这样的问题。
  • 但是套接字呢?
  • 有关套接字的信息与列表视图项无关。有些数据直接存储到项目中,不是吗?拥有像TList<TSocketInfo> 这样的集合将解决这个问题,无论TSocketInfo 包含什么(它可能包含对列表视图的引用,或者如果您的视图显示每个项目的连接,则有关套接字的信息)。
  • @TLama Windows 异步套接字接收 Windows 消息。为此,他们需要一个窗口句柄。使用可重新创建的窗口句柄是一种常见的故障模式。
  • @David,所以您认为 OP 子类化列表视图可以从异步套接字接收消息? blacksun,你使用的底层设计是什么?

标签: delphi styles vcl


【解决方案1】:

在运行时更改 VCL 样式会导致重新创建窗口。你对此无能为力。此外,窗口重建是 VCL 的现实之一。当某些其他事件导致 VCL 窗口重新创建时,您的程序可能会在其他时间面对它。因此,您的问题与 VCL 样式并不直接相关。相反,您的问题是您使用的套接字通信窗口句柄的生命周期比它们需要的短。

解决方案是使用您可以控制其生命周期的窗口句柄。使用AllocateHWnd 创建这样的窗口句柄。

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多