Thanks for your great reply, Felipe. Superficially I follow and make sense, but I do need to understand this fundamental relationships, like X.Text being a PROPERTY and, I believe, understand what the error message said about it being a constant expression. I guess also that this has something to do of variables being in the Stack and Types in the heap (or something like that) that I read a few days ago in my effort of learning Lazarus/Free-Pascal.
No, it's not at all related to heap versus stack.
The problem is that a variable might be in the stack or in the heap, but regardless of that, it is somewhere in the RAM which can be addresses and accessed by the processor.
A property on the other hand is getter/setter pair of functions. It is not a value with an address in the RAM. Actually the property is also in the RAM, but the pointer goes to the property method, not to the data itself.
Your code:
Delete ( EntryDisplay.Text , 1 , 3) ;
Is converted by the compiler into this code:
TemporaryVar := EntryDisplay.GetText();
Delete ( TemporaryVar, 1 , 3) ;
At this point the compiler does not suppose that you want to use both directions of the property. The result of a method cannot be directly modified because it is a temporary variable. I guess that the compiler complains that the temporary variable is read-only, that's why it says that you passed a constant expression. The temporary variable is read only for safety, because anything you write to it will be lost and it might even get freed shortly.
But yes, the compiler could theorically generate the code for calling first the getter and then the setter automatically, but it is a design choice that it doesn't.