我的程序界面控件非常多,刚开始用时还好一点,接着越用越卡,卡到用鼠标点击一个控件时,可以清楚的看到控件对齐线缓缓的显示出来,又缓缓的消失。两三秒才响应过来,再用一会,报错,IDE自动关闭。我现在一般都是用一个小时左右,关闭IDE重启接着做。
最小化再恢复窗口时,里面的每个控件都是先一团黑,然后一个一个慢慢的显示出原样,有时候最小化再恢复可能都要好几秒才能完成显示。这个问题就连编译后的 exe 运行起来也是这样。网上说的什么双缓冲,不但一点用没有,就连在设计时期的界面上都显示的一团糟。网上还有一段下面的代码说可以解决编译后 exe 的闪烁问题:private
procedure CreateParams(var Params: TCreateParams); override;
procedure TFrm_Main.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := 33554432; //0x 02 00 00 00
end; 这段代码可以解决刚show出窗体时的闪烁问题,但当窗体最小化再恢复时就没有效果了。我估计是每次最小化再恢复时,Delphi 都会对窗体进行重绘。
这问题只有D7不会,2010以上版本好像都会,反正我是从 XE2 开始用到现在的 Delphi 10 seattle ,这个问题一直都存在。 试过重装系统,重装 Delphi ,没一点用。百度了一下,好像基本没人说起这个问题,难道没人有这样的问题吗? 不会吧..
最小化再恢复窗口时,里面的每个控件都是先一团黑,然后一个一个慢慢的显示出原样,有时候最小化再恢复可能都要好几秒才能完成显示。这个问题就连编译后的 exe 运行起来也是这样。网上说的什么双缓冲,不但一点用没有,就连在设计时期的界面上都显示的一团糟。网上还有一段下面的代码说可以解决编译后 exe 的闪烁问题:private
procedure CreateParams(var Params: TCreateParams); override;
procedure TFrm_Main.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := 33554432; //0x 02 00 00 00
end; 这段代码可以解决刚show出窗体时的闪烁问题,但当窗体最小化再恢复时就没有效果了。我估计是每次最小化再恢复时,Delphi 都会对窗体进行重绘。
这问题只有D7不会,2010以上版本好像都会,反正我是从 XE2 开始用到现在的 Delphi 10 seattle ,这个问题一直都存在。 试过重装系统,重装 Delphi ,没一点用。百度了一下,好像基本没人说起这个问题,难道没人有这样的问题吗? 不会吧..
很遗憾,还是会出现这个问题,看来不是硬件问题。
type
TWindowControlClass = class of TWinControl;
const
ObjList: array[0..11] of TWindowControlClass = (
TButton, TButton, TButton,
TCheckBox, TCheckBox, TCheckBox,
TEdit, TEdit, TEdit,
TRadioButton, TRadioButton, TRadioButton);
var
i, j: integer;
AControl: TWinControl;
begin
AutoScroll := true;
WindowState := wsMaximized;
for i := 0 to 11 do
for j := 0 to 99 do
begin
Acontrol := ObjList[i].Create(Self);
AControl.Parent := Self;
AControl.Width := 150;
AControl.Height := 20;
AControl.Left := i * 160;
AControl.Top := j * 20 + 5;
if AControl.ClassType = TButton then
(AControl as TButton).Caption := 'this is a button'
else
if AControl.ClassType = TCheckBox then
(AControl as TCheckBox).Caption := 'this is a checkbox'
else
if AControl.ClassType = TEdit then
(AControl as TEdit).Text := 'this is a edit'
else
if AControl.ClassType = TRadioButton then
(AControl as TRadioButton).Caption := 'this is a radiobutton';
end;
end;在窗体上生成1200个组件,都是带窗口句柄的(从TWinControl派生),用XE5编译,测试了两台电脑,一台AMD A10-6800k、一台intel i7-6700k,都是16GB内存、核显(很遗憾,我们这4、5年以来的电脑都是核显),运行很流畅,只是从最小化恢复时有可感觉到的闪烁,其他的窗口移动、缩放、点击、输入都没有任何问题。又在最老的一台服务器(Pentium4 xeon 2.8GHz,1GB内存,实际这只是我们这最老的x86电脑,真正最老的电脑是一台rs/6000 s80服务器,已经运行了将近18年,估计电费都耗了好几万)上测试了一下(远程桌面),启动有2~3秒的延迟,从最小化恢复时有明显的刷新过程,从上到下、从右到左,不过窗口移动、缩放、点击、输入也没有任何问题。
所以我估计楼主的问题可能是:
1. 某些组件的事件处理比较耗时;
2. 有比较多的自绘制,而且不优化;
3. 重载了某些窗口处理过程,或者Application.OnMessage,某些操作耗时或导致反复重绘。