RE:Eliminar espacios dobles.
Antonio: cualquier corrección o mejora es bienvenida, así que no, no está mal "enmendar la plana" :).
Sin embargo tu código adolece de algunos problemas. Primero el más evidente, el primer parámetro de la función delete() debe ser de tipo string, le estás pasando un char. Creo que has querido poner:
delete(cad, 1, 1);
Pero aún así estás borrando siempre el primer caracter y no es eso lo que se quiere obtener. Creo que has querido poner:
delete(cad, i, 1);
Entonces empieza a funcionar. Pero aún hay otro problema. El control del for lo haces con Length(cad) y dentro del for estás cambiando el tamaño de cad. Todo va bien hasta que encuentras un caso como este:
cad:='abc f '; { hay dos espacios después de 'c' }
El tamaño de cad es 7, cuando delete() elimina un espacio el tamaño pasa a ser 6, cuando i llega al final hace la última comparación y vuelve a entrar al while y nunca sale de allí porque está comparando cad[6] con cad[7] que no existe en cad y delete no puede eliminar un caracter que no está en cad. cad[6] y cad[7] son iguales, porque delete() ha desplazado el string a la izquierda, o sea que el espacio en cad[7] sigue estando allí, pero delete() no hace nada porque determina que i está fuera del tamaño dinámico de cad. El resultado es un ciclo infinito. Nunca se sale del while.
Y aún hay otro problemas más. cad[i-1] cuando i = 1 está señalando la posición en el string donde se guarda el tamaño dinámico del array. Supon que cad vale una cadena de caracteres de 32 caracteres de largo y el primer caracter es un espacio que en la tabla ASCII es igual a 32, entonces cad[1] = cad[1-1] es verdadero porque 32 es igual a 32, entonces el delete() procede a borrar el espacio que no está repetido. Sin embargo si la cadena mide distinto de 32 no hace eso.