title: Delphi: how to set the length of a RTTI-accessed dynamic array using DynArraySetLength?
body: <p>I'd like to set the length of a dynamic array, as suggested in <a href="https://stackoverflow.com/questions/1770242/how-to-set-array-length-with-delphi-2010-rtti">this post</a>. I have two classes TMyClass and the related TChildClass defined as</p>
  
  <pre><code>TChildClass = class
  private
    FField1:  string;
    FField2:  string;
  end;
  
  TMyClass = class
  private
    FField1:  TChildClass;
    FField2:  Array of TChildClass;
  end;
  </code></pre>
  
  <p>The array augmentation is implemented as</p>
  
  <pre><code>var
    RContext:     TRttiContext;
    RType:        TRttiType;
    Val:          TValue;      // Contains the TMyClass instance
    RField:       TRttiField;  // A field in the TMyClass instance
    RElementType: TRttiType;   // The kind of elements in the dyn array
    DynArr:       TRttiDynamicArrayType;
    Value:        TValue;  // Holding an instance as referenced by an array element
    ArrPointer:   Pointer;
    ArrValue:     TValue;
    ArrLength:    LongInt;
    i:            integer;
  begin
    RContext := TRTTIContext.Create;
    try
      RType := RContext.GetType(TMyClass.ClassInfo);
      Val := RType.GetMethod('Create').Invoke(RType.AsInstance.MetaclassType, []);
      RField := RType.GetField('FField2');
      if (RField.FieldType is TRttiDynamicArrayType) then begin 
        DynArr := (RField.FieldType as TRttiDynamicArrayType);
        RElementType := DynArr.ElementType;
        // Set the new length of the array
        ArrValue := RField.GetValue(Val.AsObject);
        ArrLength := 3;   // Three seems like a nice number
        ArrPointer := ArrValue.GetReferenceToRawData;
        DynArraySetLength(ArrPointer, ArrValue.TypeInfo, 1, @ArrLength);
        { TODO : Fix 'Index out of bounds' }
        WriteLn(ArrValue.IsArray, ' ', ArrValue.GetArrayLength);
        if RElementType.IsInstance then begin
          for i := 0 to ArrLength - 1 do begin
            Value := RElementType.GetMethod('Create').Invoke(RElementType.AsInstance.MetaclassType, []);
            ArrValue.SetArrayElement(i, Value);
            // This is just a test, so let's clean up immediatly
            Value.Free;
          end;
        end;
      end;
      ReadLn;
      Val.AsObject.Free;
    finally
      RContext.Free;
    end;
  end.
  </code></pre>
  
  <p>Being new to D2010 RTTI, I suspected the error could depend on getting ArrValue from the class instance, but the subsequent <code>WriteLn</code> prints "TRUE", so I've ruled that out. Disappointingly, however, the same <code>WriteLn</code> reports that the size of ArrValue is 0, which is confirmed by the "Index out of bounds"-exception I get when trying to set any of the elements in the array (through <code>ArrValue.SetArrayElement(i, Value);</code>). Do anyone know what I'm doing wrong here? (Or perhaps there is a better way to do this?) TIA!</p>