La Web del Programador: Comunidad de Programadores
 
    Pregunta:  26031 - MANEJAR LA LINEA 25 BAJO MSDOS
Autor:  David López Núñez
Estoy desarrollando una pequeña base de datos bajo turbo c 3.0, y para hacer mas sencilla la tarea de meter datos, he creado una funcion de "prompt", que indica diversos mensajes sobre el estado del programa.
Así, me gustaría que alguien me explicara como manejar la linea 25, sin que se produzca un retorno de carro. Actualmente estoy jugando con la posibilidad de utilizar la funcion poke() y trabajar asi directamente sobre la memoria de video, pero me gustaria conocer vuestra opinion, o vuestro codigo si ya habeis hecho algo asi.
Salu2. David.

  Respuesta:  David López Núñez
Por si a alguien le interesa, (supongo que unicamente los estudiantes de c/c++ que usan C 16bit), finalmente he implementado el siguiente codigo en mi programa:

#include

void prompt(char *mensaje)
{
char far *p=(char *)0xb8000000;
int i, j=1;
unsigned char caracter;

*((80*24*2)+p)=mensaje[0];
*((80*24*2)+p+1)=78;

for(i=0; i*((80*24*2)+(i*2)+2+p)=mensaje[j++];
*((80*24*2)+(i*2)+p+2+1)=78; /* byte de atributo */
}

for(i=strlen(mensaje); i<80; i++) {
*((80*24*2)+(i*2)+p+2)=' ';
*((80*24*2)+(i*2)+p+2+1)=78;
}
}

...que me permite escribir cualquier mensaje en la linea 25, con letras de primer plano amarillas y fondo rojo. Si alguien quiere cambiar el color solo tiene que jugar con el byte de atributo.

P.D: Prometo pasarme a VC++ cuanto antes y evitar estos problemas :-))

  Respuesta:  Luis Machuca
Hola David.
DOS no es muy flexible en cuanto al manejo de la línea 25, y muchas aplicaciones lo que hacen es limitar l amuestra de datos dinámicos hasta la línea 23 o 24, y usar la línea 25 sólo para mostrar datos semiestáticos (como una barra de estado de Windows, o como la misma barra de estado del Turbo C).
Para manejar bien esa línea he usado estas dos opciones:

1. Imprimo en pantalla el contenido d ela línea 25 en la línea 24, y a continuación uso la función "insline()" (no sé si está disponible en todos los ordenadores) para correr esa línea hacia abajo sin afectar a las líneas anteriores. Después imprimo la línea 24 completa, pongo un retorno de carro al final lo que corre la línea 25 a lalínea 26 (fuera de la pantalla), después uso la función "delline" para devolver una línea el scroll de la pantalla y que la línea 25 aparezca "pegada" a la 24.

2.- A la primera pasada de la pantalla, colócate al final de la línea 25 e imprime UNA LINEA COMPLETA de espacios u otro caracter similar. Después si necesitas imprimir en la línea 25 sólo cuídate de imprimir siempre hasta antes de la columna 79, para que no te haga un retorno de carro.

Esas son las soluciones que conozco. Hay soluciones mucho mejores pero involucran conocimientos de la memoria de la pantalla y la BIOS. En cuanto al uso de poke() me parece buena idea pero debes checar siempre de antemano el byte que vas a poner, ciertos valores en la memoria cambian cosas más allá.

Suerte David, espero te sirva.

  Respuesta:  Jesús Antón Martín
Me parece que tu problema está en la función scanf. No utilices las funciones estándar para recoger la entrada.

Recoge carácter a carácter la edición del usuario. Necesitarás una tabla con los códigos ascii de cada tecla (cursores, inicio, fin, supr, backspace) para dotar de capacidades de edición a tu programa.

Flecha Arriba: 72
Flecha Abajo: 80
Flecha Izquierda: 75
Flecha Derecha: 77
BackSpace: 9
Tab: 8

No dispongo ahora mismo de las demás. Cuando una tecla es especial (como las que listo arriba) produce un código doble, la función getch() retorna primero un cero y luego el carácter correspondiente.

Deberías considerar la opción de hacer la aplicación para windows, usando diálogos. Si no tienes compilador para windows, pásate por las siguientes direcciones:

http://www.bloodshed.net
http://www.cs.virginia.edu/~lcc-win32/

El primero es de C y C++, y el segundo sólo de C. Ambos tienen buenos ejemplos para aprender.

Un saludo y mucha suerte.