Search code examples
delphidelphi-xeclass-helpers

Access a strict protected property of a Delphi class?


I need to access a strict protected property, because I need to create a validation (based in the value of this property) to avoid a bug. (I don't have the source code of the third party class which has this property) only I have the definition of the class (interface) and the dcu (so I can't change the property visibility). The question is Exist a way to access a strict protected property? (I really read the Hallvard Vassbotn Blog, but I don't find anthing about this particular topic.)


Solution

  • This class helper example compiles fine :

    type
      TMyOrgClass = class
      strict private
        FMyPrivateProp: Integer;
      strict protected
        property MyProtectedProp: Integer read FMyPrivateProp;
      end;
    
      TMyClassHelper = class helper for TMyOrgClass
      private
        function GetMyProtectedProp: Integer;
      public
        property MyPublicProp: Integer read GetMyProtectedProp;
      end;
    
    function TMyClassHelper.GetMyProtectedProp: Integer;
    begin
      Result:= Self.FMyPrivateProp;  // Access the org class with Self
    end;
    

    Some more information about class helpers can be found here : should-class-helpers-be-used-in-developing-new-code

    Update

    Starting with Delphi 10.1 Berlin, accessing private or strict private members with class helpers does not work. It was considered a compiler bug and has been corrected. Accessing protected or strict protected members is still allowed with class helpers though.

    In the above example access to a private member was illustrated. Below shows a working example with access to a strict protected member.

    function TMyClassHelper.GetMyProtectedProp: Integer;
    begin
      with Self do Result:= MyProtectedProp;  // Access strict protected property
    end;