Here is a patch to extend TWriter.OnWriteMethodProperty. Formerly it
gives only the ancestor code address, not the method data.
And it misses the property path, which is needed to write sub properties
like Font.OnChange.

With this patch lazarus can get rid of the dirty hack to create
methods.


Mattias
Index: rtl/objpas/classes/writer.inc
===================================================================
--- rtl/objpas/classes/writer.inc	(revision 7172)
+++ rtl/objpas/classes/writer.inc	(working copy)
@@ -625,7 +625,7 @@
   IntToIdentFn: TIntToIdent;
   FloatValue, DefFloatValue: Extended;
   MethodValue: TMethod;
-  DefMethodCodeValue: Pointer;
+  DefMethodValue: TMethod;
   WStrValue, WDefStrValue: WideString;
   StrValue, DefStrValue: String;
   AncestorObj: TObject;
@@ -710,16 +710,18 @@
       begin
         MethodValue := GetMethodProp(Instance, PropInfo);
         if HasAncestor then
-          DefMethodCodeValue := GetMethodProp(Ancestor, PropInfo).Code
-        else
-          DefMethodCodeValue := nil;
+          DefMethodValue := GetMethodProp(Ancestor, PropInfo)
+        else begin
+          DefMethodValue.Data := nil;
+          DefMethodValue.Code := nil;
+        end;
 
         Handled:=false;
         if Assigned(OnWriteMethodProperty) then
           OnWriteMethodProperty(Self,Instance,PPropInfo(PropInfo),MethodValue,
-            DefMethodCodeValue,Handled);
+            DefMethodValue,Handled);
         if (not Handled) and
-          (MethodValue.Code <> DefMethodCodeValue) and
+          (MethodValue.Code <> DefMethodValue.Code) and
           ((not Assigned(MethodValue.Code)) or
           ((Length(FLookupRoot.MethodName(MethodValue.Code)) >= 0))) then
         begin
Index: rtl/objpas/classes/classesh.inc
===================================================================
--- rtl/objpas/classes/classesh.inc	(revision 7172)
+++ rtl/objpas/classes/classesh.inc	(working copy)
@@ -1172,8 +1172,9 @@
   TFindAncestorEvent = procedure (Writer: TWriter; Component: TComponent;
     const Name: string; var Ancestor, RootAncestor: TComponent) of object;
   TWriteMethodPropertyEvent = procedure (Writer: TWriter; Instance: TPersistent;
-    PropInfo: PPropInfo; const MethodValue: TMethod;
-    const DefMethodCodeValue: Pointer; var Handled: boolean) of object;
+    PropInfo: PPropInfo;
+    const MethodValue, DefMethodValue: TMethod;
+    var Handled: boolean) of object;
 
   TWriter = class(TFiler)
   private
@@ -1232,6 +1233,7 @@
     property OnWriteStringProperty: TReadWriteStringPropertyEvent read FOnWriteStringProperty write FOnWriteStringProperty;
 
     property Driver: TAbstractObjectWriter read FDriver;
+    property PropertyPath: string read FPropPath;
   end;
 
 
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to