我想TImage组件循环进行两种色块填充达到要求的闪烁效果,我首先是在窗体创建事件中初始化了一个image数组,定义如下:
  arrimg[1]:=img1;
  arrimg[2]:=img2;
  arrimg[3]:=img3;
  arrimg[4]:=img4;
  arrimg[5]:=img5;
  arrimg[6]:=img6;
  arrimg[7]:=img7;
  arrimg[8]:=img8;
  arrimg[9]:=img9;
  arrimg[10]:=img10;
  arrimg[11]:=img11;
  arrimg[12]:=img12;
  arrimg[13]:=img13;
  arrimg[14]:=img14;
接下来我定义了一个过程如下:
procedure DrawDisplay(Num,Time:Integer;Sta:Boolean);
begin
  while Time<>0 do
  begin
    if Sta then
    begin
      arrimg[Num].Canvas.Brush.Color:=clWhite;
      arrimg[Num].Canvas.Brush.Style:=bsSolid;
      arrimg[Num].Canvas.Ellipse(arrimg[Num].ClientRect);
      Sleep(500);
      arrimg[Num].Canvas.Brush.Color:=clYellow;
      arrimg[Num].Canvas.Brush.Style:=bsSolid;
      arrimg[Num].Canvas.Ellipse(arrimg[Num].ClientRect);
      Sleep(500);
    end
    else
    begin
      arrimg[Num].Canvas.Brush.Color:=clYellow;
      arrimg[Num].Canvas.Brush.Style:=bsSolid;
      arrimg[Num].Canvas.Ellipse(arrimg[Num].ClientRect);
      Sleep(500);
      arrimg[Num].Canvas.Brush.Color:=clWhite;
      arrimg[Num].Canvas.Brush.Style:=bsSolid;
      arrimg[Num].Canvas.Ellipse(arrimg[Num].ClientRect);
      Sleep(500);
    end;
    Time:=Time-1000;
  end;
end;
然后调用这个过程DrawDisplay(3,3000,True);还有这个过程我是在另外一个线程里面调用的.但是在窗体上面的img3闪烁的很不正常,有时候可以显示出来,有时间简直就是不显示了.原理上我想上面的方法应该是可以实现我要的闪烁效果的,问题是为什么img3有时可以显示出效果,有时候又没有效果这么不稳定呢?会不会是我多线程的关系呢?但是我多线程访问img组件的时候我都是单对单的也就是说我一个线程同时访问的img组件都是独立的,不可以有两个线程同时操作同一个img组件.我就是一直想不通这个问题出在哪里?所以想请诸位大虾有力出力,没力出几口也没有关系!!

解决方案 »

  1.   

    更换完图片后加入
    Application.ProcessMessages;
      

  2.   

    procedure DrawDisplay(Num,Time:Integer;Sta:Boolean);
    begin
      while Time<>0 do
      begin
        if Sta then
        begin
          arrimg[Num].Canvas.Brush.Color:=clWhite;
          arrimg[Num].Canvas.Brush.Style:=bsSolid;
          arrimg[Num].Canvas.Ellipse(arrimg[Num].ClientRect);
          Application.ProcessMessages;
          Sleep(500);
          arrimg[Num].Canvas.Brush.Color:=clYellow;
          arrimg[Num].Canvas.Brush.Style:=bsSolid;
          arrimg[Num].Canvas.Ellipse(arrimg[Num].ClientRect);
          Application.ProcessMessages;
          Sleep(500);
        end
        else
        begin
          arrimg[Num].Canvas.Brush.Color:=clYellow;
          arrimg[Num].Canvas.Brush.Style:=bsSolid;
          arrimg[Num].Canvas.Ellipse(arrimg[Num].ClientRect);
          Application.ProcessMessages;
          Sleep(500);
          arrimg[Num].Canvas.Brush.Color:=clWhite;
          arrimg[Num].Canvas.Brush.Style:=bsSolid;
          arrimg[Num].Canvas.Ellipse(arrimg[Num].ClientRect);
          Application.ProcessMessages;
          Sleep(500);
        end;
        Time:=Time-1000;
        Application.ProcessMessages;
      end;
    end;
      

  3.   

    Application.ProcessMessages;试试,给他一个展现给你的时间