Console Mode Pascal/es
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
magyar (hu) │
日本語 (ja) │
русский (ru) │
slovenčina (sk) │
Programación con Pascal en modo consola
por User:Kirkpatc
Iniciando el trabajo
Muchos de nosotros escribíamos programas en Pascal mucho antes de que los interfaces gráficos de usuario (GUIs) y los entornos de desarrollo integrados (IDEs) se pusieran de moda. Muchos otros son principiantes en programación en Pascal y necesitan poder probar las herramientas básicas del lenguaje. Otros necesitan escribir aplicaciones de consola o en modo de texto para realizar tareas complejas de control del sistema.
Programar en modo consola sin Lazarus
A pesar de que muchos prefieren usar el IDE de Lazarus para escribir programas en modo consola, también podemos escribirlos con cualquier editor de texto y compilarlos llamando nosotros al compilador FPC, por ejemplo para el programa ejemplo.pas:
fpc ejemplo.pas
Además disponemos del IDE en modo de texto' 'fp (que se parece bastante al viejo IDE de Turbo Pascal). En las secciones siguientes nos centraremos en la programación con Lazarus.
Programar en modo consola con Lazarus
Lazarus dispone de un entorno ideal para aprender Pascal, y para desarrollar programas en modo texto. Todas las funcionalidades del IDE se pueden utilizar, incluyendo el editor de código con su resaltado de sintaxis, acceso a las librerías, búsquedas complejas y herramientas de completado de código y comprobación de sintaxis. Si no se quiere un formulario con componentes visuales no es necesario tenerlo, pero el editor de Lazarus es un gran entorno para desarrollar programas. Puedes compilar y ejecutar programas durante el desarrollo, sin abandonar el Editor.
Para dar inicio a un programa en modo consola, hay que ir al Menú principal y en la opción Proyecto seleccionar Nuevo Proyecto ... y en la ventana que aparece seleccionar Programa, Aplicación de consola o Programa personalizado. El IDE no generará todos los ficheros que están asociados con una aplicación gráfica completa, tampoco abrirá la ventana del Inspector de objetos y sí abrirá el Editor de código con el esqueleto del programa, a a la espera de que introduzcamos nuestro código.
Nota: En windows una aplicación gŕafica no dispone de consola y por tanto no podemos utilizar writeln ni readln, ya que obtendremos el error File not open. Desmarca en Proyecto / Opciones de Proyecto... / Opciones del Compilador / Enlazado / Opciones específicas del SO objetivo /Aplicación gráfica Win32 (-WG) para crear una aplicación de consola.
Programa personalizado
Un programa Pascal muy sencillo. Seleccionaremos esta opción si queremos hacerlo todo nosotros o para realizar algunas pruebas rápidas y eliminar los ficheros a continuación.
Programa
Parecido al anterior, pero el IDE nos ayudará más. Por ejemplo cuándo añadimos un unidad el IDE automáticamente añade el nombre de la unidad en la sección uses. Este comportamiento está definido en las opciones de proyecto. Así podemos alternar entre los tipos Programa y Programa personalizado en cualquier momento.
Un ejemplo para principiantes:
program Proyecto1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ puedes añadir unidades trás esto};
begin
writeln('¡Hola Mundo!');
readln;
end.
Aplicación de consola
Esta opción creará un programa con una nueva clase derivada de TCustomApplication, la cual proporciona gran parte de la funcionalidad común y convierte la programación en línea de comando en algo muy fácil. Por ejemplo comprobando los parámetros pasados en la línea de comando, escribiendo ayudas, comprobando las variables de entorno y gestionado las excepciones. Todos los programas de la LCL utilizan esta funcionalidad automáticamente.
Compilar
Una vez finalizado el programa (o una parte del mismo) lo podemos compilar y ejecutar con la opción Ejecutar > Ejecutar del menú principal, pulsando sobre el triangulo verde del panel de botones o con la tecla F9. Todos los mensajes de compilación ( avisos, informes de progreso o errores) aparecerán en la ventana de Mensajes, y con suerte eventualmente veremos un único mensaje que diga:
El proyecto "project1" se ha construido correctamente. :)
Ejecutar
¡Pero! ¿dónde está el programa?
Si no hemos guardado el proyecto, el IDE lo pone el el directorio temporal del sistema (/tmp en linux, C:\temp en windows, ver Entorno > Opciones del Entorno > Directorio para construir proyectos de prueba).
Si hemos guardado el proyecto, el programa se creará en el mismo directorio donde hayamos guardado el archivo lpi del proyecto.
Podemos ejecutar el programa desde una consola (terminal), utilizando un cd para cambiar al directorio deseado y escribir el nombre del programa. En *nix probablemente tengamos que escribir ./Nombredelprograma, ya que no se encuentra en la ruta por defecto (PATH).
Ir de la consola al IDE y viceversa puede ser un poco tedioso. Por suerte hay una forma de abrir la ventana del terminal directamente desde el IDE de Lazarus.
Ejecutar desde el IDE
Desde el menú principal seleccionar Ejecutar > Parámetros de ejecución ..., y en el cuadro de diálogo, marcar "Usar al lanzar la aplicación". La primera vez que se lanza un programa, con la secuencia compilar/ejecutar, es probable que obtengamos este mensaje
"xterm: Can't execvp /usr/share/lazarus//tools/runwait.sh: Permission denied".
Si sucede esto, necesitaremos cambiar los permisos en el archivo apropiado (por ejemplo usando chmod +x nombredelejecutable, o usar la utilidad de Windows para cambiar los permisos); es probable que tengamos que hacer esta operación como administrador. Tras esto cada vez que lancemos nuestro programa aparecerá una ventana de consola y toda la entrada/salida de programa se mostrará en ella
Una vez terminada la ejecución de nuestro programa, aparecerá un mensaje de "Press enter" en la consola. Así toda la salida generada por el programa permanecerá en la pantalla para tener la posibilidad de leerla; la ventana de la consola se cerrará tras pulsar 'enter'.
Desafortunadamente,este método no nos permite utilizar el depurador integrado.
Ejecutar en el IDE con redirección de la salida
Si quieres ver lo que se escribe en la salida estándar y deseas utilizar el depurador integrado, stdout se puede redirigir a un archivo con el siguiente código:
uses
baseunix;
var
ArchivoSalida: text;
Resultado : integer;
begin
Assign(ArchivoSalida, 'ArchivoSalida.txt');
if FileExists('ArchivoSalida.txt') then
begin
Append(ArchivoSalida);
end
else
begin
Rewrite(ArchivoSalida); { abrir archivo para escritura, destruir contenido, en su caso }
end;
Resultado := fpdup(ArchivoSalida, output);
if Resultado < 0 then
begin
raise Exception.CreateFmt('duplicación fallida: %s', [Resultado]);
end;
Close( ArchivoSalida );
ArchivoSalida.txt se puede ver con 'tail -f ArchivoSalida.txt" o con un editor si 'tail' no está disponible en tu SO.
Por otra parte, utilizando Lazarus 0.9.31 o superior (sólo en Linux): En el menú "Ver", en "Debug Windows" hay una entrada para "Salida de la consola" para ver la salida stdout.
Salida en Unicode (UTF8)
Si quieres que tu programa en modo consola muestre la salida en Unicode (UTF-8) en Windows Vista y superior (y tal vez en las versiones anteriores), puedes utilizar el comando SetConsoleOutputCP para activar en la consola el juego de caracteres UTF-8.
Nota: Trás la ejcución del programa, la consola se comporta extrañamente en mi sistema: la introducción de comandos y la escritura no muestran resultados: ningún comando ejecutado, ningún error, nada. ¿Tal vez la consola necesita ser cambiada de nuevo? Lo he intentado también, pero parecía dar el mismo resultado. --BigChimp 17:15, 28 June 2012 (UTC)
Nota: tendrás que asegurarte de que la fuente de la consola puede mostrar las letras que desea en la salida (por ejemplo, griego, cirílico, coreano)..
Ver Soporte Unicode en la LCL para más detalles sobre soporte Unicode en Lazarus y FPC.
Programa de ejemplo:
program uniconsole;
{$mode objfpc}{$H+}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}
{$IFDEF UseCThreads}
cthreads,
{$ENDIF}
{Widestring manager needed for widestring support}
cwstring,
{$ENDIF}
{$IFDEF WINDOWS}
Windows, {for setconsoleoutputcp}
{$ENDIF}
Classes
;
var
UTF8TestString: string;
begin
{$IFDEF WINDOWS}
SetConsoleOutputCP(CP_UTF8);
{$ENDIF}
UTF8TestString:= 'rosé, водка and ούζο';
writeln ('plain: ' + UTF8TestString);
{Apparently we don't need UTF8ToConsole for this
UTF8ToConsole did not do anything for me in fact.}
end.
Ejemplos
Podemos utilizar Lazarus para probar todos los ejemplos que encontremos en libros de Pascal estándar, o podemos escribirlos de nuestra cosecha. Muchos de los procedimientos más útiles son aquellos que nos permiten ejecutar ordenes del sistema o lanzar la ejecución de otros programas, que pueden estar escritos en Pascal, C o Perl , o incluso pueden ser shell o rutinas de proceso por lotes (batch scripts)
Ejecutando ordenes del shell
Este es un ejemplo para un programa o un programa personalizado:
Program ProbarShell;
uses classes, unix;
var S: longint;
begin
S := fpsystem ('/bin/ls -la *.p*'); //lista los archivos .pp, .pas, .php, .png, etc. en el directorio actual
writeln ('Programa terminado con estado: ', S)
end.
Ejemplo: actualizar FPC y Lazarus
Podemos ejecutar ordenes algo más complejas. Por ejemplo, si usted ha comprobado los repositorios de SVN para FPC y Lazarus (ver construyendo FPC) podemos mantener los archivos fuente de FPC y de Lazarus actualizados mediante la recuperación desde el repositorio de SVN con la siguiente secuencia de ordenes:
Program LazUpdate;
uses classes, unix;
var S : longint;
begin
S := fpsystem ('cd /usr/local/src/fpc/devel/fpc ; make clean');
S := fpsystem ('cd /usr/local/src/fpc/devel/lazarus ; make clean');
S := fpsystem ('cd /usr/local/src/fpc/devel ; svn update fpc >& ~/cvscheckout.log');
S := fpsystem ('cd /usr/local/src/fpc/devel ; svn update lazarus >& ~/cvslaz.log');
end.
Nota: la ejecución de la orden
fpsystem ('cd /un_direcorio')
seguida de
fpsystem ('hacer algo en ese directorio')
no funcionará según queremos, ya que tras la llamada a la función fpsystem el programa sigue en el directorio en que se encontraba previamente a la misma; será necesario incluir múltiples órdenes en cada línea de llamada al sistema.
Por supuesto, no hay que poner cada orden como una línea separada, podemos crear un archivo de proceso por loets como este (de fpc buildfaq):
#!/bin/sh
cd /usr/local/src/fpc/devel
cd fpc
make clean
cd ..
cd lazarus
make clean
cd ..
svn up fpc >& ~/cvscheckout.log
svn up lazarus >& ~/cvslaz.log
Lo llamaremos actualizarlaz.sh, y lo llamaremos desde el programa Pascal así:
Program LazUpdate1;
uses classes, unix;
var S : longint;
begin
S := fpsystem ('updatelaz.sh')
end.
Parámetros de la línea de órdenes
Ver Parámetros de la línea de órdenes y variables de entorno.