我有一个表单,你可以假装它像Windows资源管理器一样:
客户面板
+------------+#+-----------------------+
| |#| |
| |#| |
| |#| |
| |#| |
| Left |#| Client |
| |#| |
| |#| |
| |#| |
| |#| |
| |#| |
+------------+#+-----------------------+
^
|
+----splitter
左侧和客户区面板每个都有丰富的控件。
问题是使用分离器非常缓慢。我希望现代的2 GHz计算机可以像人类可以快速移动鼠标那样快速地重新显示表格。但事实并非如此,在完全重新调整表单之前需要大约200-300毫秒。
表单上有大约100个可视控件,没有代码或自定义控件。
我如何追踪谁是导致迟缓的原因?
答案 0 :(得分:4)
我建议您暂停重新绘制2个面板,只要分割器正在移动,或者使用特定值(例如50px)重新绘制。
答案 1 :(得分:4)
使用分析器。 Eric Grange的Sampling Profiler很好。 AutomatedQA的AQtime非常出色。
这很可能是由于控件调整其布局和大小而重复调整大小和重新绘制。一般来说,大量嵌套或大量控制都会导致问题。您可以通过覆盖AlignControls
来避免这种情况,并且每次分割器移动时只调整一次对齐,但这将涉及相当多的工作。
或者,TSplitter具有ResizeStyle
属性,该属性控制控件是立即移动还是对表单进行异或,并且控件仅在结束时更新。视觉上并不好,但工作量却少得多。
答案 2 :(得分:1)
制作表单的测试版本,删除所有控件,只留下面板和分割器。看看性能是否仍然低迷。
在调整大小事件中放置一些非阻塞消息(到文件,控制台调试器,gexperts调试器)。你会得到一些,如你所料,还是几十个?
左侧面板和分割器应该对齐alLeft,另一个是alClient。
答案 3 :(得分:1)
这主要是由于重复那些许多控件的事件
您可以尝试在表单中禁用背景颜料(减少颜料数量):
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
...
procedure TfrmBaseMain.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result := 1;
end;