Q:

what the difference between function(x: Tarray) and function(x: array of string)

What the difference between function(x: Tarray<String>) and function(x: array of string), especially what are the drawback and advantage to each variants ?

A:

First is a dynamic array parameter, second is an open array parameter.
Open array parameters usually give you the benefit to just pass the values in square brackets like so:
foobar([x, y, z]);

Since XE7 you can also initialize dynamic array that way with a little more overhead. In the end it depends on what you are doing with the values. If you are not storing them an open array parameter often is enough. However if you want to store the values in an array you cannot just assign that to any dynamic array parameter but have to copy the values.
While the syntax for a dynamic array and an open array parameter is the same (array of X) they are not assignment compatible in both directions (you can only pass a dynamic array to an open array parameter but cannot assign an open array parameter to a dynamic array variable.
One thing you should consider if you are using open array parameters on methods that you want to invoke via RTTI - that does not work because RTTI is not handling them properly - see RSP-16317.
Additionally TArray<X> should be preferred over some explicit declared array type like TXArray = array of X because TAnotherXArray = array of X would not be compatible to the TXArray but TArray<T> or an alias TXArray = TArray<T> is always type compatible.
For more info refer to Rudy's excellent article about open array parameters.

