<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Nov 28, 2016 at 3:25 PM, silvioprog <span dir="ltr"><<a href="mailto:silvioprog@gmail.com" target="_blank">silvioprog@gmail.com</a>></span> wrote:</div><div class="gmail_quote">[...]<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div>Anyway including (Get)SetDynArrayProp() to typinfo solve the problem because it can check if property's set is a field or a method.</div></div></div></blockquote></div><div class="gmail_extra"><br></div><div class="gmail_extra">This version (inspired by FPC's SetRawInterfaceProp()) can handle property (indexed or not) setting fields or methods:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">procedure SetDynArrayProp(AInstance: TObject; APropInfo: PPropInfo; const AValue: Pointer);</div><div class="gmail_extra">type</div><div class="gmail_extra">  TSetPointerProcIndex=procedure(index:longint;const i:Pointer) of object;</div><div class="gmail_extra">  TSetPointerProc=procedure(i:Pointer) of object;</div><div class="gmail_extra">var</div><div class="gmail_extra">  AMethod: TMethod;</div><div class="gmail_extra">begin</div><div class="gmail_extra">  case (APropInfo^.PropProcs shr 2) and 3 of</div><div class="gmail_extra">    ptField:</div><div class="gmail_extra">      CopyArray(PPointer(Pointer(AInstance)+PtrUInt(APropInfo^.SetProc)), @AValue, APropInfo^.PropType, 1);</div><div class="gmail_extra">    ptStatic,</div><div class="gmail_extra">    ptVirtual:</div><div class="gmail_extra">      begin</div><div class="gmail_extra">        if ((APropInfo^.PropProcs shr 2) and 3)=ptStatic then</div><div class="gmail_extra">          AMethod.Code:=APropInfo^.SetProc</div><div class="gmail_extra">        else</div><div class="gmail_extra">          AMethod.Code:=PCodePointer(Pointer(AInstance.ClassType)+PtrUInt(APropInfo^.SetProc))^;</div><div class="gmail_extra">        AMethod.Data:=AInstance;</div><div class="gmail_extra">        if ((APropInfo^.PropProcs shr 6) and 1)<>0 then</div><div class="gmail_extra">          TSetPointerProcIndex(AMethod)(APropInfo^.Index,AValue)</div><div class="gmail_extra">        else</div><div class="gmail_extra">          TSetPointerProc(AMethod)(AValue);</div><div class="gmail_extra">      end;</div><div class="gmail_extra">  end;</div><div class="gmail_extra">end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">It can be a starting for implementing it at typinfo definitively.</div></div><div class="gmail_extra"><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div>Silvio Clécio</div></div></div>
</div></div>