• Domingo 20 de Octubre de 2019, 08:48

Autor Tema:  Ventanas Emergentes  (Leído 1602 veces)

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Ventanas Emergentes
« en: Jueves 12 de Febrero de 2004, 14:08 »
0
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._

  • Miembro activo
  • **
  • Mensajes: 88
    • Ver Perfil
Re: Ventanas Emergentes
« Respuesta #1 en: Jueves 12 de Febrero de 2004, 21:02 »
0
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:
¡Olmo, dame peras!
www.BernardoLG.net

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: Ventanas Emergentes
« Respuesta #2 en: Viernes 13 de Febrero de 2004, 01:18 »
0
Hola EugenioEnko:

  Te voy a enseñar un pequeño truco que te sacará del paso. Primero declara estas estructuras.

Código: Text
  1.  
  2. uses Crt;
  3. type
  4.  TPos=record     { Posición de la pantalla }
  5.       Car:char;
  6.      Attr:byte;
  7.     end;
  8.  
  9.     TLinea=array [1..80] of TPos;   { Linea de la Pantalla }
  10.      TPant=array [1..25] of TLinea; { Pantalla Entera }
  11.  
  12. var
  13.   Pant:TPant  absolute $b800:$0000;      { Pantalla }
  14.   BkPant: TPant
  15.  
  16.  
  17.  

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
  1.  
  2.   BkTxtAttr: byte;
  3.  
  4. begin
  5. ClrScr;                                                { borro la pantalla }
  6. BkTxtAttr:=TextAttr;                            { me guardo los atributos de texto originales }
  7. Write('Este es el fondo de la pantalla');
  8. ReadKey;
  9.  
  10. BkPant:=Pant;                                     { guardo la pantalla }
  11.  
  12. Window(10,10,20,15);                          { creo una ventana }
  13. TextbackGround(4);
  14. ClrScr;                                                { pinto su fondo de rojo }
  15. Write('Esto es adentro de una ventana de texto');
  16. ReadKey;
  17.  
  18. Window(1,1,80,25);                              { reestablezco el tamaño original de 80 x 25 }
  19. Pant:=BkPant;                                     { reestablezco el fondo }
  20. TextAttr:=BkTxtAttr;                            { reestablezco los atributos de texto }
  21.  
  22. GotoXY(1,25);
  23. Write('Estoy afuera de la ventana otra vez.');
  24. ReadKey;
  25.  
  26. end.
  27.  
  28.  

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._

  • Miembro activo
  • **
  • Mensajes: 88
    • Ver Perfil
Re: Ventanas Emergentes
« Respuesta #3 en: Viernes 13 de Febrero de 2004, 06:06 »
0
Sweet!! B)
Ya lo pruebo.
¡Olmo, dame peras!
www.BernardoLG.net

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Ventanas Emergentes
« Respuesta #4 en: Viernes 13 de Febrero de 2004, 13:50 »
0
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
  1.  
  2. FUNCTION SEGVID:WORD;
  3.  BEGIN
  4.   IF MEM[$0000:$0449]=7 THEN
  5.    SEGVID:=$B000
  6.   ELSE
  7.    SEGVID:=$B800;
  8.  END;
  9.  
  10.  

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.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Ventanas Emergentes
« Respuesta #5 en: Martes 2 de Marzo de 2004, 13:38 »
0
Aqui les dejo una unaidad capaz de hacer ventanas emergentes siguiendo tres procedimientos CrearPantalla,SalvarPantalla,RestaurarPantalla.
    La unidad viene con un aplicacion demo con su codigo fuente para que quede más claro el uso de la unidad .
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.