procedure TCXJM.DataGrid1CustomDrawCell(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; ANode: TTreeListNode; AColumn: TTreeListColumn; ASelected,
AFocused, ANewItemRow: Boolean; var AText: string; var AColor: Integer;
AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean);
Var
TempSql :string;
TempHour:Float;
WarningHour:Integer;
I,dispcolor,backcolor:integer;
TempFieldName:String;
TempFieldValue:String;
TempType:String;
JudgeField:String;//各种变量日期
begin
if DataSetState.Active = False then exit;
if DataSetSetAdd.Active = False then exit;
for I := 0 to DataGrid1.ColumnCount - 1 do
begin
TempFieldName:=DataGrid1.Columns[I].FieldName;
TempFieldValue:=DataSetSetAdd.FieldByName(TempFieldName).AsString;
TempType:='03';
if DataSetState.Locate('StaType;StaFieldName;StaJobName',
VarArrayOf([TempType,TempFieldName,TempFieldValue]),[]) = True then
begin
if DataSetState.FieldByName('StaSysDefault').AsString = 'True' then
begin
JudgeField:=DataSetState.FieldByName('StaJOBSQL').Asstring;
Warninghour:=DataSetState.FieldByName('StaDay').AsInteger;
Dispcolor:=DataSetState.FieldByName('StaColor').AsInteger;
if Trim(JudgeField) = '' then exit; //日期字段为空
if Trim(DataSetSetAdd.FieldByName(JudgeField).Asstring) = '' then exit;
if DataSetstate.FieldByName('StaIsbefore').AsString = '前' then
begin
TempHour:=(DataSetSetAdd.FieldByName(JudgeField).AsDateTime - now) * 24;
If TempHour <= Warninghour then
DataGrid1.Columns[I].Font.Color:=Dispcolor;
end else
begin
TempHour:=(now - DataSetSetAdd.FieldByName(JudgeField).AsDateTime) *24;
if TempHour >= Warninghour then
DataGrid1.Columns[I].Font.Color:=Dispcolor;
end;
end;
end;
end;
end;
以上是事件里写的代码,我做了一个列的for 循环 根据设置改变字段颜色的效果是达到了 但是速度是很慢很慢的。影响到正常的显示。以前我在delphi 里写的时候不需要用到for 循环的 代码如下:
procedure TKyjk_MainForm.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
Var
TempHour:Real;
WarningHour:Integer;
dispcolor,backcolor:integer;
TempFieldName:String;
TempFieldValue:String;
TempType:String;
kindField:String;//各种变量日期
begin
if gdSelected in State then Exit;
IF Modal.state.Active = False Then Exit;
If tdxz.Active = False Then Exit;
TempFieldName:=Column.FieldName;
TempFieldValue:=tdxz.FieldByName(TempFieldName).AsString;
TempType:=FType;
IF Modal.state.Locate('jobtype;jobstate;substate',
VarArrayOf([TempType,TempFieldName, TempFieldValue]),[]) = True Then Begin
IF Modal.state.FieldByName('isdefault').AsString = 'N' Then Begin //Exit;
KindField:=Modal.state.FieldByName('kindfield').Asstring;
Warninghour:=Modal.state.FieldByName('warninghour').AsInteger;
Dispcolor:=Modal.state.FieldByName('dispcolor').AsInteger;
If Trim(KindField) = '' Then Exit; //日期字段为空
If Trim(tdxz.FieldByName(kindField).Asstring) = '' Then Exit;
If Modal.state.FieldByName('isbefore').AsString = '前' Then Begin
TempHour:=(tdxz.FieldByName(kindField).AsDateTime - now) * 24;
If TempHour <= Warninghour Then
TDBGridEh(Sender).Canvas.Font.Color:=Dispcolor;
End Else Begin
TempHour:=(now - tdxz.FieldByName(kindField).AsDateTime) *24;
If TempHour >= Warninghour Then
TDBGridEh(Sender).Canvas.Font.Color:=Dispcolor;
End;
End;
End;
End;
end;
我想问一下 在X3中有没有DrawColumnCell这个事件,如果没有我怎么提高代码运行效率。 |