It depends. It is actually described in the online help, but here it goes.
In 32-bit Windows executables (i.e., code compiled with WIN32 installed), if the record does not exceed 32-bit register, it is pushed onto the stack as-is, that is, passed by value. If the record is larger than the register, then the pointer to the record is passed, that is, passed by reference. That is, for a standard register calling convention. This may be different for other platforms or for calling conventions, but this is most likely a common case.
DocWiki :
Constant parameters can be passed to the function by value or by reference, depending on the particular compiler used. To force the compiler to pass a constant parameter by reference, you can use the [Ref] decorator with the const keyword.
But see also the Delphi Language Guide . It describes how all kinds of parameters are transmitted, for example
Records, records, and static arrays of 1, 2, or 4 bytes are transmitted as 8-bit, 16-bit, and 32-bit values. Large sets, records, and static arrays are passed as 32-bit value pointers. An exception to this rule is that records are always passed directly to the stack under the conventions cdecl, stdcall and safecall; the size of the record passed in this way is rounded up to the nearest border of the double word.
This has changed for new compilers.
But, of course, you can always refer to the CPU view. There you can see what is happening.