挂接到网格的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
后代(TAggregateField
,TDateTimeField
,TNumericField
和TSQLTimeStampField
)。在我看来,这对于他们三个人来说很容易实现:
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));