Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Borrar pantalla en Console Application (https://www.clubdelphi.com/foros/showthread.php?t=5964)

patu 12-12-2003 14:10:40

Borrar pantalla en Console Application
 
Saludos a todos,

¿Como puedo borrar la pantalla en una Console Application al estilo del CLS del MS-DOS?.

Gracias.

delphi.com.ar 12-12-2003 15:11:42

Yo tengo una función hecha que sigue estos pasos:
[list=1][*]Captura el Handle de la Consula (GetStdHandle)[*]Calcula en Alto y Ancho Máximo (GetLargestConsoleWindowSize)[*]Limpia el Output Buffer (FillConsoleOutputCharacter)[*]Posiciona el cursor en el margen superior derecho (SetConsoleCursorPosition)[/list=1]

Saludos!

patu 12-12-2003 15:58:00

Te agradezco las indicaciones, pero me podrias facilitar el código que utilizas?. Mis conocimientos de Delphi no son todo lo extensos que me gustaría que fuesen.

Gracias otra vez.

patu 16-12-2003 09:46:17

¿Por favor, alguien me puede indicar el código necesario para borrar la pantalla en una console application?

linuxfresh 16-09-2006 19:37:10

Borrar pantalla con ClrScr
 
En esta pagina he encontrado una unidad llamada console, similar a la crt de Turbo Pascal (clrscr, gotoxy, textcolor, etc). La he probado en l nuevo Turbo Delphi y no me ha dado problemas.

http://rvelthuis.de/programs/console.html

Avisen si les sirvio.

Eduardo Juviel 14-12-2006 23:15:17

Hola, yo también estoy en una situación similar; no me ha servido de mucho la unit que dice linuxfresh (debe ser por mi inexperiencia). Discúlpenme amigos. De veras quisiera entender, pero la unit está escrita para Pascal, y lo necesito en Consola de Delphi. Saludos!!!

dec 14-12-2006 23:47:46

Hola,

Buscando por Google topas con varias funciones que pueden en teoría echar una mano. En la página Web de Borland se encuentra: Clearing a console window screen y un poco más adelante en la búsqueda se encuentra: Clearing the window in a console application.

Ninguna de las técnicas propuestas me han funcionado razonablemente por separado. La primera, sencillamente, no me funciona: se produce una excepción en la que no me ha apetecido adentrarme. La segunda solución ha estado mejor en mis pruebas. Únicamente le faltaba algo que sí daba la primera: situar el cursor al principio de la Consola al terminar de limpiarla...

Así que he hecho un híbrido de ambos códigos y parece que el asunto funciona, si bien se nota cierto "movimiento" en la "barra de scroll" de la Consola que tal vez no convenza a todos..., debido a la técnica que se usa para limpiar la Consola tal como la propone el segundo resultado/solución de que he hablado. Yo por el momento lo dejo tal cual. Tal vez alguien que entienda más que yo pueda ir un poco más allá:

Código Delphi [-]
program ClubDelphi;

{$APPTYPE CONSOLE}

uses
  Windows;

function LimpiarConsola: boolean;
var
  i: integer;
  handleConsola: LongWord;
  coordenadasCursor: TCoord;
  infoBufferConsola: TConsoleScreenBufferInfo;
begin
  Result := false;
  handleConsola := GetStdHandle(STD_OUTPUT_HANDLE);
  if handleConsola <> INVALID_HANDLE_VALUE then
  begin
    GetConsoleScreenBufferInfo(GetStdHandle
     (STD_OUTPUT_HANDLE), infoBufferConsola);

    for i := 0 to infoBufferConsola.dwSize.Y do
      WriteLn;

    coordenadasCursor.X := 0;
    coordenadasCursor.Y := 0;
    Result := SetConsoleCursorPosition
     (handleConsola,coordenadasCursor);
  end;
end;

begin
  Writeln('Un programa de tipo Consola');
  Writeln('Pulsa ENTER para limpiar la Consola');
  ReadLn;

  LimpiarConsola;

  Writeln('Pulsa ENTER para finalizar');
  Readln;
end.

yusnerqui 14-12-2006 23:50:12

Recuerdo que hace tiempo con ayuda del Club, hice una unit que hace varias cosas de las que quieres, hechale un vistazo:

Código Delphi [-]
interface
 uses
 SysUtils,Windows;

Procedure CreaBordes(F,C,Cant:Integer;Carac:Char);
Procedure Limpia(F1,F2,C1,C2:Integer);overload;
Procedure Limpia;overload;
Procedure GotoXY(X,Y:Integer);
Procedure CreaTabla(Ancho,Alto:Integer);
implementation
{------------------------------------------------------------------------------
  Procedimiento utilizado para crear bordes de una tabla o esquema con
  un caracter especificado
-------------------------------------------------------------------------------}
Procedure CreaBordes(F,C,Cant:Integer;Carac:Char);
 var
   H         : THandle;
   P         : Cardinal;
   CoordAuxi : _COORD;
 begin
   CoordAuxi.X := C;
   CoordAuxi.Y := F;
   H := GetStdHandle(STD_OUTPUT_HANDLE);
   FillConsoleOutputCharacter(h,carac,cant,CoordAuxi,P);
 end;
 {------------------------------------------------------------------------------
  Procedimiento que limpia toda la pantalla
 -------------------------------------------------------------------------------}
 Procedure Limpia;
  Var
    H        : THandle;
    P        : Cardinal;
    LArea,
    Cord_Aux : _COORD;
    i        : integer;
 begin
   Cord_Aux.X := 0;
   H := GetStdHandle(STD_OUTPUT_HANDLE);

   LArea := GetLargestConsoleWindowSize(H);
   for i := 0 to LArea.Y do
   begin
     Cord_Aux.Y := i;
     FillConsoleOutputCharacter(H,#0,LArea.X,Cord_Aux,P);
   end;

   GotoXY(0,0);
 end;
  {------------------------------------------------------------------------------
   Procedimiento que limpia un área de la pantalla en dependencia de los
   parámetros especificados.
 -------------------------------------------------------------------------------}
 Procedure Limpia(F1,F2,C1,C2:Integer);
 Var
   H        : THandle;
   P        : Cardinal;
   LArea,
   Cord_Aux :_COORD;
   i        : integer;
 begin
   Cord_Aux.X := 0;
   H := GetStdHandle(STD_OUTPUT_HANDLE);
   LArea := GetLargestConsoleWindowSize(h);
   Cord_Aux.X := C1;
   for i := F1 to F2 do
   begin
     Cord_Aux.Y := i;
     FillConsoleOutputCharacter(H,#0,C2-C1,Cord_Aux,P);
   end;
   GotoXY(C1,F1);
 end;
 {------------------------------------------------------------------------------
  Procedimiento que ubica el cursor en un lugar específico de la pantalla
 -------------------------------------------------------------------------------}
 Procedure GotoXY(X,Y:Integer);
 Var
   H      : THandle;
   MyCord : _COORD;
 begin
   MyCord.X := x;
   MyCord.Y := y;
   H := GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleCursorPosition(H,MyCord);
 end;
 {------------------------------------------------------------------------------
  Crea una tabla de dos filas y una columna, la primera fila para un encabezado
  y tiene un alto fijo, la segunda para los detalles y se le puede especificar
  el alto. También podemos especificar el ancho de dicha tabla. 
 -------------------------------------------------------------------------------}
 Procedure CreaTabla(Ancho,Alto:Integer);
 var
  i:Integer;
 begin
  CreaBordes(1,2,Ancho,#205);
  CreaBordes(3,2,Ancho,#205);
  CreaBordes(1,1,1,#201);
  CreaBordes(1,Ancho+1,1,#187);
  CreaBordes(2,1,1,#186);
  CreaBordes(2,Ancho+1,1,#186);
  CreaBordes(3,1,1,#204);
  CreaBordes(3,Ancho+1,1,#185);
  for i := 4 to Alto do
  begin
   CreaBordes(i,1,1,#186);
   CreaBordes(i,Ancho+1,1,#186);
  end ;
  CreaBordes(Alto,2,Ancho,#205);
  CreaBordes(Alto,1,1,#200);
  CreaBordes(Alto,Ancho+1,1,#188);
 end;
end.

dec 15-12-2006 00:02:33

Hola,

Gracias yusnerqui. Funciona mejor. No hay "movimiento" de Scroll de ningún tipo y la Consola se "limpia" como esperamos. :)

Eduardo Juviel 15-12-2006 00:38:39

Genial!!! Ahora sí, y con todo mi respeto dec, funciona mejor que como decías. De todas formas te reitero las gracias, de veras que sí. Felicidades yusnerki. Gracias a todos lus delphinautas.

Saludos
Eduardo Juviel


La franja horaria es GMT +2. Ahora son las 01:17:09.

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