如何在Delphi中设置记录的默认值

6

我正在使用RAD XE7。在我的Delphi应用程序中,我想为记录字段设置默认值。

我尝试了以下代码,但它无法编译,我知道它是错的。是否有其他方法?

 TDtcData = record
    TableFormat     : TExtTableFormat = fmNoExtendedData;
    DTC             : integer = 0;
    Description     : string = 'Dummy';
    Status          : TDtcStatus;    
    OccurenceCnt    : integer =20;
    FirstDTCSnapShot: integer;
    LastDTCSnapShot: integer;
  end; 

你可以在那个记录中使用一个函数,返回一个带有所需值的新记录。例如,查看System.Diagnostics中TStopWatch记录的StartNew函数。 - nil
为什么你想使用记录而不是类?如果你正在使用指向记录的指针,这会让我警觉,因为类对象本质上就是指针,而且使用类似乎可以解决你的问题。 - Dsm
实际上,我正在将代码迁移到XE7,旧代码是在Codegear 2007中,因此旧代码中有很多记录。创建构造函数是一个好的解决方案吗? - Ankush
如果您正在进行迁移,没有看到您的代码,很难(不可能?)说出最佳方法。类对象和记录之间的一个重要区别是,记录会自动创建,而类对象必须显式创建。这种差异对您造成多大困难,只有您自己才能回答,但两者之间的语法差异非常小。 - Dsm
1
为什么不使用Default()?(Delphi 10.4及以上版本) https://dev59.com/RZjga4cB1Zd3GeqPRvZh - Gabriel
2个回答

10

如果你想定义一个部分初始化的记录,只需声明一个常量记录,但省略不需要默认值的参数:

Type
  TDtcData = record
  TableFormat     : TExtTableFormat;
  DTC             : integer;
  Description     : string;
  Status          : TDtcStatus;
  OccurenceCnt    : integer;
  FirstDTCSnapShot: integer;
  LastDTCSnapShot: integer;
end;

Const
  cDefaultDtcData : TDtcData = 
    (TableFormat : fmNoExtendedData; 
     DTC : 0; 
     Description : 'Dummy'; 
     OccurenceCnt : 20);

var
  someDtcData : TDtcData;
begin
  ...
  someDtcData := cDefaultDtcData;
  ...
end;

是的,它有效。但我创建了一个记录指针,就像这样 PTDtcData = ^TDtcData; 因为我想使用 Tlist 创建记录列表,所以这对于这种情况不起作用,是否有其他方法可以使用记录指针来实现类似的功能。 - Ankush
2
指针的工作方式类似于:var myP: PDtcData; begin New(myP); myP^ := cDefaultDtcData; etc...,其中 type PDtcData = ^TDtcData; TDtcData = record ... etc. - Rudy Velthuis
1
使用XE7,您可以使用通用的TList<TDtcData>而不是指针方法。 - MBo
3
@Ankush,额外的规格说明与问题无关。您可以制作一个指向一个或多个默认记录的指针列表,没有任何阻止。 - LU RD
为什么不使用Default()?https://dev59.com/RZjga4cB1Zd3GeqPRvZh - Gabriel
1
@ServerOverflow,这个问题是关于如何初始化记录中某些字段的特定值。Default()会将所有字段设置为零或空值。 - LU RD

5
通过在Delphi中添加 'class like' 记录类型,您可以通过使用类函数来解决此问题。
为您的记录定义 class function CreateNew: TDtcData; static;
实现将为生成的记录设置默认值:
class function TDtcData.CreateNew: TDtcData;
begin
 Result.TableFormat := fmNoExtendedData;
 Result.DTC := 0;
 Result.Description :=  'Dummy';
 Result.OccurenceCnt := 20;
end;

使用此方法获取具有默认值的记录,如下所示:
var
  AData: TDtcData;
begin
  AData := TDtcData.CreateNew;;
end.

好的,这对于默认值来说是可以的,但我想使用Tlist创建记录列表,然后从Tlist中检索记录。 - Ankush
@Ankush,你的评论看起来像是你接受了对你问题的回答。这是一个问答网站,如果是这样,请接受答案并针对你的第二个问题提出另一个问题。 - Dsm
为什么要使用类方法而不是将代码放在Initialize“构造函数”中?(Delphi 10.4及以上版本) - Gabriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接