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!
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.
¿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!!!
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.
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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.