挂接到网格的DataSet具有:

TField.DisplayFormat := '$######.00'


我想使用以下命令构建网格的特定列中的字符串列表:

while NOT DataSet.EOF do
   StringList.Add(TField.DisplayText);


我希望速度可以做到:

DataSet.DisableControls;


但这也会禁用DisplayFormat的应用程序。

不禁用控件意味着它运行非常慢(在过时的,过时的“您现在应该放弃它”中,Paradox / BDE。)

所以,我的问题是:

是否有使用与TField.DisplayFormat相同的符号的格式化功能(例如DFFormat)?

然后我可以做:

 DataSet.DisableControls;
 while NOT DataSet.EOF do
   StringList.Add(DFFormat(TField.Value));


或者,因为只有少数几种数据类型,所以我可以做下面的代码,找出创建有效的Format字符串的方法:

 DataSet.DisableControls;
 while NOT DataSet.EOF do
   begin
     if TField.FieldType = ftString
        StringList.Add(AsString)
     else if TField.FieldType = ftFloat then
        StringList.Add(Format(TField.Value, ...)
     else...


上面的代码不会比显示的更长,但是我希望有一个使用TField的DisplayFormat的格式化功能。还是我要求太多?

最佳答案

DisplayFormat仅适用于四个TField后代(TAggregateFieldTDateTimeFieldTNumericFieldTSQLTimeStampField)。在我看来,这对于他们三个人来说很容易实现:

function TFieldToDisplayFormat(const Fld: TField): string;
begin
  Result := Fld.AsString;
  if (Fld is TDateTimeField) then
    Result := FormatDateTime(TDateTimeField(Fld).DisplayFormat,
      TDateTimeField(Fld).AsDateTime)
  else if (Fld is TNumericField) then
    Result := FormatFloat(TNumericField(Fld).DisplayFormat,
      TNumericField(Fld).AsFloat)
  else if (Fld is TSQLTimeStampField) then
    Result := SQLTimeStampToString(TSQLTimeStampField(Fld).DisplayFormat,
       TSQLTimeStampField(Fld).AsSQLTimeStamp);
end;

// Sample use
while not DataSet.Eof do
  SL.Add(TFieldToDisplayFormat(WhatEverField));

09-25 22:10