Programación General > Pascal
Ventanas Emergentes
Enko:
Hola , despues de varias dias sin resultado de tratar de hacer un código que hiciera que guarde todo el contenido de lo que se ve en la pantalla ( en modo texto) no tengo más remedio que consultar en este foro.
Necesitaria , por favor , que elguien me diera una pista de como se puede salvar el contenido de una pantalla de texto en una variable de cualquier tipo o cualquier otra cosa que lo permita . Asi de esta manera despues de llamar a Window(X1,Y1,X2,Y2) se pueda recuperar el contenido de la pantalla que la ventana borró .
_.B._:
Saludos!.
Yo, en este momento, y con las herramientas q conozco, lo haría de la siguiente manera.
Haría mi programa imprimiendo TODO lo q haga y lea en pantalla, y AL MISMO TIEMPO, en un archivo de texto (valiendome del ASSIGN (Salida,'C:\TPASCAL\TEST.TXT'), y REWRITE (Salida)).
Así, después de un menú emergente, simplemente haría un CLRSCR, y leería todo el archivo de texto y lo imprimiría en pantalla.
Es lo q se me ocurre, mas no lo he hecho.
Ignoro si hay una manera más fácil EugenioEnko.
Suerte, y a programar!.
Bernardo L. :comp:
DriverOp:
Hola EugenioEnko:
Te voy a enseñar un pequeño truco que te sacará del paso. Primero declara estas estructuras.
--- Código: Text --- uses Crt;type TPos=record { Posición de la pantalla } Car:char; Attr:byte; end; TLinea=array [1..80] of TPos; { Linea de la Pantalla } TPant=array [1..25] of TLinea; { Pantalla Entera } var Pant:TPant absolute $b800:$0000; { Pantalla } BkPant: TPant
Lo que he hecho aquí es declarar una estructura igual a una posición de la memoria de video en modo texto, la cual ocupa dos bytes, en el primer byte se almacena el caracter (un char) y en el segundo los atributos de color, inverso y parpadeo, luego declaro una linea de 80 posiciones de pantalla para luego repetirla 25 veces igualando así las 80 x 25 posiciones de la pantalla.
En la clausula var declaro una variable y fuerzo a que coincida con el inicio de la memoria de video en modo texto, y otra más para hacer el "back up" de la pantalla... luego solo resta escribir un código para probar esto:
--- Código: Text --- BkTxtAttr: byte; beginClrScr; { borro la pantalla }BkTxtAttr:=TextAttr; { me guardo los atributos de texto originales }Write('Este es el fondo de la pantalla');ReadKey; BkPant:=Pant; { guardo la pantalla } Window(10,10,20,15); { creo una ventana }TextbackGround(4);ClrScr; { pinto su fondo de rojo }Write('Esto es adentro de una ventana de texto');ReadKey; Window(1,1,80,25); { reestablezco el tamaño original de 80 x 25 }Pant:=BkPant; { reestablezco el fondo }TextAttr:=BkTxtAttr; { reestablezco los atributos de texto } GotoXY(1,25);Write('Estoy afuera de la ventana otra vez.');ReadKey; end.
Nada más, con esto debería ser suficiente para lo que quieres hacer. Ten en cuenta que en Turbo Pascal solo tienes 64Kb de memoria para variables de usuario y cada pantalla almacenada en memoria ocupa 2000 bytes (casi 2 kb) por lo que tal vez te conviene "cachear" en disco las pantallas capturadas.
Un saludo.
_.B._:
Sweet!! B)
Ya lo pruebo.
Enko:
DreiverOp
: Es justo la manera que deseaba obtener (La de la memoria de visualizacion) pero yo hacia que un puntero ( pointer ) apuntara ayi y la verdad que algo no me resultaba . Voy a probar de tu manera a ver que pasa. Tambien aqui te paso una funcion que identifica la posicion de la memoria de visualizacion segun el monitor que se utilize ( colr, b/n [es un poco raro que alguien tenga un monitor monocromo {b/n} pero nunca se sabe]).
--- Código: Text --- FUNCTION SEGVID:WORD; BEGIN IF MEM[$0000:$0449]=7 THEN SEGVID:=$B000 ELSE SEGVID:=$B800; END;
Espero que sea util de algo .
B) Gracias por pasarme el codigo la verdad que me resulto de lo más util.
.B. :
De la manera que me pasaste habia pensado pero se complica en la parte de hacer recuadros en la pantalla y de no pasarce da la misma.
Navegación
[#] Página Siguiente
Ir a la versión completa