On Sat, 14 Jan 2023, Wayne Sherman wrote:

On Fri, Jan 13, 2023 at 11:48 PM Michael Van Canneyt wrote:
Markpropertychanged is called in the setter of the properties generated by
the code generator: Check all generated units.

Thanks for your explanations, it is getting more clear how modified
property tracking is being used.

More clarification please.  MarkPropertyChanged offsets the property
changed index (to TBits) by the ClassParent total property count, but
IsPropertyModified does not take this offset into account.  Consider
this example:

TBaseObject --> TGoogleBaseObject --> TSchema --> TMySchema
TBaseObjectClass = Class of TBaseObject;

If the object is TMySchema, in GetParentPropCount the TBits index gets
offset by (see reference code below):
 TBaseObjectClass(TSchema).GetTotalPropCount;
If the object is TSchema, the TBits index gets offset by:
 TBaseObjectClass(TGoogleBaseObject).GetTotalPropCount;

Questions:
1) Since the ClassParent is always cast as TBaseObjectClass isn't this
the same as just TBaseObjectClass(Self.ClassType)?

No. The method is virtual, so the actual descendant's method is called.


2) Doesn't each object already have the parent properties included in
its own properties by inheritance?

Why this question ? An object does not know the property count of the parent.



3) Why does MarkPropertyChanged offset the index and
IsPropertyModified does not take the offset into account?

They should be the same. I don't remember why I created the two methods
differently.

Michael.


Reference for above questions:

class function TBaseObject.GetParentPropCount: Integer;
begin
 if (ClassParent=TBaseObject) or (ClassParent=Nil) then
   Result:=0
 else
   Result:=TBaseObjectClass(ClassParent).GetTotalPropCount;
end;

procedure TBaseObject.MarkPropertyChanged(AIndex: Integer);
begin
 If Assigned(FBits) then
   FBits.SetOn(GetParentPropCount+(AIndex shr IndexShift));
end;

function TBaseObject.IsPropertyModified(Info: PPropInfo): Boolean;
begin
 Result:=Not Assigned(FBits) or FBits.Bits[Info^.NameIndex]
end;

</end reference code>

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to