Ir al contenido


Foto

freepascal en consola


  • Por favor identifícate para responder
8 respuestas en este tema

#1 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 23 febrero 2016 - 08:40

Hola amig@s
Estoy haciendo una pequeña aplicacion en consola estoy usando FreePascal y com SO Linux.
Necesito poder grabar la pantalla y luego restaurar , algo asi como una funcion savescreen(1,1,80,24) y su antonima restorescreen(1,1,80,24)... todo lo que he visto por ahi esta basado en TP7 y no funciona en FP y mucho menos en linux...
Podria alguien orientarme un poquito o como deberia buscar?
Gracias
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 febrero 2016 - 09:32

Prueba lo siguiente, lo encontré en mis librerías:
 

delphi
  1. type
  2. screentype= array[1..4000] of byte;
  3. screenptr=^screentype;
  4.  
  5. var
  6. screen1: screenptr;
  7.  
  8. procedure savescreen(scr:byte);
  9. var
  10. sc1: byte absolute $b000:0;
  11. sc2: byte absolute $b800:0;
  12. begin;
  13. if screenaddress=$b000 then move(sc1,screens1^,4000);
  14. if screenaddress=$b800 then move(sc2,screens1^,4000);
  15. end;
  16.  
  17. procedure restorescreen(scr:byte);
  18. var
  19. sc1: byte absolute $b800:0;
  20. sc2: byte absolute $b000:0;
  21. begin;
  22. if screenaddress=$b000 then move(screens1^, sc2,4000);
  23. if screenaddress=$b800 then move(screens1^, sc1,4000);
  24. end;


  • 0

#3 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 25 febrero 2016 - 03:21

Prueba lo siguiente, lo encontré en mis librerías:


delphi
  1. type
  2. screentype= array[1..4000] of byte;
  3. screenptr=^screentype;
  4.  
  5. var
  6. screen1: screenptr;
  7.  
  8. procedure savescreen(scr:byte);
  9. var
  10. sc1: byte absolute $b000:0;
  11. sc2: byte absolute $b800:0;
  12. begin;
  13. if screenaddress=$b000 then move(sc1,screens1^,4000);
  14. if screenaddress=$b800 then move(sc2,screens1^,4000);
  15. end;
  16.  
  17. procedure restorescreen(scr:byte);
  18. var
  19. sc1: byte absolute $b800:0;
  20. sc2: byte absolute $b000:0;
  21. begin;
  22. if screenaddress=$b000 then move(screens1^, sc2,4000);
  23. if screenaddress=$b800 then move(screens1^, sc1,4000);
  24. end;

Hola enecume!!
Gracias por tu pronta respuesta.
He hecho esta pequeña prueba de tu código:
 


delphi
  1. program segunda_prueba;
  2. uses crt;
  3. type
  4. screentype= array[1..4000] of byte;
  5. screenptr=^screentype;
  6.  
  7. var
  8. screen1: screenptr;
  9.  
  10. procedure savescreen(scr:byte);
  11. var
  12. sc1: byte absolute $b000:0; <---- error
  13. sc2: byte absolute $b800:0;
  14. begin;
  15. if screenaddress=$b000 then move(sc1,screens1^,4000);
  16. if screenaddress=$b800 then move(sc2,screens1^,4000);
  17. end;
  18.  
  19. procedure restorescreen(scr:byte);
  20. var
  21. sc1: byte absolute $b800:0;
  22. sc2: byte absolute $b000:0;
  23. begin;
  24. if screenaddress=$b000 then move(screens1^, sc2,4000);
  25. if screenaddress=$b800 then move(screens1^, sc1,4000);
  26. end;
  27.  
  28. begin
  29. var pantalla: byte;
  30.  
  31. savescreen(pantalla);
  32. clrscr;
  33. gotoxy(10,10);
  34. writeln('Pantalla limpia... y restauramos pantalla de consola');
  35. readln;
  36. restorescreen(pantalla);
  37. end.



Pero me sale el siguiente error

segunda_prueba.lpr(12,27) Fatal: Syntax error, ";" expected but ":" found


La verdad es que no se donde puede estar el problema he visto varias rutinas en internet y todas muy parecidas o iguales a la tuya, no se si es un incompatibilidad del FreePascal con TP7 o es tema del Sistemaoperativo...


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 25 febrero 2016 - 04:04

Desconozco freePascal pero ésto me parece raro


php
  1. begin
  2. var pantalla: byte;
  3.  
  4.  
  5.  
  6.  

¿Las variables se pueden asignar dentro del bloque begin ... end; ?

 

La otra que veo me da curiosidad.

 


php
  1. begin;
  2.  
  3.  

El begin requiere del punto y coma ???

 

Saludos


  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 25 febrero 2016 - 05:53

Mucho me temo que el código expuesto por enecumene se trara de un código específico para los antiguos PCs con MSDOS. En ellos, la memoria de pantalla estaba en el rango:

 

