procedure TForm1.Button1Click(Sender: TObject);
var
i,j,oLeft,oTop:integer;
begin
  //终止窗体刷新
  oLeft:=0;
  oTop:=0;
  for i:=1 to 25 do
  begin
    for j:=1 to 25 do
    begin
     p[i,j]:=Tpanel.Create(self);
     p[i,j].Parent:=self;
     p[i,j].BevelOuter:=bvNone;
     p[i,j].Height:=5;
     p[i,j].Width:=5;
     p[i,j].Left:=oLeft+(j-1)*5;
     p[i,j].Top:=oTop+(i-1)*5;
     p[i,j].Color:=rgb(i*10,j*10,255);
  // p[i,j].onclick:=pclick(i,j);  
    end;
  end;
  //刷新窗体
end;上述代码画的时候,闪得很厉害,如果在创建 panel 终止窗体刷新,等创建完了让它刷新,再全部显示在窗体中?还有,谁写一个 p[i,j] 的 onclick 事件代码,只要求点击后显示出i,j的值。

解决方案 »

  1.   

    self.canvas.lock;
    self.canvas.unlock;
    大概這樣吧
      

  2.   

    sorry,补上定义
    public 
        p:array[1..25,1..25] of TPanel;
      

  3.   

    type    procedure pclick(Sender : TObject);
      private
       ...........
      public
       ...........
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    i,j,oLeft,oTop:integer;
    p : array[1..25, 1..25] of TPanel;
    begin
      //终止窗体刷新
      oLeft:=0;
      oTop:=0;
      for i:=1 to 25 do
      begin
        for j:=1 to 25 do
        begin
         p[i,j]:=Tpanel.Create(self);
         p[i,j].BevelOuter:=bvNone;
         p[i,j].Height:=5;
         p[i,j].Name := 'row' + inttostr(i) + 'col' + inttostr(j);
         p[i,j].Caption := '';
         p[i,j].Width:=5;
         p[i,j].Left:=oLeft+(j-1)*5;
         p[i,j].Top:=oTop+(i-1)*5;
         p[i,j].Color:=rgb(i*10,j*10,255);
         p[i,j].onclick:= pclick;
         p[i,j].Parent:=self;
        end;
      end;
      //刷新窗体
    end;procedure TForm1.pclick(Sender: TObject);
    begin
        showMessage(TPanel(Sender).Name);
    end;
      

  4.   

    刷新前
    BOOL LockWindowUpdate(
      HWND hWndLock   // handle of window to lock
    );
    刷完了 
    LockWindowUpdate(0);
      

  5.   

    我的楼上的,
    再将doublebuffer设成true