Delphi结构体的扩展,可以自动初始化,反初始化,自定义拷贝函数.

恭贺Delphi XE7诞生,Delphi XE7在编译器内部集成了我之前所实现的动态数组扩展.http://www.raysoftware.cn/?p=278
现在有一个更悠久的历史需求,在QC的Delphi板块上置顶了好多年.官方一直没有实现.
http://qc.embarcadero.com/wc/qcmain.aspx?d=21729
众所周知Delphi的record和CPP的struct是有区别的.CPP的struct可以看成是class的别名,可以有构造,析构,可以继承.

Delphi的record几年前开始支持方法,支持操作符重载,美中不足之处在于不能自己写默认构造函数.Delphi的帮助文档说可以自己写有参数的constructor但是不能写不带参数的constructor/destructor.但是实际上除非是有引用类型变量,否则结构体不会被初始化.

这就产生了一些问题,

比如说我要借助record的操作符重载,重载+,:=等操作符,自己实现一个string record.但是这个record每次声明以后必须要手动初始化一下,否则里面的内容未被初始化,是随机值.

TString = record</pre>
   len : Integer; //这个不会被自动初始化
   data : pchar; //这个不会被自动初始化
   class operator Add(a, b: TString ): TString; 
end; 

实现了一个结构体的初始化,反初始化,拷贝的自动调用单元.
只要你的结构体引用了AutoRecord这个类型的变量,那么结构体就可以自动调用初始化,反初始化,拷贝.
比如:

  TTest = record
  _ : AutoRecord;
  procedure Operator_Initialize(); //初始化
  procedure Operaor_Finalize(); //反初始化
  procedure Operator_Assign(const source: TTest); overload;//拷贝 :=
  procedure Operator_Assign(const source: TTest; defaultAssign : TDefaultAssign(*调用默认赋值的函数*)); overload;//拷贝 :=
  end;

这样TTest在使用的时候就会自动调用

var
  Test : TTest;
  TestArray : array[0..1] of TTest;
begin //Test.Operator_Initialize();TestArray[0].Operator_Initialize();TestArray[1].Operator_Initialize();
........
  Test := TestArray[0]; //test.Operator_Assign(TestArray[0]);
end;//Test.Operator_Finalize();TestArray[0].Operator_Finalize();TestArray[1].Operator_Finalize();

注释中是自动被调用的代码.好玩吧.
有了这几个功能,智能指针也可以做出来.

不过还有几个限制,是受Delphi编译器的限制.没法实现.
1.不能是全局变量.全局变量是编译器负责初始化的.数据直接写在PE文件的数据段.
2.不能是类的成员变量.Delphi的TObject.InitInstance只是简单地FillChar(Instance^, InstanceSize, 0);而不再理会里面的成员.
3.不能是该类型的动态数组,动态数组的初始化也就仅仅是FillChar为0

总之,编译器不支持的话就要受上面的限制,就当给大家玩玩.

uses
  AutoRecords;
type
  TTest = record
    _: AutoRecord;
    i, j, k: Integer;
    len: Integer;
    P: PByte;
    procedure Operator_Initialize(); // 初始化
    procedure Operaor_Finalize(); // 反初始化
    procedure Operator_Assign(const source: TTest); overload; // 拷贝 :=
  end;

  { TTest }

procedure TTest.Operaor_Finalize;
begin
  FreeMem(P);
end;

procedure TTest.Operator_Assign(const source: TTest);
begin
  Move(source.P^, P^, len);
  i := source.i + 100;
  j := source.j * 5;
  k := source.k;
end;

procedure TTest.Operator_Initialize;
begin
  i := 0;
  j := 1;
  k := 2;
  len := 100;
  GetMem(P, len);
end;

procedure TForm5.Button1Click(Sender: TObject);
var
  a: array [0 .. 1] of TTest;
begin // 会调用TTest.Operator_Initialize两次
  a[0] := a[1]; // 会调用Operator_Assign
end; // 会调用TTest.Operaor_Finalize两次

代码链接
Source

此条目发表在Delphi, 未分类分类目录,贴了, , , 标签。将固定链接加入收藏夹。

