Every ms is not accurate at small levels, like 10 ms. For larger values, like 1000ms, it's plenty accurate, so using an every 1000 ms event to create something will work fine.
Timedelta is a measurement of time. It returns, in seconds, how long the previous frame took to calculate and render. So if you're getting 1 frame per second, timedelta returns 1. If you are getting 10 frames per second, it returns 0.1, as each frame is taking a tenth of a second for the computer to make.
Set X to .X + (r * TimeDelta)
So at 1 fps, to the computer, it becomes:
Set X to .X + (r * 1)
At 10 fps:
Set X to .X + (r * 0.1)
r is the rate. That's the value you choose for the speed. 100 will move it 100 pixels per second, regardless of the frame rate.
Set X to .X + (100 * TimeDelta)
If the current x position is 0:
At 1 fps:
Set X to .X + (100 * 1) = 100
At 10 fps:
Set X to .X + (100 * 0.1) = 10
Then after one second, the sprite will be in the same position regardless of the framerate.
Did that make sense?