图象为什么在单元格子里动呢?
unit datarevFrm;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Grids, ExtCtrls;type
  TmydatarevFrm = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    DateTimePicker1: TDateTimePicker;
    refbtn: TButton;
    dataGrd: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure dataGrdDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure drawCircle(x:Integer;y:Integer;r:Integer;c:TColor);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  mydatarevFrm: TmydatarevFrm;implementation
uses def;{$R *.dfm}procedure TmydatarevFrm.FormCreate(Sender: TObject);
var
  myDatarev: DatarevRecord;
  dt: String;
  //myColCount:Integer;
begin
  DateTimeToString(dt,'YYYY-MM-DD',DateTimePicker1.Date);
  getrevData('2003-11-28','data_rev');
  getDataSetList('data_rev_set');
  showMessage(IntToStr(revDataList.count));
  dataGrd.PopupMenu:=nil;
  //dataGrd.Options:=[goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,goColSizing];
  dataGrd.DefaultColWidth:=80;
  dataGrd.ColCount:=25;
  dataGrd.RowCount := revDataList.Count div 24 +1;
  {
  dataGrd.Font.Size := 8;
  dataGrd.Cells[0,0]:='';
  dataGrd.Cells[1,0]:='0 时';
  dataGrd.Cells[2,0]:='1 时';
  dataGrd.Cells[3,0]:='2 时';
  dataGrd.Cells[4,0]:='3 时';
  dataGrd.Cells[5,0]:='4 时';
  dataGrd.Cells[6,0]:='5 时';
  dataGrd.Cells[7,0]:='6 时';
  dataGrd.Cells[8,0]:='7 时';
  dataGrd.Cells[9,0]:='8 时';
  dataGrd.Cells[10,0]:='9 时';
  dataGrd.Cells[11,0]:='10 时';
  dataGrd.Cells[12,0]:='11 时';
  dataGrd.Cells[13,0]:='12 时';
  dataGrd.Cells[14,0]:='13 时';
  dataGrd.Cells[15,0]:='14 时';
  dataGrd.Cells[16,0]:='15 时';
  dataGrd.Cells[17,0]:='16 时';
  dataGrd.Cells[18,0]:='17 时';
  dataGrd.Cells[19,0]:='18 时';
  dataGrd.Cells[20,0]:='19 时';
  dataGrd.Cells[21,0]:='20 时';
  dataGrd.Cells[22,0]:='21 时';
  dataGrd.Cells[23,0]:='22 时';
  dataGrd.Cells[24,0]:='23 时';   }  //showMessage(IntToStr(revDataList.Count ));
  Hint := 'Name|Enter Name in the edit box';
  ShowHint := True;end;
procedure TmydatarevFrm.drawCircle(x:Integer;y:Integer;r:Integer;c:TColor);
begin
  dataGrd.Canvas.Brush.Color:=c;
  dataGrd.Canvas.Pen.Color:=c;
  r:=3;
  if c=clGreen then
  begin
    dataGrd.Canvas.MoveTo(x-r,y);
    dataGrd.Canvas.LineTo(x+r,y);
  end;
  if c=clRed then
  begin
    dataGrd.Canvas.Ellipse(x-r,y-r,x+r,y+r);
    dataGrd.Canvas.FloodFill(x,y,clWhite,fsSurface);
  end;
  if c=clBlue then
  begin
   // linkGrd.Canvas.Brush.Color:=cl;
   // linkGrd.Canvas.Pen.Color:=clRed;
    dataGrd.Canvas.FillRect(Rect(x-r,y-r,x+r,y+r));
    //linkGrd.Canvas.FloodFill(x,y,clWhite,fsSurface);
  end;
end;procedure TmydatarevFrm.dataGrdDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
   revRecord: PDatarevList;
   setRecord: PDatasetList;
   i,x,y,r:Integer;
  tmp_rect:TRect;
