Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   "Dibujando" caracteres en consola (https://www.clubdelphi.com/foros/showthread.php?t=87147)

AgustinOrtu 20-11-2014 18:16:16

"Dibujando" caracteres en consola
 
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, 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:
Código Delphi [-]
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:

Código PHP:

function write(texto:String)
   
lineas split(textoENTER)

   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:
Código Delphi [-]
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:
Código Delphi [-]
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,

Cita:

Empezado por AgustinOrtu
..."Dibujando" caracteres en consola...encontré esta interesante pagina: Text to ASCII Art Generator...por arte de magia nos devuelve el texto...

^\||/

Cita:

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

:rolleyes:

Revisa este código:
Código Delphi [-]
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[i]);
   Readln;
end;

begin
  MsgApp(TextApp);
end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, 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!


La franja horaria es GMT +2. Ahora son las 07:58:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi