[ Foro de Pascal ]
Tengo una duda sobre cómo hacer que la pantalla aparezca con un color determinado. Resulta que hice este programa para colocar un color rojo a la pantalla:
program color;
uses CRT;
Begin
textbackground(4);
readkey;
End.
pero resulta que la pantalla sigue del mismo color, pero cuando hago:
program color;
uses CRT;
Begin
textbackground(4);
clrscr;
readkey;
End.
así, sí sale con el color deseado. ¿A qué se debe esto?, ¿alguien me puede explicar el mecanismo que usa "textbackground" para que aparezca el color determinado?, ¿por qué cuando ejecuto un programa posterior el color rojo se mantiene?.
¡Hola!
La función "textbackground" cambia el color de fondo, el que está "debajo" de las letras. De forma predeterminada está el color negrom como color de fondo.
Lo que "clrscr" hace es, como indica más o menos su nombre (ClearScreen), limpiar la pantalla, o lo que es lo mismo, ponerla todo del color de fondo establecido.
Así pues, se puede hacer lo siguiente:
program Color;
uses
crt;
begin
textbackground (red); { Color de fondo en rojo. }
ClrScr; { Limpiamos. }
textcolor (yellow); { Color de letra en amarillo. }
textbackground (blue); { Color de fondo en azul. }
writeln ('Hola. Escribo en amarillo sobre color azul');
readln; { Pulsar ENTER para salir. }
end.
Hay 16 colores en modo texto: 0 = black, ... , 15 = white.
Algunos nombres que recuerdo son: red, magenta, gray, black, white, yellow, brown, blue, lightblue, green, lightgreen, lightmagenta, lightgray, cyan y creo que lightcyan es el último.
Espero haber satisfecho tu curiosidad.
¡Ciao!
¡Wow!, muchas gracias por responder y por hacerlo tan rápido. Mi duda quedó más o menos clara, lo entendí a medias, pero te lo agradezco y mucho. Lo que sí no me quedó claro es por qué, si ejecuto un programa posterior diferente, el color rojo se mantiene. Gracias.
A partir de cambiar el "textbackground", lo que se escriba en pantalla aparecerá con ese color de fondo.
Eso afecta también al borrado de pantalla con "clrscr", que puedes pensar que se comporta como si escribieras espacios en blanco en todas las posiciones de la pantalla, de modo que todas esas posiciones se veran con el nuevo color de fondo.
El problema es que si luego ejecutas un programa posterior, nada te garantiza que ese programa no cambie los colores, ni que el sistema operativo los respete. Es decir:
- Puede que el segundo programa se vea con tus colores. (Suele pasar cuando el otro programa es una aplicación de consola sencilla, que no incluye un "uses crt" ni el equivalente de otros lenguajes).
- Puede que el segundo programa fuerce el cambio de los colores y vuelva a aparecer el fondo negro (o en otro color) en las posiciones de la pantalla en las que ese programa escriba. (Suele ocurrir si el otro programa tiene también un "uses crt" al principio o un comportamiento equivalente).
- Puede que el sistema operativo restaure los colores, de modo que los cambios que ha hecho tu programa no se conserven cuando lanzas el segundo programa, incluso aunque ese segundo programa no esté forzando ningún color concreto.
- Puede incluso que el comportamiento no sea igual en todos los sistemas: que si compilas tu programa en Linux, se respeten los colores cuando lanzas el siguiente programa, y por el contrario, que si compilas tu programa en MsDos o Windows, se pierdan los colores al lanzar el segundo problema (o al revés).
Resumiendo... tendrás que descubrirlo por "prueba y error".
Ok, entiendo lo que me explicas. Pero si eso del color de fondo del caracter es así, entonces, ¿por qué en el siguiente código comienza a aparecer el color azul, sin imprimir ningún caracter, después de la línea 25?. Aquí te dejo el código:
program colores;
uses crt;
var i: integer;
begin
textbackground(blue);
for i:=1 to 27 do
writeln;
readkey;
end.
Muchas gracias por sus respuestas.
Hola.
He probado tu código (poniendo "writeln (i);" en vez de "writeln;" en el bucle) y lo que ocurre es que a mí me da como salida lo siguiente:
- Me escribe un 1 con fondo azul, y el resto de la línea negra.
- Después, cada número en su línea, todo en fondo azul.
Ahora bien, introduciendo un "writeln;" justo antes del bucle hace que la línea que contiene al 1 no sea diferente del resto.
Sin embargo, a mí no me ocurre como a ti, a partir de la línea 25... (¿Habrá sido la compilación?)
Saludos.
No dices qué compilador usas, ni qué sistema operativo, y las cosas que caen fuera de lo que marcan los estándares pueden tener resultados impredecibles.
En principio, imagino que tus "writeln" en las 25 primeras líneas no escribirán nada... porque tu "writeln" no escribe nada.
En cambio, cuando desbordas la zona visible de la pantalla, el comportamiento no tiene por qué ser igual en todos los sistemas. Parece que en el tuyo, cada vez que introduce una línea nueva, esa sí la rellena por completo con el nuevo color... me suena que ese era el comportamiento que tenía Turbo Pascal bajo MsDos... pero quizá ese comportamiento no se repita si usas otro compilador y/o otro sistema operativo.
Si quieres que tu programa "sea previsible" (no se comporte de forma distinta en distintos sistemas):
- No permitas que llegue a escribir fuera de la zona visible de la pantalla, para evitar scrolls que no sabes cómo se van a comportar.
- Para borrar toda la pantalla con un cierto color de fondo (background) usa "clrscr".
- Para borrar hasta el final de una línea (útil en titulos o en la última línea, si quieres que toda cambie de color sin llegar a provocar un scroll), usar "clreol".
- Para el texto normal... ya sabes cómo escribir una frase en unas ciertas coordenadas (gotoxy), con un cierto color de primer plano (textcolor) y otro de fondo (textbackground).
Pero en tu caso, que quieres que la apariencia de la pantalla afecte a un programa posterior, me temo que no te va a servir de mucho, nunca podrás controlarlo del todo...
Sí, efectivamente yo uso Turbo Pascal 7 bajo MS-DOS. Gracias por las respuestas, ahora lo tengo más claro.
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)