1.- Modos gráficos:

  A000:0000h-A000:FFFFh  para EGA, VGA y SuperVga

  B000:0000h-B000:FFFFh  para CGA

 

2.- Modos texto:

  B000:0000h Monocromo (4 Kb)

  B800:0000h Color (16Kb)

 

En Linux no va a funcionar, y en los PCs actuales tampoco.

 

 

Saludos.


  • 1

#6 Edson

Edson

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 28 febrero 2016 - 09:02

Tal vex sea mejor usar una memoria temporal y definir rutinas que escriban en esa memoria y en pantalla a la vez. Así se podrá acceder siempre a lo que hay en pantalla.


  • 0

#7 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 29 febrero 2016 - 10:46

Hola.

 

Dentro de /system/bin/ tienes la utilidad "screencap" para lanzar una captura de pantalla. Solo tienes que lanzarla desde tu aplicación Lazarus.

 

Desde una sesión de terminal (por ejemplo con la app Terminal Emulator) ejecútala con el parámetro -h para ver los parámetros que acepta esa utilidad (formato de salida, nombre de archivo, ...).

 

Ejemplo: /system/bin/screencap -p /sdcard/Pictures/captura.png

 

Te va a dejar la captura de imagen en la carpeta de fotos de tu teléfono.

 

Saludos.


  • 1

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 29 febrero 2016 - 11:14

Hola armadillo,

¿Cuál es el trasfondo de esto? A lo que voy es que mires más en profundidad. ¿Que objetivo o propósito tiene esto?

Se que dices que buscas guardar la pantalla y poder volver desde ese punto. Ahora bien, ¿Porqué o que es lo que te motiva esto? ¿La aplicación sobre la que se va a hacer "captura" la estás desarrollando tu?

 

Porque si la idea es tener una especie de sesión para que uno al salir de tu programa pueda comenzar desde dicho punto quizá no sea necesario llegar a ese extremo sino más bien de pensamiento adicional y algo más de lógica (y si, de esfuerzo también) ¿Que te impide tener alguna estructura de datos definida por ti que lleve el registro de pasos que ejecuta el usuario... una especie de UserTracker. Es decir algo que vaya registrando la actividad del usuario. Supongamos que el programa tenga "módulos" y cada uno tiene un aspecto de interfaz, y como aplicamos programación basado en procedimientos nos hemos avivado bien en tener algo como PintarModulo(NroModulo), y éste invoca al procedimiento indicado según el número leído. Entonces si tuviéramos una estructura de seguimiento haríamos algo como: UserTracker.EnModulo := NroModulo antes o después de invocar a PintarModulo.

Para poder recuperar el "estado" de la sesión basta con guardar en archivo la información almacenada en UserTracker y leerla al iniciar el programa. Esto motiva entonces algún procedimiento como CargarSesion().

Este enfoque de programación puede ser tan simple como complejo según lo que necesites. Naturalmente esta forma de encararlo requiere de más dedicación y obviamente tener una "máquina de estado" capaz de reconocer como es el paso de una pantalla a otra según como interactúa el usuario.

 

Saludos,


  • 0

#9 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 06 marzo 2016 - 02:37

Hola Nuevamente a todos...

Creo que se ha liado un poco la cosa...

La idea de lo que quiero hacer es simple práctica....

Estoy haciendo una simple aplicación de consola, solo por amor al arte y practicar un poco de programación básica que se me ha olvidado... cuando llevas tiempo Usando Delphi y luego Lazarus (Como es mi caso)... terminas siendo cómodo y cojiendo vicios,  prácticamente ya no usas mas el: "  Type MiObjeto = Class " uno se limita solo a meter objetos en formularios y hacerlos funcionar entre si.. Generalmente las pequeñas aplicaciones que hago son solo de control de datos, aplicaciones contables control de stock y rollos por el estilo. Tan simples como que meten un dato lo guardo y luego lo muestro cuando lo pidan.

Y como vi que estaba perdiendo lucidez y/o soltura, quise volver a los inicios... así que decidí hacer una pequeña aplicación de "Agenda" (El "Hello World" de las aplicaciones de base de datos).

Te entusiasmas y quieres hacerla cada vez mas vistosa y etc etc... y me encontré con el problema y/o dificultad, de que por ejemplo tengo un listado en pantalla y muestro un mensaje en medio de la pantalla informando de algo... que pisa la información inicial,  cuando quiero quitar ese mensaje debo de escribir nuevamente toda la pantalla por eso empece a preguntar si existía  algo como se usa en CLIPPER savescreen() algún homologo en FreePascal, he visto que hay opciones pero la cosa se complica en mi caso usando linux... en fin esa era la idea de todo esto.

Esta claro que si quiero hacer algo relativamente serio en consola usaría FreeVision, pero ya os digo que quiero practicar y jugar yo ^o|

 

 

 

 


  • 0




IP.Board spam blocked by CleanTalk.