图象为什么在单元格子里动呢?
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.
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.
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) //开锁
}
begin
revRecord := revDataList.Items[(ARow-1) * 24];
dataGrd.Cells[ACol,ARow] := revRecord.switch_name;
end;
把它放到了TmydatarevFrm.FormCreate事件里面去了,但现在的效果还是不对,
格子里的图象像是一个格子一个格子的走,!
这是怎么回事呢?
谢谢!
或者这么做:在设置DataGrd之前把visible:=false,完成之后再visible:=true。
我是在dataGrdDrawCell中这么做的,但闪烁的更厉害了,是不是应该放在外面,
那么分别放在什么事件当中呢?
但还是和以前一样。格子里的图象像是一个格子一个格子的走,!(单位时间只有一个格子有图象)屏幕无闪烁现象!
刚接触delphi希望给予指导
谢谢
谢谢