tag:blogger.com,1999:blog-29331675.post7052694347184259861..comments2024-03-05T17:37:00.995+01:00Comments on The Delphi Geek: Implementing Record Assignment Operator [1]gabr42http://www.blogger.com/profile/06903558857617342477noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-29331675.post-14945638623218455242016-11-10T09:24:52.211+01:002016-11-10T09:24:52.211+01:00'operator :=' is not a syntax supported by...'operator :=' is not a syntax supported by Delphi.gabr42https://www.blogger.com/profile/06903558857617342477noreply@blogger.comtag:blogger.com,1999:blog-29331675.post-24505857659301101052016-11-09T18:43:27.538+01:002016-11-09T18:43:27.538+01:00Dirty hack, but works :D
program project1;
type
...Dirty hack, but works :D<br /><br />program project1;<br />type<br /> Tfoo=record<br /> a: string;<br /> end;<br /> Tbar = record<br /> a: string;<br /> end;<br /> // I use two equivalent types<br /> <br /> // and two assigment op's: bar->foo and foo->bar: <br /> operator := (foo: TFoo): TBar;<br /> begin<br /> result.a:=foo.a;<br /> end;<br /> operator := (bar: TBar): TFoo;<br /> begin<br /> result.a := bar.a;<br /> end;<br />var<br /> a,b:Tfoo;<br />begin<br /> a.a:='a';<br /> b.a:='b';<br /> a := b;<br /> writeln(a.a);<br /> readln;<br />end. Anonymoushttps://www.blogger.com/profile/16961686107526206647noreply@blogger.comtag:blogger.com,1999:blog-29331675.post-35780990502978185042015-01-09T19:23:44.750+01:002015-01-09T19:23:44.750+01:00There's not really much on the topic of record...There's not really much on the topic of records here.gabr42https://www.blogger.com/profile/06903558857617342477noreply@blogger.comtag:blogger.com,1999:blog-29331675.post-71731920340185591922015-01-09T15:53:18.062+01:002015-01-09T15:53:18.062+01:00Obviously a source for lots for debugging :-PObviously a source for lots for debugging :-PJørn E. Angeltveithttps://www.blogger.com/profile/17894986324482699893noreply@blogger.comtag:blogger.com,1999:blog-29331675.post-12617871493452937092015-01-09T15:50:32.279+01:002015-01-09T15:50:32.279+01:00If you go through pointers, you can have something...If you go through pointers, you can have something like this.<br />(You need to add @ in front of the records you want to run through the custom assignment)<br /><br /><br /><br />type<br /> TRec = record<br /> private<br /> FData : integer;<br /> public<br /> constructor Create(iData: integer);<br /> class operator Implicit(aSource: Pointer): TRec;<br /> end;<br /><br />//-----<br /><br />class operator TRec.Implicit(aSource: Pointer): TRec;<br />type<br /> TTempRec = type TRec;<br />begin<br /> Result.FData := TTempRec(aSource^).FData + 1;<br />end;<br /><br />//-----<br /><br />procedure Test;<br />var<br /> rec1, rec2, rec3: TRec;<br />begin<br /> rec1 := TRec.Create(42);<br /> rec2 := rec1; //Plain assignment<br /> rec3 := @rec1; //Custom assignment<br /><br /><br /> Writeln('rec1.FData = ', rec1.FData);<br /> Writeln('rec2.FData = ', rec2.FData);<br /> Writeln('rec3.FData = ', rec3.FData);<br />end;<br /><br />//-----<br /><br /><br />Gives you:<br /><br />rec1.FData = 42 <br />rec2.FData = 42 <br />rec3.FData = 43 <br /><br />Jørn E. Angeltveithttps://www.blogger.com/profile/17894986324482699893noreply@blogger.comtag:blogger.com,1999:blog-29331675.post-65710533084112591612015-01-09T13:39:18.113+01:002015-01-09T13:39:18.113+01:00I believe this one is the most appropriate - http:...I believe this one is the most appropriate - http://sergworks.wordpress.com/2013/12/17/goodbye-tobject/Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-29331675.post-82755240719996713402015-01-09T13:16:23.747+01:002015-01-09T13:16:23.747+01:00Serge, do you have any blog post on that? I'm ...Serge, do you have any blog post on that? I'm collecting various alternative (and better) solutions for the next post on that topic.gabr42https://www.blogger.com/profile/06903558857617342477noreply@blogger.comtag:blogger.com,1999:blog-29331675.post-55525560982994021092015-01-09T12:36:02.666+01:002015-01-09T12:36:02.666+01:00@Jorn: no, assignment can be overloaded in C++ but...@Jorn: no, assignment can be overloaded in C++ but not in Delphi.<br /><br />@Gabr: instead of using a dummy interface to intercept an assignment why not to move a record data into an instance implementing interface? this is essentially a basic idea of my TForge project. You get solid automatic memory management with clear and safe "user" code, and very interesting and highly effective "engine" code.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-29331675.post-28684134384998518922015-01-09T12:23:44.051+01:002015-01-09T12:23:44.051+01:00Ah. Just figured that the operator overloading is ...Ah. Just figured that the operator overloading is intended for different datatypes and not similar datatypes. I had the impression that it was possible to override default behaviour as well...Jørn E. Angeltveithttps://www.blogger.com/profile/17894986324482699893noreply@blogger.comtag:blogger.com,1999:blog-29331675.post-29745362680507517082015-01-09T12:23:34.807+01:002015-01-09T12:23:34.807+01:00Explicit is only triggered when typecast is involv...Explicit is only triggered when typecast is involved.<br /><br />Implicit is a good idea, but it doesn't work.<br /><br />class operator Implicit(const a: TRec): TRec;<br /><br />[DCC Error] CatchAssignment.dpr(39): E2521 Operator 'Implicit' must take one 'TRec' type in parameter or result typegabr42https://www.blogger.com/profile/06903558857617342477noreply@blogger.comtag:blogger.com,1999:blog-29331675.post-68538950040032561162015-01-09T12:11:42.732+01:002015-01-09T12:11:42.732+01:00Could this be solved with operator overloading?
Li...Could this be solved with operator overloading?<br />Like this example: https://plus.google.com/+Asbj%C3%B8rnHeid/posts/KnR9pUPTy7P<br /><br />Or will Implicit/Explicit only be triggered when there's a typecast involved? Jørn E. Angeltveithttps://www.blogger.com/profile/17894986324482699893noreply@blogger.com