PDA

Ver la Versión Completa : Borrar pantalla en Console Application


patu
12-12-2003, 14:10:40
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
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 (http://www.google.es/search?hl=es&q=Clear+console+Window+Delphi) 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 (http://bdn.borland.com/article/21701) y un poco más adelante en la búsqueda se encuentra: Clearing the window in a console application (http://www.esanu.name/delphi/Application/Clearing%20the%20window%20in%20a%20console%20application.html).

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á:


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:


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