【问题标题】:TStyleManager.SetStyle leaves visual components on other TPageControls not visibleTStyleManager.SetStyle 使其他 TPageControls 上的可视组件不可见
【发布时间】:2012-01-04 04:53:51
【问题描述】:

我的应用调用中的 MainMenu 选项:

    TStyleManager.SetStyle('Ruby Graphite');

它几乎在任何地方都能正确更改我的 XE2(更新 3)应用程序中的样式。问题来了:

我有一个带有 3 个 TabSheets 的 TPageControl,每个 TabSheets 都包含一个 TFrame。上述调用正确地将 当前可见 TabSheet 的组件的样式更改为“Ruby Graphite”。

但是,当我单击以切换到 另一个 选项卡表时,它的所有组件都是不可见的,直到我将鼠标移到它们上方。当我返回到原来的 TabSheet 时,它的组件现在也是不可见的,直到我将鼠标悬停在它们上面。

我尝试在框架本身上显式调用 .Refresh 和 .Repaint,但这并没有使它们上的组件可见。

奇怪的是执行:

    TStyleManager.SetStyle('Windows');

将样式返回标准,所有组件都可见。

TTabSheet 位于面板上的面板上,如果这很重要的话。而且,我正在使用一些线程化的第 3 方组件(不在这些框架中)。我相信我已经禁用了它们。

关于如何在从 Windows 更改样式后强制以前隐藏的选项卡上的可视组件变为可见的任何建议?

编辑:链接到显示刷新问题的短屏视频:http://tinyurl.com/sostyle

我有时还发现单击右上角的图标(如最大化)时,软件没有响应。有一些奇怪的事情发生在我的头上。到目前为止,我还无法从应用程序的 40,000 行代码中将其归结为一个小例子。

【问题讨论】:

  • 我无法重现您的问题,您能否提供有关如何将框架附加到标签页的更多信息?或者也许提供一个最小的代码来重现这个问题?
  • 我无法在一个小的独立程序中重现它。它只发生在我的大型应用程序中,很难剥离。我会继续努力的。谢谢你的尝试,RRUZ。万一看到它以任何方式发生,这里有一个简短的屏幕记录:tinyurl.com/sostyle

标签: delphi


【解决方案1】:

这是一个在 Delphi XE4 上对我有用的解决方案和尝试方向。

我发现,当我最小化设置为使用 TStyleManager 并在应用程序执行期间动态设置样式的表单时,我会遇到同样的问题。

我注意到除了重绘问题之外的另一个问题是,当表单从最小化到任务栏或托盘图标恢复时,表单样式未设置为相当大的问题。相当大的表单边框问题和重绘问题似乎是联系在一起的。

通过为 TrayIcon 组件的 OnClick 事件添加事件处理程序并为使用 TStyleManager 的表单调用 RecreateWnd,我克服了重绘问题和边框大小调整问题。

目前看起来是这样的,jtiApp 组件是一个 TJvTrayIcon 组件:

procedure TMainForm.jtiAppClick(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if not Visible then
  begin
    WindowState := wsNormal;
    RecreateWnd;
    Show;
  end;
end;

这似乎解决了重绘问题和重新创建表单的边框设置。我不确定这是 JVCL 问题还是 TStyleManager 问题,但当它是通过 TrayIcon 组件处理从托盘恢复的问题时,该修复有效。

我希望这对您和其他查看此解决方案的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多