Browse Source

+ Fix from Mattias gaertner for IDE support

michael 22 years ago
parent
commit
df1fa8669a
3 changed files with 78 additions and 11 deletions
  1. 20 2
      fcl/inc/classesh.inc
  2. 47 7
      fcl/inc/reader.inc
  3. 11 2
      fcl/inc/writer.inc

+ 20 - 2
fcl/inc/classesh.inc

@@ -815,13 +815,19 @@ type
 
 
   TFindMethodEvent = procedure(Reader: TReader; const MethodName: string;
   TFindMethodEvent = procedure(Reader: TReader; const MethodName: string;
     var Address: Pointer; var Error: Boolean) of object;
     var Address: Pointer; var Error: Boolean) of object;
+  TSetMethodPropertyEvent = procedure(Reader: TReader; Instance: TPersistent;
+    PropInfo: PPropInfo; const TheMethodName: string;
+    var Handled: boolean) of object;
   TSetNameEvent = procedure(Reader: TReader; Component: TComponent;
   TSetNameEvent = procedure(Reader: TReader; Component: TComponent;
     var Name: string) of object;
     var Name: string) of object;
   TReferenceNameEvent = procedure(Reader: TReader; var Name: string) of object;
   TReferenceNameEvent = procedure(Reader: TReader; var Name: string) of object;
   TAncestorNotFoundEvent = procedure(Reader: TReader; const ComponentName: string;
   TAncestorNotFoundEvent = procedure(Reader: TReader; const ComponentName: string;
     ComponentClass: TPersistentClass; var Component: TComponent) of object;
     ComponentClass: TPersistentClass; var Component: TComponent) of object;
   TReadComponentsProc = procedure(Component: TComponent) of object;
   TReadComponentsProc = procedure(Component: TComponent) of object;
