Ecco qua...
il tuo ragionamento era quasi corretto...
cosi dovrebbe funzionare, cioè si blocca ai margini del form:
************
Dim carattere As String
Private Sub Form_KeyPress(KeyAscii As Integer)
carattere = Chr(KeyAscii)
carattere = LCase(carattere)
End Sub
Private Sub Timer1_Timer()
If carattere = "a" And (ball.Left - 25) > 0 Then
'vai a sinistra
ball.Left = ball.Left - 25
End If
If carattere = "d" And (ball.Left + 25 + ball.Width) < Form1.ScaleWidth Then
'vai a destra
ball.Left = ball.Left + 25
End If
If carattere = "e" And (ball.Top - 25) > 0 Then
'vai in alto
ball.Top = ball.Top - 25
End If
If carattere = "x" And (ball.Top + 25 + ball.Height) < Form1.ScaleHeight Then
'vai in baso
ball.Top = ball.Top + 25
End If
If carattere = "w" And (ball.Top - 25) > 0 And (ball.Left - 25) > 0 Then
'vai in diagonale sinistra-alto
ball.Top = ball.Top - 25 'in alto
ball.Left = ball.Left - 25 'a sinistra
End If
If carattere = "r" And (ball.Top - 25) > 0 And (ball.Left + 25 + ball.Width) < Form1.ScaleWidth Then
'vai in diagonale destra-alto
ball.Top = ball.Top - 25 'in alto
ball.Left = ball.Left + 25 'a destra
End If
If carattere = "z" And (ball.Top + 25 + ball.Height) < Form1.ScaleHeight And (ball.Left - 25) > 0 Then
'vai in diagonale sinistra-basso
ball.Top = ball.Top + 25 'in basso
ball.Left = ball.Left - 25 'a sinistra
End If
If carattere = "c" And (ball.Top + 25 + ball.Height) < Form1.ScaleHeight And (ball.Left + 25 + ball.Width) < Form1.ScaleWidth Then
'vai in diagonale destra-basso
ball.Top = ball.Top + 25 'in basso
ball.Left = ball.Left + 25 'a destra
End If
carattere = ""
End Sub
****************************
... forse è meglio se te lo spiego un po...
allora quando il controllo arriva sul margine sinistro il valore left è uguale a 0, cosi anche quando arriva sul margine superiore del form il valore di top è 0, quindi io non faccio altro prima di far muovere il pezzo di verificare se con lo spostamento (in alto e a sinistra) il valore di top o di left non è minore di 0, altrimenti vuol dire che esco fuori dal margine.
Per controllare invece se sono arrivato al margine destro o in basso, verifico che il valore di left+la sua altezza +25(unità di movimento) non superino il margine del form(scaleHeight)per il basso, mentre per la destra, lo stesso discorso solo che devi lavorare con scalewidth.
Per i movimenti in diagonale interseca le operazioni destra-alto sinistra-basso ecc....
spero di essere stato chiaro.