需求
假设一个 DataSet 的某个字段,有3条记录,分别是 0.2, 0.3, 0.4;在 DBGridEh 里面要显示为 20%, 30%, 40%, 你发现 DBGridEh 的固定字段的属性里面,有个:DispalyFormat,于是你把它的值设置为 0%,运行后发现,它显示为 0%。如果你设置为 0.00%,你会发现它显示为 0.2%, 0.3%, 0.4%;
然后才知道,DisplayFormat 不会去计算,只是简单的把数字后面坠上百分号。
这事好解决。在 DataSet 的 TField 的 OnGetText 事件里面写代码,把该字段输出的字符串改一下:
DisplayText := FloatToStr(Sender.AsFloat * 100) + '%‘;
然后在 DBGridEh 显示对应字段的值的地方,就变成了:20%, 3-%, 40%;
页脚
DBGridEh 的页脚,一般是用来显示统计数据的。比如该列的合计值。或者该列的平均值。比如前面的例子,上面那个字段在 DBGridEh 里面的列,其页脚应该显示 0.3;
如果想把这个 0.3 显示为 30% 该怎么办?
解法
解法一
简单的把页脚的 DisplayFormat 设置为 0.00% 它就会显示为 0.3% 而不是 30%;DisplayFormat 这里不能写代码,比如 0.00% * 100。
要找个地方写代码,并且能够显示到这里。代码如下:
procedure TForm1.DBGridEh1DrawFooterCell(Sender: TObject; DataCol, Row:
LongInt; Column: TColumnEh; Rect: TRect; State: TGridDrawState);
var
SumValue: Real;
S: string;
i: Integer;
begin
i := Column.Index;
case i of
5:
begin
SumValue := DBGridEh1.Columns[i].Footer.SumValue;
if SumValue = 0 then Exit;
SumValue := SumValue * 100;
S := Format('%.2f%s', [SumValue, '%']);
DBGridEh1.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, S);
end;
end;
end;
- 把该页脚的 ValueType 设置为 fvtAVG;
- DBGridEh1 的 SumList 要设置 Active := True;
解法二:Aggregate
使用 ClientDataSet 的 Aggregate 字段。把 DBGridEh1 - DataSource1 - ClientDataSet1 绑定上。
- 创建 Aggregate 字段时,Type 里面保存自动出现的 Aggregate 不要去选择 string, Integer 等类型。
- Aggregate 字段的属性 - Expression,填入 AVG(字段名);
- Aggregate 字段的属性:Active 设置为 True;Visible 设置为 True;
- FdMemTable.AggregatesActive 属性设置为 True;
- 把 DBGridEh 的页脚的 ValueTpye 设置为 fvtFieldValue,FieldName 设置为计算字段的名字。
运行时可以在页脚看到计算字段的平均值了。
显示百分数:Expression 设置为:AVG(字段名)*100;DisplayFormat 设置为 0.00% ;
计算字段的问题:
- 计算字段的公式(Expression)里面填写的是字符串。其中的字段名,不能带空格。假设字段名是:abc efg 那么内部公式在计算时任务字段是 abc,字段名被空格截断了。给字段名加上引号也没用。
- FireDAC 的 FdMemTable 的 Aggregates 字段,设计期绑定到页脚上,运行时会弹出异常。因此这里必须用 ClientDataSet;
解法三:计算字段
- 在 ClientDataSet1 中,设计期,添加一个字段,类型选择 InternalCalc(以下称其为内部计算字段);
- 在 ClientDataSet1 的 OnCalculate 事件里面写代码为这个计算字段赋值。这里只是简单的把它的值设置为前面提到的需要显示百分数的字段的值 * 100;
- 在 DBGridEh 里面添加一列,对应这个计算字段。设置该列的 DisplayFormat 为 0%;
- DBGridEh 的该列的页脚,ValueType 设置为 fvtAVG,属性 DisplayFormat 填入 0%;
备注 - 这里不要使用普通计算字段,而应该采用内部计算字段。
- 同样,FdMemTable 不能采用这个方法。有问题。
结语
这个问题,我问过 AI,AI 给出来的解法,完全无效。
425

被折叠的 条评论
为什么被折叠?



