Delphi and presumably Free Pascal has some language inconsistency and problem/short coming concerning "Union Field" and/or "Union Property":
The (previous) presented solution (included at end of post) is inconsistent in two ways: 1. Property of union not possible. 2. Order of field and property violations "field before property" rule. (Both problems demonstrated in TDataExample3) { version 0.03 created on 14 august 2022 by Skybuck Flying: Today I remember the rule which this union field is conflicting with. The rule: "field before property" Going to demonstrate it below There are apperently two problems with this solution: 1. Property of union not possible ?!? 2. Inconsistent language design in respect to standard field + property relation (order of appearance/declaration) // ERROR "field definition not allowed after methods or properties" problem 2. } type TDataExample3 = record // mStandardField : integer; // OK // normal/standard property property StandardField : integer read mStandardField write mStandardField; mStandardField : integer; // ERROR "field definition not allowed after methods or properties" problem 2. // union property // property UnionField : int64 read mData write mData; // not possible, problem 1 // union fields case integer of // INCONSISTENT problem 2 0 : ( mData : int64 ); 1 : ( mByte : packed array[0..7] of byte ); // property UnionField : int64 read mData write mData; // not possible, problem 1 end; The original problem was: (* // ORIGINAL PROBLEM: TDataExample0 = record private mField : integer; public // UNION example case integer of 0 : ( mData : int64 ); 1 : ( mByte : packed array[0..7] of byte ); property Field read mField write mField; // DOES NOT COMPILE. end; *) // UNION DECLARATION example that does work without properties, just to check" TDataExample1 = record private mField : integer; public // UNION example case integer of 0 : ( mData : int64 ); 1 : ( mByte : packed array[0..7] of byte ); // DOES COMPILE end; Presented solution for union field in record with properties was: TDataExample2 = record private mField : integer; public // SOLUTION: property Field : integer read mField write mField; // PUT CASE STATEMENT LAST case integer of 0 : ( mData : int64 ); 1 : ( mByte : packed array[0..7] of byte ); end; Bye, Skybuck.
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal