我的程序界面控件非常多,刚开始用时还好一点,接着越用越卡,卡到用鼠标点击一个控件时,可以清楚的看到控件对齐线缓缓的显示出来,又缓缓的消失。两三秒才响应过来,再用一会,报错,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 ,没一点用。百度了一下,好像基本没人说起这个问题,难道没人有这样的问题吗? 不会吧..

解决方案 »

  1.   

    以前用Delphi2006的时候遇到过,不过不经常卡死,没有好的办法。只能将其他软件安装少点,或许是软件冲突。
      

  2.   

    这与你的硬件有关,CPU速度,内在,显卡内存,等等
      

  3.   

    很遗憾,从来没碰到这种情况。这种情况一般都是程序CPU占用率非常高导致GUI更新迟钝。
      

  4.   

    今天刚好收了一台I5 4460, 8G内存,固态,影驰750TI显卡,然后全新安装 WIN7 64,全新安装 delphi。
    很遗憾,还是会出现这个问题,看来不是硬件问题。
      

  5.   

    我测试了一下,在一个窗口上创建超过1000个组件,在一个高配机器上缩放窗口能看到明显的刷新过程,但也是瞬间完成,不会慢到不可接受。WS_EX_COMPOSITED(值0x02000000)扩展样式可以改善闪烁,但此样式有严重的副作用,在不同系统上副作用不同,比如非客户区的按钮动画效果消失,滚动条闪烁,CPU占用率高等。可以尝试:1.把不涉及绘制界面的代码放到单独的线程里,主线程只用来刷新界面。2.个人建议少用WS_EX_COMPOSITED样式。3.尽量减少子窗口类控件的使用,即减少CreateWindow创建的组件。使用DirectUI方式创建组件或者使用FMX库,甚至可以html+js+css的方式创建界面。
      

  6.   

    测试代码如下:procedure TForm1.FormCreate(Sender: TObject);
    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,某些操作耗时或导致反复重绘。
      

  7.   

    从未遇到过,不过,我一直在用Delphi7,高版本的安装程序太大。