The reason is in the name.
Copy
is a function because it is supposed to create a copy. A procedure version of Copy
would need an additional parameter, because when there is already a source, where would the target go?
Delete
is a procedure because it is supposed to delete characters from a string. For a function version of Delete
which returns the outcome of the delete operation, what should become of the source? You're calling a delete operation on it: it cannot remain unaltered.
As analogy; compare it with the procedure TRect.Offset
and the function TRect.CenterPoint
. Offset
performs an operation on the entity, where CenterPoint
reads a attribute of the entity.