恭贺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
博主厉害!求教FMX.TtreeView如何实现节点的拖拽,谢谢!
Pingback引用通告: 43ytr.icu/j/GPoAr
Pingback引用通告: abisko.ru
Pingback引用通告: 2021
Pingback引用通告: glyxar.ru
Pingback引用通告: watch videos
Pingback引用通告: video
Pingback引用通告: wwin-tv.com
Pingback引用通告: 00-tv.com
Pingback引用通告: tureckie_serialy_na_russkom_jazyke
Pingback引用通告: Ñìîòðåòü ñåðèàëû îíëàéí âñå ñåðèè ïîäðÿä
Pingback引用通告: watch
Pingback引用通告: +1+
Pingback引用通告: 1 2 3 4 5 6 7 8 9 10
Pingback引用通告: Watch TV Shows
Pingback引用通告: Kinokrad 2019 Kinokrad Hd
Pingback引用通告: Kinokrad
Pingback引用通告: filmy-kinokrad
Pingback引用通告: kinokrad-2019
Pingback引用通告: filmy-2019-kinokrad
Pingback引用通告: serial
Pingback引用通告: cerialest.ru
Pingback引用通告: youtube2019.ru
Pingback引用通告: dorama hdrezka
Pingback引用通告: movies hdrezka
Pingback引用通告: HDrezka
Pingback引用通告: kinosmotretonline
Pingback引用通告: LostFilm HD 720
Pingback引用通告: trustedmdstorefy.com
Pingback引用通告: bofilm ñåðèàë
Pingback引用通告: bofilm
Pingback引用通告: 1 seriya
Pingback引用通告: Êîíñóëüòàöèÿ ïñèõîëîãà
Pingback引用通告: topedstoreusa.com
Pingback引用通告: hqcialismht.com
Pingback引用通告: viagramdtrustser.com
Pingback引用通告: 4serial.com
Pingback引用通告: See-Season-1
Pingback引用通告: Evil-Season-1
Pingback引用通告: Evil-Season-2
Pingback引用通告: Evil-Season-3
Pingback引用通告: Evil-Season-4
Pingback引用通告: Dollface-Season-1
Pingback引用通告: Queer-Eye-We-re-in-Japan-Season-1
Pingback引用通告: serial 2020
Pingback引用通告: Dailymotion
Pingback引用通告: Watch+movies+2020
Pingback引用通告: serial-video-film-online
Pingback引用通告: tvrv.ru
Pingback引用通告: 1plus1serial.site
Pingback引用通告: #1plus1
Pingback引用通告: 1plus1
Pingback引用通告: 2020
Pingback引用通告: Watch Movies Online
Pingback引用通告: Film
Pingback引用通告: Film 2020
Pingback引用通告: Film 2021
Pingback引用通告: watch online TV LIVE
Pingback引用通告: parazity-oskar-2020
Pingback引用通告: human design
Pingback引用通告: human design human design
Pingback引用通告: DSmlka
Pingback引用通告: viagra
Pingback引用通告: viagra online
Pingback引用通告: +
Pingback引用通告: ¯jak Son³k
Pingback引用通告: astrolog
Pingback引用通告: film-kalashnikov-watch
Pingback引用通告: generic cialis
Pingback引用通告: cialis 20mg
Pingback引用通告: kinoxaxru.ru
Pingback引用通告: pobachennya u vegas
Pingback引用通告: Proshanie so Stalinym
Pingback引用通告: strelcov 2020
Pingback引用通告: film t-34
Pingback引用通告: online pharmacy
Pingback引用通告: canadian pharmacy
Pingback引用通告: Beograd film 2020
Pingback引用通告: psiholog
Pingback引用通告: psixolog
Pingback引用通告: coronavirus
Pingback引用通告: PSYCHOSOCIAL
Pingback引用通告: Cherekasi
Pingback引用通告: Film Doktor Liza (2020)
Pingback引用通告: film djoker
Pingback引用通告: Îíëàéí Ïñèõîëîã
Pingback引用通告: generic viagra
Pingback引用通告: viagra over the counter
Pingback引用通告: buy viagra online
Pingback引用通告: viagra pill
Pingback引用通告: otc viagra
Pingback引用通告: cialis generic
Pingback引用通告: cialis online
Pingback引用通告: cialis price
Pingback引用通告: buy cialis online
Pingback引用通告: bitly.com
Pingback引用通告: Earthlings 2005
Pingback引用通告: viagra 100mg
Pingback引用通告: smotret onlajn v horoshem kachestve hd
Pingback引用通告: dom 2
Pingback引用通告: Cherkassy
Pingback引用通告: chernobyl-hbo-2020-1-sezon-2-sezon
Pingback引用通告: batmanapollo.ru
Pingback引用通告: dom2-ru
Pingback引用通告: psy psy psy psy
Pingback引用通告: krsmi.ru
Pingback引用通告: 44548
Pingback引用通告: HD
Pingback引用通告: bitly.com/wonderwoman1984hd
Pingback引用通告: 1445
Pingback引用通告: cleantalkorg2.ru
Pingback引用通告: vk login
Pingback引用通告: tik tok
Pingback引用通告: The Revenant 2021
Pingback引用通告: Human Design 2021
Pingback引用通告: psy
Pingback引用通告: psy2022
Pingback引用通告: projectio freid
Pingback引用通告: kinoteatrzarya.ru
Pingback引用通告: top
Pingback引用通告: soderzhanki-3-sezon-2021.online