在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
转载:http://www.raysoftware.cn/?p=518&utm_source=tuicool恭贺Delphi XE7诞生,Delphi XE7在编译器内部集成了我之前所实现的动态数组扩展.http://www.raysoftware.cn/?p=278 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; 实现了一个结构体的初始化,反初始化,拷贝的自动调用单元. 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编译器的限制.没法实现. 总之,编译器不支持的话就要受上面的限制,就当给大家玩玩. 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两次 代码链接 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论