[fpc-devel] State of extended RTTI

Boian Mitov mitov at mitov.com
Mon Feb 18 21:02:33 CET 2013


As example this enumerates all attributes of certain type for any public or 
published member (function, field, or property) for a component:


for LMember in TRTRtti.GetType( Component.ClassType() ).GetMembers( 
[mvPublic, mvPublished] ) do
  for LAtrribute in LMember.GetAttributes( TMyCustomAttributeType, True ) do

You can see how much can be achieved with almost no code :-D  and this is 
just the tip of the iceberg ;-) . It supports filtering with lambdas, and in 
general is designed in the principles of functional programming, so you can 
as example filter like this:

AAttributes := TRTRtti.GetType( 
Component.ClassType() ).GetCustomAttributes( 
TVLCommonFilterHostedPreviewAttribute, True );
for AAttribute in AAttributes do
  if( AAttribute is TLPComponentEditorAttribute ) then
    begin
    AAttrItem := GComponentEditorAttributeList.Find(
                      function( AItem : IComponentEditorAttributeItem ) : 
Boolean
                      var
                        AAttributes       : IRTAttributes;
                        AAttributeClass   : TCustomAttributeClass;

                      begin
                        AAttributeClass := 
AItem.GetInstance().AttributeClass;
                        AAttributes := TRTRtti.GetType( 
Component.ClassType() ).GetCustomAttributes( TLPSuppressAttributeAttribute, 
True );
                        if( AAttributes.Find(
                                function ( ASupressAttribute : 
TCustomAttribute ) : Boolean
                                begin
                                  Result := ( AAttributeClass = 
TLPSuppressAttributeAttribute( ASupressAttribute ).Attribute );
                                end
                              ) <> NIL ) then
                          Exit( False );

                        Result := ( AAttribute is AAttributeClass );
                      end
                   );

    Exit( AAttrItem.GetInstance().ComponentEditor.Create( Component, 
Designer ));
    end;

This actually is a real piece of code from a place we use the new RTTI ;-)

With best regards,
Boian Mitov

-------------------------------------------------------
Mitov Software
www.mitov.com
-------------------------------------------------------
-----Original Message----- 
From: Boian Mitov
Sent: Monday, February 18, 2013 11:49 AM
To: FPC developers' list
Subject: Re: [fpc-devel] State of extended RTTI

    Hi Sven,

It is an abstraction API that on the low side is 100% compatible with the
Delphi API, as it uses it to access the information, but on the user side
presents extremely easy to use API. It is probably better than anything
available in the world at the moment, and light years ahead of both the
Microsoft .NET RTTI API and the Embarcadero RTTI API. Being abstraction
layer it also can be hooked on anything you have on the back end without
breaking the code.

With best regards,
Boian Mitov

-------------------------------------------------------
Mitov Software
www.mitov.com
-------------------------------------------------------
-----Original Message----- 
From: Sven Barth
Sent: Monday, February 18, 2013 11:37 AM
To: fpc-devel at lists.freepascal.org
Subject: Re: [fpc-devel] State of extended RTTI

On 18.02.2013 20:30, Boian Mitov wrote:

How compatible to Delphi's API is your API? If it is not compatible,
then it would not be of much use to us. Please note that we would in any
case only use the API itself, as we might not implement the binary
layout of the RTTI necessarily the same as Delphi did.

_______________________________________________
fpc-devel maillist  -  fpc-devel at lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel 




More information about the fpc-devel mailing list