Delphi cxGrid条件格式基础知识

发布时间 2023-03-22 21:11:47作者: 一曲轻扬

如果你玩过EXCEL的条件格式化,那么你在这里应该会很容易上手.

数据库和cxgrid的设置,这里就略过了.

右键表格,选择 Edit Layout and Data... 或者 Conditional Fromatting...都可以.这里我们选择 Edit Layout and Data...

 

 

 

 然后在弹出的窗口中,选择 Conditional Formatting...

在这里,你可以管理你所有条件格式 ,可以新增,修改或者删除.Applies to是把条件格式应用到哪个字段

 

 

 

你也可以点New Rule...来新增条件格式,然后你就可以看到它的界面如下

 

 

 如果你英文不好的话,..

 

 

 

 

 

 点击OK,就可以看到效果了:

 

前面的几中条件类型都很简单,我们重点来讲讲最后一种,使用公式来完成标记.

 

在这之前,需要说明一些小知识,网上很难找到的

1.公式里,字符串是用双引号包起来的,单引号你输不进去.

2.公式里的字段是用中括号包起来的.这里有几个细节要讲一下:

  2.1 输入 [ 之后 ,你只能输入所有字段标题的首字母. 以下面的图举例, 当你输入 [ 符号之后 ,你只能输入 "G","N","C"中的一个字母,其他的字符,你按了也没用,我就被这个细节坑了一早上

 

  2.2 注意2.1里说的是字段的标题,而不是字段的面板上Name的值.

  2.3 如果你 输入的列名首字母是唯一的,那么它会自动补齐右边的 ],比如图中的 [G  ,它会自动补齐为 [Group], [N,它会补齐为 [Name],但是如果是 [C ,它只会补齐到 [Count   ,右边的 ] 这是不会补齐的,因为它还有另外一个count2.如果你要有count你就手动补上 ],如果你要用count2,你就手动再输入 2,然后它就会自动补齐为 [count2]

3.

<待更正>

4. Applies to 意思是让条件格式应用到哪个字段,如果你想整行标记,请选择右边的Apply to record.

 

 5.在TcxGrid的条件格式编辑器中,使用stop if true功能可以在满足某个条件时停止应用后续的条件格式,从而优化条件格式的执行效率,避免不必要的计算。
一般来说,当条件格式中存在多个条件时,如果某个条件已经满足,那么后续的条件就没有必要再进行计算,因为它们不会改变单元格的颜色或样式。这种情况下,可以使用stop if true功能,当某个条件满足时,停止应用后续的条件格式,从而提高条件格式的执行效率。
例如,假设有一个数据表格,需要对其中的数据进行高亮显示,条件格式包括以下两个条件:
1. 如果[销售额]字段大于10000,则将单元格背景色设置为红色。
2. 如果[销售额]字段小于5000,则将单元格背景色设置为绿色。
如果不使用stop if true功能,那么在计算每个单元格的条件格式时,都会执行这两个条件,即使第一个条件已经满足,后续的条件也会被执行。这样会导致不必要的计算,降低条件格式的执行效率。
如果使用stop if true功能,可以将第一个条件设置为stop if true,当[销售额]字段大于10000时,就不会再执行后续的条件,从而提高条件格式的执行效率。
需要注意的是,在使用stop if true功能时,需要根据实际情况设置停止条件,确保条件格式能够正确地筛选出需要高亮显示的数据。另外,在设置停止条件时,建议先测试条件格式的正确性,确保能够正确地高亮显示需要的数据。

6.字符串处理用Left,Right,Mid,其中,Left和Righe如果只取一个字符时,第二参数可以不写,比如 Left([Name])="A",注意这里不区分大小写. MID的格式是这样: MID([Name],7,1)="F"

 我有尝试使用 + 和 & 来测试字符串拼接,但是都没有成功.AI也在这两个运算符之间不停的道歉...

 

 7.用代码新建条件格式,并应用程序当用:

 

 

type
  TForm1 = class(TForm)
    cxGrid1: TcxGrid;
    cxGrid1DBTableView1: TcxGridDBTableView;
    cxGrid1DBTableView1RecId: TcxGridDBColumn;
    cxGrid1DBTableView1Group: TcxGridDBColumn;
    cxGrid1DBTableView1Name: TcxGridDBColumn;
    cxGrid1DBTableView1Count: TcxGridDBColumn;
    cxGrid1DBTableView1Count2: TcxGridDBColumn;
    cxGrid1Level1: TcxGridLevel;
    dxMemData1: TdxMemData;
    dxMemData1Group: TStringField;
    dxMemData1Name: TStringField;
    dxMemData1Count: TIntegerField;
    dxMemData1Count2: TIntegerField;
    DataSource1: TDataSource;
    cxButton1: TcxButton;
    cxButton2: TcxButton;
    cxButton3: TcxButton;
    procedure cxButton1Click(Sender: TObject);
    procedure cxButton2Click(Sender: TObject);
    procedure cxButton3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cxButton1Click(Sender: TObject);
var
  ARule: TdxSpreadSheetConditionalFormattingRuleDataBar;

begin
  cxGrid1DBTableView1.ConditionalFormatting.BeginUpdate;
  cxGrid1DBTableView1.ConditionalFormatting.Add(cxGrid1DBTableView1Count.Caption,
                                                TdxSpreadSheetConditionalFormattingRuleDataBar,
                                                ARule);
  ARule.BeginUpdate;
  try
    ARule.Style.NegativeBarColor := clRed;
    ARule.Style.NegativeBarBorderColor := clRed;

    ARule.Style.PositiveBarColor := clMoneyGreen;
    ARule.Style.PositiveBarBorderColor := clMoneyGreen;
    ARule.Style.FillMode := dbfmSolid
  finally
    ARule.EndUpdate;
  end;

  cxGrid1DBTableView1.ConditionalFormatting.EndUpdate;
end;

procedure TForm1.cxButton2Click(Sender: TObject);
var
  ARule: TdxSpreadSheetConditionalFormattingRuleIconSet;
begin
  cxGrid1DBTableView1.ConditionalFormatting.BeginUpdate;
  cxGrid1DBTableView1.ConditionalFormatting.Add(cxGrid1DBTableView1Count2.DataBinding.FieldName,
                                                TdxSpreadSheetConditionalFormattingRuleIconSet,
                                                ARule);
  ARule.BeginUpdate;
  try
    ARule.PresetName := ConditionalFormattingIconSet.Presets[1].Name;              // "3ArrowsGray"
    ARule.Stops[2].ValueType := cssvtValue;
    ARule.Stops[2].Value := 7;
    ARule.Stops[1].ValueType := cssvtValue;
    ARule.Stops[1].Value := 4;
  finally
    ARule.EndUpdate;
  end;
  cxGrid1DBTableView1.ConditionalFormatting.EndUpdate;
end;


procedure TForm1.cxButton3Click(Sender: TObject);
begin //给予用户自行设计条件格式的权利
  cxGrid1DBTableView1.ConditionalFormatting.ShowRulesManagerDialog;
end;

end.