PDA

Ver la Versión Completa : "Dibujando" caracteres en consola


AgustinOrtu
20-11-2014, 18:16:16
Que tal compañeros del club, resulta que estaba creando una pequeña applicacion que gestionaba backups automaticos y genere una aplicacion de consola para ir mostrando una suerte de log de sucesos

Cuestion, para añadirle un toque "profesional" se me ocurrio añadirle el nombre de la empresa al inicio de todo (tipico de las viejas aplicaciones de consola de antaño :D)

Como no queria romperme la cabeza haciendo a mano el trabajo sucio para dibujar las letras usando caracteres, llega Google al rescate y encontre esta interesante pagina: Text to ASCII Art Generator (http://patorjk.com/software/taag), que nos permite elegir una fuente e ingresar el texto deseado, por arte de magia nos devuelve el texto que tanto nos gusta listo para imprimir por pantalla

El resultado:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils;

begin
try
Writeln(' ______ _ _ _____ _ _ _ ');
Writeln(' / _____) | | | (____ \ | | | | (_) ');
Writeln('| / | |_ _| | _ _ \ \ ____| |____ | | _ _ ');
Writeln('| | | | | | | || \ | | | / _ ) | _ \| || \| | ');
Writeln('| \_____| | |_| | |_) ) | |__/ ( (/ /| | | | | | | | | ');
Writeln(' \______)_|\____|____/ |_____/ \____)_| ||_/|_| |_|_| ');
Writeln(' |_|');
Writeln;
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;

end.

Saludos :D

PD: Si a alguien se le ocurre una mejor manera de hacer los write, que a mi me parece que esa es una forma media "chapucera"

mamcx
20-11-2014, 19:40:45
Una manera simplista es refactorizar el código, creando una función que procese el texto por cada salto de linea, y imprimir en un ciclo, en pseudocodigo:


function write(texto:String)
lineas = split(texto, ENTER)

for linea in lineas:
Writeln(linea)

ecfisa
20-11-2014, 19:45:48
Hola Agustín.

Primero que nada muy buena la página del enlace ^\||/

En cuanto a tu consulta y tomando en cuenta que el texto lo obtenes del copiado y pegado (de la página) no veo manera mas directa de hacerlo que con WriteLn. Podrías almacenar el texto en variables o constantes con tipo, pero no creo que esos cambios mejoren o hagan mas entendible el código.

Solo para agregar alguna idea, tal vez podrías flexibilizar el mostrado, por ejemplo:

uses SysUtils, Classes, System;

procedure ShowBanner(Alignment: TAlignment);
const
LEN = 55; // Largo del banner
var
spc: string;
begin
case Alignment of
taLeftJustify : spc:= '';
taCenter : spc:= StringOfChar(' ', (80-LEN) div 2);
taRightJustify: spc:= StringOfChar(' ', 80-LEN);
end;
WriteLn(spc+' ______ _ _ _____ _ _ _');
WriteLn(spc+' / _____) | | | (____ \ | | | | (_)');
WriteLn(spc+'| / | |_ _| | _ _ \ \ ____| |____ | | _ _ ');
WriteLn(spc+'| | | | | | | || \ | | | / _ ) | _ \| || \| |');
WriteLn(spc+'| \_____| | |_| | |_) ) | |__/ ( (/ /| | | | | | | | |');
WriteLn(spc+' \______)_|\____|____/ |_____/ \____)_| ||_/|_| |_|_|');
WriteLn(spc+' |_| ');
end;


O también:

procedure ShowBannerXY(const X, Y: Integer);
const
LEN = 55; // Largo del banner
var
i: Integer;
spc: string;
begin
if X <= 80 - LEN then
begin
spc:= StringOfChar(' ', X);
for i:= 1 to Y do WriteLn;
WriteLn(spc+' ______ _ _ _____ _ _ _');
WriteLn(spc+' / _____) | | | (____ \ | | | | (_)');
WriteLn(spc+'| / | |_ _| | _ _ \ \ ____| |____ | | _ _ ');
WriteLn(spc+'| | | | | | | || \ | | | / _ ) | _ \| || \| |');
WriteLn(spc+'| \_____| | |_| | |_) ) | |__/ ( (/ /| | | | | | | | |');
WriteLn(spc+' \______)_|\____|____/ |_____/ \____)_| ||_/|_| |_|_|');
WriteLn(spc+' |_| ');
end
else
WriteLn(Format('Maximo valor horizontal %d', [80-LEN]));
end;



Saludos :)

nlsgarcia
20-11-2014, 19:58:39
AgustinOrtu,


..."Dibujando" caracteres en consola...encontré esta interesante pagina: Text to ASCII Art Generator (http://patorjk.com/software/taag)...por arte de magia nos devuelve el texto...

^\||/


..¿A alguien se le ocurre una mejor manera de hacer los Write?...

:rolleyes:

Revisa este código:

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

const
TextApp : Array[0..5] of String =
(
' _ _ _ _____ _ ',
'| \ | | | | / ____| (_) ',
'| \| | ___| |___ ___ _ __ | | __ __ _ _ __ ___ _ __ _ ',
'| . ` |/ _ \ / __|/ _ \| |_ \ | | |_ |/ _` | |__/ __| |/ _` |',
'| |\ | __/ \__ \ (_) | | | | | |__| | (_| | | | (__| | (_| |',
'|_| \_|\___|_|___/\___/|_| |_| \_____|\__,_|_| \___|_|\__,_|'
);

procedure MsgApp(TextApp : Array of String);
var
i : Integer;
begin
for i := Low(TextApp) to High(TextApp) do
Writeln(TextApp);
Readln;
end;

begin
MsgApp(TextApp);
end.

El código anterior en Delphi 7 sobre Windows 7 Professional x32, [I]Imprime en Consola un mensaje contenido en un arreglo por medio de un procedimiento.

Espero sea útil :)

Nelson.

AgustinOrtu
21-11-2014, 03:50:10
Muy buenas sugerencias todos! Lo que comenta el maestro mamcx me parece lo mas acertado, que es exactamente como nos ha ilustrado el compañero nslgarcia ^\||/^\||/

Esta muy interesante esto de estar jugando con la consola, me recuerda a los dias que se empezaba a programar, en mi caso para aprender con el Dev-Pascal :D (las aplicaciones de consola siempre les tengo un cariño especial)

A veces las cosas mas sencillas nos presentan un reto, yo la verdad no se me habria ocurrido resolverlo como nelson por ejemplo

Saludos!