Hola,bueno para que no se pase del limite del form ,solo hay que comprobar la posicion del shape y decirle que si esta igual que el limite ,entocnes que no haga nada,algo asi:
Código:
Sub Arriba()
If p.Top <= 0.5 Then p.Top = 0.5
p.Top = p.Top - "0,5"
End Sub
ponele ese codigo a cada sub que usas,y para el de los costados,pues no se cuanto mide el form,pero podes hacer una comprobacion de en que posicion se encuentra el shape y si se pasa de tal cordenada......
y para lo otro ,podes usar una api que se llama
IntersectRect() se usa para comprobar coliciones entre objetos(cuadrados) y ahi lo podes detectar y hacer que hago lo que vos quieras,si no encontras nada yo te paso un eejmplo,pero primero busca...
saludos.