-  TReaderError = procedure(Reader: TReader; const Message: string; var Handled: Boolean) of object;
+  TReaderError = procedure(Reader: TReader; const Message: string;
+    var Handled: Boolean) of object;
+  TPropertyNotFoundEvent = procedure(Reader: TReader; Instance: TPersistent;
+    var PropName: string; IsPath: boolean; var Handled, Skip: Boolean) of object;
   TFindComponentClassEvent = procedure(Reader: TReader; const ClassName: string;
   TFindComponentClassEvent = procedure(Reader: TReader; const ClassName: string;
     var ComponentClass: TComponentClass) of object;
     var ComponentClass: TComponentClass) of object;
   TCreateComponentEvent = procedure(Reader: TReader;
   TCreateComponentEvent = procedure(Reader: TReader;
@@ -835,10 +841,12 @@ type
     FFixups: TList;
     FFixups: TList;
     FLoaded: TList;
     FLoaded: TList;
     FOnFindMethod: TFindMethodEvent;
     FOnFindMethod: TFindMethodEvent;
+    FOnSetMethodProperty: TSetMethodPropertyEvent;
     FOnSetName: TSetNameEvent;
     FOnSetName: TSetNameEvent;
     FOnReferenceName: TReferenceNameEvent;
     FOnReferenceName: TReferenceNameEvent;
     FOnAncestorNotFound: TAncestorNotFoundEvent;
     FOnAncestorNotFound: TAncestorNotFoundEvent;
     FOnError: TReaderError;
     FOnError: TReaderError;
+    FOnPropertyNotFound: TPropertyNotFoundEvent;
     FOnFindComponentClass: TFindComponentClassEvent;
     FOnFindComponentClass: TFindComponentClassEvent;
     FOnCreateComponent: TCreateComponentEvent;
     FOnCreateComponent: TCreateComponentEvent;
     FPropName: string;
     FPropName: string;
@@ -894,7 +902,9 @@ type
     property Owner: TComponent read FOwner write FOwner;
     property Owner: TComponent read FOwner write FOwner;
     property Parent: TComponent read FParent write FParent;
     property Parent: TComponent read FParent write FParent;
     property OnError: TReaderError read FOnError write FOnError;
     property OnError: TReaderError read FOnError write FOnError;
+    property OnPropertyNotFound: TPropertyNotFoundEvent read FOnPropertyNotFound write FOnPropertyNotFound;
     property OnFindMethod: TFindMethodEvent read FOnFindMethod write FOnFindMethod;
     property OnFindMethod: TFindMethodEvent read FOnFindMethod write FOnFindMethod;
+    property OnSetMethodProperty: TSetMethodPropertyEvent read FOnSetMethodProperty write FOnSetMethodProperty;
     property OnSetName: TSetNameEvent read FOnSetName write FOnSetName;
     property OnSetName: TSetNameEvent read FOnSetName write FOnSetName;
     property OnReferenceName: TReferenceNameEvent read FOnReferenceName write FOnReferenceName;
     property OnReferenceName: TReferenceNameEvent read FOnReferenceName write FOnReferenceName;
     property OnAncestorNotFound: TAncestorNotFoundEvent read FOnAncestorNotFound write FOnAncestorNotFound;
     property OnAncestorNotFound: TAncestorNotFoundEvent read FOnAncestorNotFound write FOnAncestorNotFound;
@@ -976,6 +986,9 @@ type
 
 
   TFindAncestorEvent = procedure (Writer: TWriter; Component: TComponent;
   TFindAncestorEvent = procedure (Writer: TWriter; Component: TComponent;
     const Name: string; var Ancestor, RootAncestor: TComponent) of object;
     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;
 
 
   TWriter = class(TFiler)
   TWriter = class(TFiler)
   private
   private
@@ -987,6 +1000,7 @@ type
     FAncestorPos: Integer;
     FAncestorPos: Integer;
     FChildPos: Integer;
     FChildPos: Integer;
     FOnFindAncestor: TFindAncestorEvent;
     FOnFindAncestor: TFindAncestorEvent;
+    FOnWriteMethodProperty: TWriteMethodPropertyEvent;
     procedure AddToAncestorList(Component: TComponent);
     procedure AddToAncestorList(Component: TComponent);
     procedure WriteComponentData(Instance: TComponent);
     procedure WriteComponentData(Instance: TComponent);
   protected
   protected
@@ -1023,6 +1037,7 @@ type
     {!!!: procedure WriteWideString(const Value: WideString);}
     {!!!: procedure WriteWideString(const Value: WideString);}
     property RootAncestor: TComponent read FRootAncestor write FRootAncestor;
     property RootAncestor: TComponent read FRootAncestor write FRootAncestor;
     property OnFindAncestor: TFindAncestorEvent read FOnFindAncestor write FOnFindAncestor;
     property OnFindAncestor: TFindAncestorEvent read FOnFindAncestor write FOnFindAncestor;
+    property OnWriteMethodProperty: TWriteMethodPropertyEvent read FOnWriteMethodProperty write FOnWriteMethodProperty;
 
 
     property Driver: TAbstractObjectWriter read FDriver;
     property Driver: TAbstractObjectWriter read FDriver;
   end;
   end;
@@ -1504,7 +1519,10 @@ function LineStart(Buffer, BufPos: PChar): PChar;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.24  2003-06-04 15:27:24  michael
+  Revision 1.25  2003-08-16 15:50:47  michael
+  + Fix from Mattias gaertner for IDE support
+
+  Revision 1.24  2003/06/04 15:27:24  michael
   + TDataModule en InitInheritedComponent erbij voor Delphi 6 compatibility
   + TDataModule en InitInheritedComponent erbij voor Delphi 6 compatibility
 
 
   Revision 1.23  2002/10/14 19:46:50  peter
   Revision 1.23  2002/10/14 19:46:50  peter

+ 47 - 7
fcl/inc/reader.inc

@@ -911,6 +911,30 @@ var
   PropInfo: PPropInfo;
   PropInfo: PPropInfo;
   Obj: TObject;
   Obj: TObject;
   Name: String;
   Name: String;
+  Skip: Boolean;
+  Handled: Boolean;
+  OldPropName: String;
+  
+  function HandleMissingProperty(IsPath: Boolean): boolean;
+  begin
+    Result:=true;
+    if Assigned(OnPropertyNotFound) then begin
+      // user defined property error handling
+      OldPropName:=FPropName;
+      Handled:=false;
+      Skip:=false;
+      OnPropertyNotFound(Self,Instance,FPropName,IsPath,Handled,Skip);
+      if Handled and (not Skip) and (OldPropName<>FPropName) then
+        // try alias property
+        PropInfo := GetPropInfo(Instance.ClassInfo, FPropName);
+      if Skip then begin
+        FDriver.SkipValue;
+        Result:=false;
+        exit;
+      end;
+    end;
+  end;
+  
 begin
 begin
   try
   try
     Path := FDriver.BeginProperty;
     Path := FDriver.BeginProperty;
@@ -931,8 +955,11 @@ begin
         DotPos := NextPos + 1;
         DotPos := NextPos + 1;
 
 
         PropInfo := GetPropInfo(Instance.ClassInfo, FPropName);
         PropInfo := GetPropInfo(Instance.ClassInfo, FPropName);
-        if not Assigned(PropInfo) then
-          PropertyError;
+        if not Assigned(PropInfo) then begin
+          if not HandleMissingProperty(true) then exit;
+          if not Assigned(PropInfo) then
+            PropertyError;
+        end;
 
 
         if PropInfo^.PropType^.Kind = tkClass then
         if PropInfo^.PropType^.Kind = tkClass then
           Obj := TObject(GetOrdProp(Instance, PropInfo))
           Obj := TObject(GetOrdProp(Instance, PropInfo))
@@ -949,6 +976,8 @@ begin
       end;
       end;
 
 
       PropInfo := GetPropInfo(Instance.ClassInfo, FPropName);
       PropInfo := GetPropInfo(Instance.ClassInfo, FPropName);
+      if not Assigned(PropInfo) then
+        if not HandleMissingProperty(false) then exit;
       if Assigned(PropInfo) then
       if Assigned(PropInfo) then
         ReadPropValue(Instance, PropInfo)
         ReadPropValue(Instance, PropInfo)
       else
       else
@@ -987,6 +1016,7 @@ var
   IdentToIntFn: TIdentToInt;
   IdentToIntFn: TIdentToInt;
   Ident: String;
   Ident: String;
   Method: TMethod;
   Method: TMethod;
+  Handled: Boolean;
 begin
 begin
   if not Assigned(PPropInfo(PropInfo)^.SetProc) then
   if not Assigned(PPropInfo(PropInfo)^.SetProc) then
     raise EReadError.Create(SReadOnlyProperty);
     raise EReadError.Create(SReadOnlyProperty);
@@ -1030,10 +1060,17 @@ begin
         SetMethodProp(Instance, PropInfo, NullMethod);
         SetMethodProp(Instance, PropInfo, NullMethod);
       end else
       end else
       begin
       begin
-        Method.Code := FindMethod(Root, ReadIdent);
-        Method.Data := Root;
-        if Assigned(Method.Code) then
-          SetMethodProp(Instance, PropInfo, Method);
+        Handled:=false;
+        Ident:=ReadIdent;
+        if Assigned(OnSetMethodProperty) then
+          OnSetMethodProperty(Self,Instance,PPropInfo(PropInfo),Ident,
+                              Handled);
+        if not Handled then begin
+          Method.Code := FindMethod(Root, Ident);
+          Method.Data := Root;
+          if Assigned(Method.Code) then
+            SetMethodProp(Instance, PropInfo, Method);
+        end;
       end;
       end;
     tkSString, tkLString, tkAString, tkWString:
     tkSString, tkLString, tkAString, tkWString:
       SetStrProp(Instance, PropInfo, ReadString);
       SetStrProp(Instance, PropInfo, ReadString);
@@ -1268,7 +1305,10 @@ end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.7  2002-12-02 12:04:07  sg
+  Revision 1.8  2003-08-16 15:50:47  michael
+  + Fix from Mattias gaertner for IDE support
+
+  Revision 1.7  2002/12/02 12:04:07  sg
   * Fixed handling of zero-length strings (classes.inc: When converting
   * Fixed handling of zero-length strings (classes.inc: When converting
     empty strings from text forms to binary forms; reader.inc: When reading
     empty strings from text forms to binary forms; reader.inc: When reading
     an empty string from a binary serialization)
     an empty string from a binary serialization)

+ 11 - 2
fcl/inc/writer.inc

@@ -599,6 +599,7 @@ var
   SavedPropPath, Name: String;
   SavedPropPath, Name: String;
   Int64Value, DefInt64Value: Int64;
   Int64Value, DefInt64Value: Int64;
   BoolValue, DefBoolValue: boolean;
   BoolValue, DefBoolValue: boolean;
+  Handled: Boolean;
 
 
 begin
 begin
 
 
@@ -667,7 +668,12 @@ begin
         else
         else
           DefMethodCodeValue := nil;
           DefMethodCodeValue := nil;
 
 
-        if (MethodValue.Code <> DefMethodCodeValue) and
+        Handled:=false;
+        if Assigned(OnWriteMethodProperty) then
+          OnWriteMethodProperty(Self,Instance,PPropInfo(PropInfo),MethodValue,
+            DefMethodCodeValue,Handled);
+        if (not Handled) and
+          (MethodValue.Code <> DefMethodCodeValue) and
           ((not Assigned(MethodValue.Code)) or
           ((not Assigned(MethodValue.Code)) or
           ((Length(FLookupRoot.MethodName(MethodValue.Code)) >= 0))) then
           ((Length(FLookupRoot.MethodName(MethodValue.Code)) >= 0))) then
         begin
         begin
@@ -826,7 +832,10 @@ end;}
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.7  2002-09-20 09:28:11  michael
+  Revision 1.8  2003-08-16 15:50:47  michael
+  + Fix from Mattias gaertner for IDE support
+
+  Revision 1.7  2002/09/20 09:28:11  michael
   Fix from mattias gaertner
   Fix from mattias gaertner
 
 
   Revision 1.6  2002/09/07 15:15:26  peter
   Revision 1.6  2002/09/07 15:15:26  peter