delphi 在cxgrid中展示物料各自的显示精度

效果图:

 

 数据库设计:

 

 设计视图:

 

 方法一使用TcxEditRepository控件.双击TcxEditRepository控件,进行添加.这里选择新增货币格式.

 

 为每一种样式设置属性:

 

接下来关联需要设置的列.但不是在面板里直接设置,而是通过代码

 

选中需要设置的列,然后在其OnGetProperties事件中完成业务代码:

procedure TForm1.cxGrid1DBTableView1QtyGetProperties(Sender:
  TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AProperties: TcxCustomEditProperties);
var
  index, Accuracy: Integer;
begin
  index := cxGrid1DBTableView1DisplayAccuracy.Index; //精度所在的列号
  Accuracy := cxGrid1DBTableView1.DataController.GetValue(ARecord.RecordIndex, index); //取得精度值
  case Accuracy of  //根据精度值,设置不同的显示样式
    0:   //无小数位
      AProperties := cxEditRepository1CurrencyItem0.Properties;
    1:    //一位小数,以下以此类推.因为精度值的取值范围是0-4,所以不会出现其他值
      AProperties := cxEditRepository1CurrencyItem1.Properties;
    2:
      AProperties := cxEditRepository1CurrencyItem2.Properties;
    3:
      AProperties := cxEditRepository1CurrencyItem3.Properties;
    4:
      AProperties := cxEditRepository1CurrencyItem4.Properties;
  end;
end;

这里说明一下,DisplayAccuracy这个字段必须要有,但你可以设置它的visible为false隐藏它.否则你只能通过其他途径来取它的精度值.

 以上方法由@拉夫 提供

 

 方法二是使用@淡淡的风 给出的方案,一眼看上去没什么问题

 

 但是当你点到数据时:

 

 为了解决这个缺陷,我尝试给OldQty列设置了Properties属性:

 

 

 然后它就变成了这样: 没选中时,显示是正常的,但是点中了之后,不管你精度是多少,都会变成4位小数.用户在输入时,也是可以输入四位数的...虽然排序和使用过虑器都不会乱,但这不是我想要的结果(有其他方法可以弥补这个不足,但是我这里不想展开)

 

 业务代码需要用到列的OnGetDataText事件,具体代码如下:

procedure TForm1.cxGrid1DBTableView1OldQtyGetDataText(Sender:TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
var
  fValue: Double;
  j,k:integer;
  function SetFormat(f: Double; i: Integer): string;
  var
    s: string;
    ef: Extended;
  begin
    s := '#.' + StringOfChar('0', i);    // StringOfChar('A', 5)=> 'AAAAA' 返回5个连续的A
    ef := StrToFloat(FloatToStr(f));   //防止浮点计算产生的误差
    Result := FormatFloat(s, eF);
  end;

begin
  j:=cxGrid1DBTableView1OldQty.Index ;    //原始数据所在的列,这一列可以隐藏起来,不要显示
  k:= cxGrid1DBTableView1DisplayAccuracy.Index ; //精度值所在的列,这一列可以隐藏起来,不要显示
  fValue:=  cxGrid1DBTableView1.DataController .Values[ARecordIndex,j]; //取回数值
  AText:=SetFormat(fValue,cxGrid1DBTableView1.DataController .Values[ARecordIndex,k]);   //格式化
end;

 

 第三种方法也是由 @淡淡的风 提供的方案(大佬就是大佬),和方法2很类似,只是新增了一个字段,但是方法二里面的问题仍然存在

 

 

 

 

posted @ 2023-03-04 15:22  一曲轻扬  阅读(455)  评论(0)    收藏  举报