Register a new Type : ArrayOf_SomeClass

Hi, 
Firstly, i hope everyone is doing well. Be safe and thanks to all people still working despite pandemic. 
I am working on your Scripter engine and need your help.
I want to register a new Type into Scripter. I have a USER and an ARRAYOF_USER:


TMy_User = class
private
    fFirstName: String;
    fLastName: String;
    fGender: String;
    fAge: Integer;
public
    property FirstName: String read fFirstName;
    property LastName: String read fLastName;
    property Gender: String read fGender;
    property Age: String read fAge;    
end;
TArrayOf_My_User = array of TMy_User;

also have another class to call a function for getting TArrayOf_My_User as:
    
    class function GetUserList(const SomeParams: String): TArrayOf_My_User;

I made an another library to define them for Scripter; 

procedure TMyScriptterLib.__VM_GetUserList(aMachine: TatVirtualMachine);
var aResult : TArrayOf_My_User;
begin
    with AMachine do
    begin
        aResult := TMyApi.GetUserList(GetInputArgAsString(0));
        ReturnOutputArg(aResult);
    end;
end;
procedure TMyScriptterLib.Init;
begin
    with Scripter.DefineClass(TMy_User) do
    begin
        DefineProp('FirstName', atScript.tkString, TMyScriptterLib.__VM_My_User_Get_FirstName, nil, nil, False, 0);
        DefineProp('LastName', atScript.tkString, TMyScriptterLib.__VM_My_User_Get_LastName, nil, nil, False, 0);
        DefineProp('Gender', atScript.tkString, TMyScriptterLib.__VM_My_User_Get_Gender, nil, nil, False, 0);
        DefineProp('Age', atScript.tkInteger, TMyScriptterLib.__VM_My_User_Get_Age, nil, nil, False, 0);
    end;
    Scripter.DefineMethod('GetUserList', 1, atScript.tkVariant, nil, TMyScriptterLib.__VM_GetUserList, False);
  Scripter.DefineRecord(TypeInfo(TArrayOf_My_User), 'TArrayOf_My_User');
end;

I can use TMy_User from Scripter but when i call GetUserList and tried to get an array, scripter returns an integer value which i can't use. Sample:

procedure ScriptterForm1_Button3_OnClick(Sender : TObject);
var sResult : String;
    i : Integer;
    aUsers : TArrayOf_My_User;
    aUser : TMy_User;
begin 
  aUsers := GetUserList(ScriptterForm1.MaskEdit3.Text);
  if Assigned(aUsers) then
  begin
    for i := 0 to High(aUsers) do /// Crash HERE  -- ShowMessage(aUsers) -> Returns: 354471371 some Pointer Adress
    begin                             
      aUser := aUsers; 
      aResult := aResult + Chr(13) + Chr(10) + Format('%d: %s - %s - %d', [i, aUser.FirstName, aUser.LastName, aUser.Age]);
    end;
  end
end;

Where am i doing wrong?

Scripter only know about Variant arrays. You should convert your TArrayOf_My_User to a Variant array and then return it:




procedure TForm5.__VM_GetUserList(aMachine: TatVirtualMachine);
var
  aResult : TArrayOf_My_User;
  aVarArray: Variant;
  I: Integer;
begin
  with AMachine do
  begin
    aResult := TMyApi.GetUserList(GetInputArgAsString(0));
    aVarArray := VarArrayCreate([0, Length(aResult) - 1], varVariant);
    for I := 0 to Length(aResult) - 1 do
      aVarArray := ObjectToVar(aResult);
    ReturnOutputArg(aVarArray);
  end;
end;


It works fine.

Thank you so much.