Sign in Join
Wiki copytemporary

Console Mode Pascal/es: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Contents
22
33 * 1 Programación con Pascal en modo consola
44 * 1.1 Iniciando el trabajo
55 * 1.1.1 Programar en modo consola sin Lazarus
66 * 1.1.2 Programar en modo consola con Lazarus
77 * 1.1.3 Programa personalizado
88 * 1.1.4 Programa
99 * 1.1.5 Aplicación de consola
1010 * 1.2 Compilar
1111 * 1.3 Ejecutar
1212 * 1.4 Ejecutar desde el IDE
1313 * 1.4.1 Ejecutar en el IDE con redirección de la salida
1414 * 1.5 Salida en Unicode (UTF8)
1515 * 1.6 Ejemplos
1616 * 1.6.1 Ejecutando ordenes del _shell_
1717 * 1.6.2 Ejemplo: actualizar FPC y Lazarus
1818 * 1.7 Parámetros de la línea de órdenes
1919
2020# Programación con Pascal en modo consola
2121
2222por [User:Kirkpatc](</User:Kirkpatc> "User:Kirkpatc")
2323
2424## Iniciando el trabajo
2525
2626Muchos 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.
2727
2828### Programar en modo consola sin Lazarus
2929
3030A 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:
3131```
3232fpc ejemplo.pas
3333```
3434
3535Ademá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.
3636
3737### Programar en modo consola con Lazarus
3838
3939Lazarus 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.
4040
4141Para 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.
4242```
4343**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.
4444```
4545
4646### Programa personalizado
4747
4848Un 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.
4949
5050### Programa
5151
5252Parecido 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.
5353
5454Un ejemplo para principiantes:
5555```
5656program Proyecto1;
5757 {$mode objfpc}{$H+}
5858 uses
5959 {$IFDEF UNIX}{$IFDEF UseCThreads}
6060 cthreads,
6161 {$ENDIF}{$ENDIF}
6262 Classes
6363 { puedes añadir unidades trás esto};
6464 begin
6565 writeln('¡Hola Mundo!');
6666 readln;
6767 end.
6868```
6969
7070### Aplicación de consola
7171
7272Esta 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.
7373
7474## Compilar
7575
7676Una 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:
7777```
7878El proyecto "project1" se ha construido correctamente. :)
7979```
8080
8181## Ejecutar
8282
8383¡Pero! ¿dónde está el programa?
8484
8585Si **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).
8686
8787Si hemos guardado el proyecto, el programa se creará en el mismo directorio donde hayamos guardado el archivo _lpi_ del proyecto.
8888
8989Podemos 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).
9090
9191Ir 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.
9292
9393## Ejecutar desde el IDE
9494
9595Desde 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
9696```
9797"xterm: Can't execvp /usr/share/lazarus//tools/runwait.sh: Permission denied".
9898```
9999
100100Si 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
101101
102102Una 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'.
103103
104104Desafortunadamente,este método no nos permite utilizar el depurador integrado.
105105
106106#### Ejecutar en el IDE con redirección de la salida
107107
108108Si 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:
109109```
110110uses
111111 baseunix;
112112
113113 var
114114 ArchivoSalida: text;
115115 Resultado : integer;
116116
117117 begin
118118 Assign(ArchivoSalida, 'ArchivoSalida.txt');
119119 if FileExists('ArchivoSalida.txt') then
120120 begin
121121 Append(ArchivoSalida);
122122 end
123123 else
124124 begin
125125 Rewrite(ArchivoSalida); { abrir archivo para escritura, destruir contenido, en su caso }
126126 end;
127127
128128 Resultado := fpdup(ArchivoSalida, output);
129129
130130 if Resultado < 0 then
131131 begin
132132 raise Exception.CreateFmt('duplicación fallida: %s', [Resultado]);
133133 end;
134134
135135 Close( ArchivoSalida );
136136```
137137
138138ArchivoSalida.txt se puede ver con 'tail -f ArchivoSalida.txt" o con un editor si 'tail' no está disponible en tu SO.
139139
140140Por 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_.
141141
142142## Salida en Unicode (UTF8)
143143
144144Si 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.
145145
146146[![Note-icon.png](/wiki-images/b/be/Note-icon.png)](</File:Note-icon.png>)
147147
148148**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](</User:BigChimp> "User:BigChimp") 17:15, 28 June 2012 (UTC)
149149
150150[![Note-icon.png](/wiki-images/b/be/Note-icon.png)](</File:Note-icon.png>)
151151
152152**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)..
153153
154154[![Note-icon.png](/wiki-images/b/be/Note-icon.png)](</File:Note-icon.png>)
155155
156156**Nota:** necesitas incluir la unidad Windows.
157157
158158
159159Ver [[LCL Unicode Support/es|Soporte Unicode en la LCL]] para más detalles sobre soporte Unicode en Lazarus y FPC.
160160
161161Programa de ejemplo:
162162```
163163program uniconsole;
164164
165165 {$mode objfpc}{$H+}
166166 {$APPTYPE CONSOLE}
167167
168168 uses
169169 {$IFDEF UNIX}
170170 {$IFDEF UseCThreads}
171171 cthreads,
172172 {$ENDIF}
173173 {Widestring manager needed for widestring support}
174174 cwstring,
175175 {$ENDIF}
176176 {$IFDEF WINDOWS}
177177 Windows, {for setconsoleoutputcp}
178178 {$ENDIF}
179179 Classes
180180 ;
181181
182182 var
183183 UTF8TestString: string;
184184
185185 begin
186186 {$IFDEF WINDOWS}
187187 SetConsoleOutputCP(CP_UTF8);
188188 {$ENDIF}
189189 UTF8TestString:= 'rosé, водка and ούζο';
190190 writeln ('plain: ' + UTF8TestString);
191191 {Apparently we don't need UTF8ToConsole for this
192192 UTF8ToConsole did not do anything for me in fact.}
193193 end.
194194```
195195
196196## Ejemplos
197197
198198Podemos 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_)
199199
200200### Ejecutando ordenes del _shell_
201201
202202Este es un ejemplo para un _programa_ o un _programa personalizado_ :
203203```
204204Program ProbarShell;
205205 uses classes, unix;
206206 var S: longint;
207207 begin
208208 S := fpsystem ('/bin/ls -la *.p*'); //lista los archivos .pp, .pas, .php, .png, etc. en el directorio actual
209209 writeln ('Programa terminado con estado: ', S)
210210 end.
211211```
212212
213213### Ejemplo: actualizar FPC y Lazarus
214214
215215Podemos ejecutar ordenes algo más complejas. Por ejemplo, si usted ha comprobado los repositorios de SVN para FPC y Lazarus (ver [construyendo FPC](<http://www.stack.nl/~marcov/buildfaq.pdf>)) 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:
216216```
217217Program LazUpdate;
218218 uses classes, unix;
219219 var S : longint;
220220 begin
221221 S := fpsystem ('cd /usr/local/src/fpc/devel/fpc ; make clean');
222222 S := fpsystem ('cd /usr/local/src/fpc/devel/lazarus ; make clean');
223223 S := fpsystem ('cd /usr/local/src/fpc/devel ; svn update fpc >& ~/cvscheckout.log');
224224 S := fpsystem ('cd /usr/local/src/fpc/devel ; svn update lazarus >& ~/cvslaz.log');
225225 end.
226226```
227227
228228Nota: la ejecución de la orden
229229```
230230fpsystem ('cd /un_direcorio')
231231```
232232
233233seguida de
234234```
235235fpsystem ('hacer algo en ese directorio')
236236```
237237
238238no 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.
239239
240240Por 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_](<http://www.stack.nl/~marcov/buildfaq.pdf>)):
241241```
242242#!/bin/sh
243243 cd /usr/local/src/fpc/devel
244244 cd fpc
245245 make clean
246246 cd ..
247247 cd lazarus
248248 make clean
249249 cd ..
250250 svn up fpc >& ~/cvscheckout.log
251251 svn up lazarus >& ~/cvslaz.log
252252```
253253
254254Lo llamaremos _actualizarlaz.sh_ , y lo llamaremos desde el programa Pascal así:
255255```
256256Program LazUpdate1;
257257 uses classes, unix;
258258 var S : longint;
259259 begin
260260 S := fpsystem ('updatelaz.sh')
261261 end.
262262```
263263
264264## Parámetros de la línea de órdenes
265265
266266Ver [[Command line parameters and environment variables/es|Parámetros de la línea de órdenes y variables de entorno]].
267267
268268* * *
269269
270270[[Executing External Programs|Ejecutando programas externos]]
271271
272272---
273-*From the Free Pascal wiki, page "Console Mode Pascal/es", as the Internet Archive kept it on 2025-02-19. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
273+*From the Free Pascal wiki, page "Console Mode Pascal/es", as the Internet Archive kept it on 2025-02-19, last changed on 2020-02-12. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history