TStyleManager.SetStyle在其他TPageControls上留下不可见的可视组件

时间:2012-01-04 04:53:51

标签: delphi

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

    TStyleManager.SetStyle('Ruby Graphite');

它几乎可以在任何地方正确更改我的XE2(Update 3)应用程序中的样式。这是问题所在:

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

但是,当我点击切换到另一个标签页时,所有组件都是不可见的,直到我将鼠标移到它们上面。当我返回到原始的TabSheet时,它的组件现在在我将鼠标悬停在它们之上时才可见。

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

执行时有点奇怪:

    TStyleManager.SetStyle('Windows');

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

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

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

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

我还偶尔发现,当点击右上角的图标(如最大化)时,软件没有响应。我脑子里只有一些奇怪的东西。到目前为止,我无法将其归结为应用程序中40,000行代码中的一个小例子。

1 个答案:

答案 0 :(得分:0)

这是一个解决方案,并尝试在Delphi XE4上为我工作。

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

除了重绘问题之外,我注意到的另一个问题是,当表单从最小化恢复到任务栏或trayicon时,表单样式没有被设置为相当大。相当大的表格边框问题和重绘问题似乎是相互关联的。

通过为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组件从托盘恢复时,该修复工作正常。

我希望这有助于您的问题以及其他查看此解决方案的人。