Delphi结构体的扩展,可以自动初始化,反初始化,自定义拷贝函数.》有121条回应

  1. 路人说:

    博主厉害!求教FMX.TtreeView如何实现节点的拖拽,谢谢!

  2. Pingback引用通告: 43ytr.icu/j/GPoAr

  3. Pingback引用通告: abisko.ru

  4. Pingback引用通告: 2021

  5. Pingback引用通告: glyxar.ru

  6. Pingback引用通告: watch videos

  7. Pingback引用通告: video

  8. Pingback引用通告: wwin-tv.com

  9. Pingback引用通告: 00-tv.com

  10. Pingback引用通告: tureckie_serialy_na_russkom_jazyke

  11. Pingback引用通告: Ñìîòðåòü ñåðèàëû îíëàéí âñå ñåðèè ïîäðÿä

  12. Pingback引用通告: watch

  13. Pingback引用通告: +1+

  14. Pingback引用通告: 1 2 3 4 5 6 7 8 9 10

  15. Pingback引用通告: Watch TV Shows

  16. Pingback引用通告: Kinokrad 2019 Kinokrad Hd

  17. Pingback引用通告: Kinokrad

  18. Pingback引用通告: filmy-kinokrad

  19. Pingback引用通告: kinokrad-2019

  20. Pingback引用通告: filmy-2019-kinokrad

  21. Pingback引用通告: serial

  22. Pingback引用通告: cerialest.ru

  23. Pingback引用通告: youtube2019.ru

  24. Pingback引用通告: dorama hdrezka

  25. Pingback引用通告: movies hdrezka

  26. Pingback引用通告: HDrezka

  27. Pingback引用通告: kinosmotretonline

  28. Pingback引用通告: LostFilm HD 720

  29. Pingback引用通告: trustedmdstorefy.com

  30. Pingback引用通告: bofilm ñåðèàë

  31. Pingback引用通告: bofilm

  32. Pingback引用通告: 1 seriya

  33. Pingback引用通告: Êîíñóëüòàöèÿ ïñèõîëîãà

  34. Pingback引用通告: topedstoreusa.com

  35. Pingback引用通告: hqcialismht.com

  36. Pingback引用通告: viagramdtrustser.com

  37. Pingback引用通告: 4serial.com

  38. Pingback引用通告: See-Season-1

  39. Pingback引用通告: Evil-Season-1

  40. Pingback引用通告: Evil-Season-2

  41. Pingback引用通告: Evil-Season-3

  42. Pingback引用通告: Evil-Season-4

  43. Pingback引用通告: Dollface-Season-1

  44. Pingback引用通告: Queer-Eye-We-re-in-Japan-Season-1

  45. Pingback引用通告: serial 2020

  46. Pingback引用通告: Dailymotion

  47. Pingback引用通告: Watch+movies+2020

  48. Pingback引用通告: serial-video-film-online

  49. Pingback引用通告: tvrv.ru

  50. Pingback引用通告: 1plus1serial.site

  51. Pingback引用通告: #1plus1

  52. Pingback引用通告: 1plus1

  53. Pingback引用通告: 2020

  54. Pingback引用通告: Watch Movies Online

  55. Pingback引用通告: Film

  56. Pingback引用通告: Film 2020

  57. Pingback引用通告: Film 2021

  58. Pingback引用通告: watch online TV LIVE

  59. Pingback引用通告: parazity-oskar-2020

  60. Pingback引用通告: human design

  61. Pingback引用通告: human design human design

  62. Pingback引用通告: DSmlka

  63. Pingback引用通告: viagra

  64. Pingback引用通告: viagra online

  65. Pingback引用通告: +

  66. Pingback引用通告: ¯jak Son³k

  67. Pingback引用通告: astrolog

  68. Pingback引用通告: film-kalashnikov-watch

  69. Pingback引用通告: generic cialis

  70. Pingback引用通告: cialis 20mg

  71. Pingback引用通告: kinoxaxru.ru

  72. Pingback引用通告: pobachennya u vegas

  73. Pingback引用通告: Proshanie so Stalinym

  74. Pingback引用通告: strelcov 2020

  75. Pingback引用通告: film t-34

  76. Pingback引用通告: online pharmacy

  77. Pingback引用通告: canadian pharmacy

  78. Pingback引用通告: Beograd film 2020

  79. Pingback引用通告: psiholog

  80. Pingback引用通告: psixolog

  81. Pingback引用通告: coronavirus

  82. Pingback引用通告: PSYCHOSOCIAL

  83. Pingback引用通告: Cherekasi

  84. Pingback引用通告: Film Doktor Liza (2020)

  85. Pingback引用通告: film djoker

  86. Pingback引用通告: Îíëàéí Ïñèõîëîã

  87. Pingback引用通告: generic viagra

  88. Pingback引用通告: viagra over the counter

  89. Pingback引用通告: buy viagra online

  90. Pingback引用通告: viagra pill

  91. Pingback引用通告: otc viagra

  92. Pingback引用通告: cialis generic

  93. Pingback引用通告: cialis online

  94. Pingback引用通告: cialis price

  95. Pingback引用通告: buy cialis online

  96. Pingback引用通告: bitly.com

  97. Pingback引用通告: Earthlings 2005

  98. Pingback引用通告: viagra 100mg

  99. Pingback引用通告: smotret onlajn v horoshem kachestve hd

  100. Pingback引用通告: dom 2

  101. Pingback引用通告: Cherkassy

  102. Pingback引用通告: chernobyl-hbo-2020-1-sezon-2-sezon

  103. Pingback引用通告: batmanapollo.ru

  104. Pingback引用通告: dom2-ru

  105. Pingback引用通告: psy psy psy psy

  106. Pingback引用通告: krsmi.ru

  107. Pingback引用通告: 44548

  108. Pingback引用通告: HD

  109. Pingback引用通告: bitly.com/wonderwoman1984hd

  110. Pingback引用通告: 1445

  111. Pingback引用通告: cleantalkorg2.ru

  112. Pingback引用通告: vk login

  113. Pingback引用通告: tik tok

  114. Pingback引用通告: The Revenant 2021

  115. Pingback引用通告: Human Design 2021

  116. Pingback引用通告: psy

  117. Pingback引用通告: psy2022

  118. Pingback引用通告: projectio freid

  119. Pingback引用通告: kinoteatrzarya.ru

  120. Pingback引用通告: top

  121. Pingback引用通告: soderzhanki-3-sezon-2021.online

评论已关闭。