起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 177|回复: 6

【结贴】在CustomDrawCell中怎么改变某个字段的颜色,并且速度不慢下来。

[复制链接]
发表于 2007-9-29 10:26:22 | 显示全部楼层 |阅读模式
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这个事件,如果没有我怎么提高代码运行效率。
回复

使用道具 举报

发表于 2007-9-29 11:46:58 | 显示全部楼层
代码优化下就行了。

前面加个字段的判断,不是这个列的都跳开(exit)。
回复 支持 反对

使用道具 举报

发表于 2007-9-29 11:55:51 | 显示全部楼层
可以在DataGrid的列的ONCustomDrawCell事件里面写
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-29 15:26:20 | 显示全部楼层
我这个循环是做过判断的。还有告诉楼上,我就是写在ONCustomDrawCell事件里面的

希望大大们能稍微看一下代码。
回复 支持 反对

使用道具 举报

发表于 2007-9-29 15:37:00 | 显示全部楼层
也请楼主稍微看一下帖子,
3楼是列的OnCustomDrawCell,不是DataGrid的OnCustomDrawCell。
2楼的优化是让你一进来就判断列,不是你要的列就直接退出。
回复 支持 反对

使用道具 举报

发表于 2007-9-30 09:03:17 | 显示全部楼层
楼主请回馈
回复 支持 反对

使用道具 举报

发表于 2007-11-6 15:45:04 | 显示全部楼层
由于长时间未回馈,先结贴了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-30 02:09 , Processed in 0.036973 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表