begin
 // if((ARow-1)>=0) then
 // begin
   // revRecord := revDataList.Items[(ARow-1) * 24];
    //if(revRecord.hour <> -1) then
   // begin
      if(ARow = 0) or (ACol = 0) then
      begin
        dataGrd.Font.Style := [fsBold];
      end;
      if((ARow > 0) and (ACol = 0)) then
      begin
        revRecord := revDataList.Items[(ARow-1) * 24];
        dataGrd.Cells[ACol,ARow] := revRecord.switch_name;
      end;
      if((ARow>0) and (ACol>0)) then
      begin
      {
        for i:=1 to DataSetList.Count do
         begin
           setRecord:=DataSetList.Items[i-1];
           if(revRecord.switch_name  = setRecord.switch_name ) then
             begin
                break;
             end;
          end;
          }
        setRecord:=DataSetList.Items[1];
        revRecord := revDataList.Items[(Arow-1)*24 + ACol-1];
        tmp_Rect:=dataGrd.CellRect(ACol,ARow);
        x:=tmp_Rect.Right+20;
        y:=tmp_Rect.Top+(tmp_Rect.Bottom-tmp_Rect.Top) div 2;
        r:=3;        if(revRecord.a01_rev_num >=setRecord.a01_rev_set ) then
        begin
          drawCircle(x,y,r,clGreen);
        end;        if((revRecord.a01_rev_num <=setRecord.a01_rev_set )and(revRecord.a04_rev_num>0)) then
        begin
          drawCircle(x,y,r,clRed);
        end;        if(revRecord.a01_rev_num =0 ) then
        begin
          drawCircle(x,y,r,clBlue);
        end;        x := x + 10;        if(revRecord.a02_rev_num >=setRecord.a02_rev_set ) then
        begin
          drawCircle(x,y,r,clBlue);
        end;        if((revRecord.a02_rev_num <=setRecord.a02_rev_set )and(revRecord.a04_rev_num>0)) then
        begin
          drawCircle(x,y,r,clRed);
        end;        if(revRecord.a02_rev_num =0 ) then
        begin
          drawCircle(x,y,r,clBlue);
        end;        x := x + 10;        if(revRecord.a04_rev_num >=setRecord.a04_rev_set ) then
        begin
          drawCircle(x,y,r,clBlue);
        end;        if((revRecord.a04_rev_num <=setRecord.a04_rev_set )and(revRecord.a04_rev_num>0)) then
        begin
          drawCircle(x,y,r,clRed);
        end;        if(revRecord.a04_rev_num =0 ) then
        begin
          drawCircle(x,y,r,clBlue);
        end;
      end;    //end
   // else
   // showMessage('交换机'+revRecord.switch_name+'数据不完整!' );
  //end;
end;end.

解决方案 »

  1.   

    太长了,看不大清楚。不过这样做试试看:
      dataGrd.DefaultColWidth:=80;
      dataGrd.ColCount:=25;
      dataGrd.RowCount := revDataList.Count div 24 +1;
      {
      LockWindowUpdate (Handle);//锁屏
      dataGrd.Font.Size := 8;
      dataGrd.Cells[0,0]:='';
      ...
      LockWindowUpdate (0) //开锁
      }
      

  2.   

    if((ARow > 0) and (ACol = 0)) then
          begin
            revRecord := revDataList.Items[(ARow-1) * 24];
            dataGrd.Cells[ACol,ARow] := revRecord.switch_name;
          end;
    把它放到了TmydatarevFrm.FormCreate事件里面去了,但现在的效果还是不对,
    格子里的图象像是一个格子一个格子的走,!
    这是怎么回事呢?
    谢谢!
      

  3.   

    可能还是来不及刷新的问题,锁屏试试看呢。
    或者这么做:在设置DataGrd之前把visible:=false,完成之后再visible:=true。
      

  4.   

    好象是来不及刷新的问题。“在设置DataGrd之前把visible:=false,完成之后再visible:=true”
    我是在dataGrdDrawCell中这么做的,但闪烁的更厉害了,是不是应该放在外面,
    那么分别放在什么事件当中呢?
      

  5.   

    我在TmydatarevFrm.FormCreate中设置visible:=false在一个按扭事件中加入visible:=true
    但还是和以前一样。格子里的图象像是一个格子一个格子的走,!(单位时间只有一个格子有图象)屏幕无闪烁现象!
    刚接触delphi希望给予指导
    谢谢
      

  6.   

    谁有关于TStringGrid的文章,教程也给分啊!
     谢谢