You can specify the value in the
call opcode but
delegatecall only lets you specify the gas.
When you specify a
value, you are transferring ETH from the calling contract to the called contract. But delegatecall doesn't actually switch which contract is running, instead it loads the other contract's code and runs it as if it was the calling contract.
For example, if you
call Michael Jordan to dunk the basketball, it makes sense to pass him the basketball at the same time (
msg.value) so he can dunk it.
However, if you are
delegatecall loading Stephen Curry brain into yours so you yourself can make a three point shot from where you stand, then it's you're body that will be making the shot, and it makes no sense to first pass the ball to Stephen Curry.