El formato de val es:
Val (cadena, nro, codigoRespuesta);
cadena: es el string que queres convertir.
nro: es el nro convertido, es decir, un integer o real.
codigoRespuesta: es un integer que te retorna 0 si la conversión fue exitosa, si es mayor a cero indica la posición del primer caracter de la cadena que impide la conversión.
Por lo tanto si queres chequear que el valor sea entre 0 y 9999 debías fijarte que el codigoRespuesta sea cero, y si lo es el nro debe estar entre 0 y 9999, porque podría ser mayor o negativo.
algo asi como:
val(elString, elNro, codR);
If codR = 0 and elNro >= 0 and elNro <= 9999 Then
writeln ('ok');
Depende como lo hagas, tambien podrías ir pidiendo caracter a caracter y chequear que sea lo que necesitas, por ejemplo
If caracter in ['0'..'9'] then
writeln ('Es un numero');
If Upcase(caracter) in ['A'..'Z'] then
writeln ('Es una letra');
Espero te sirva.
Saludos!