2011-10-22 20 views
6

Estoy tratando de crear un cursor spinner/wait en una aplicación de la consola Delphi. Puedo hacerlo, pero estoy seguro de que el código se puede racionalizar/mejorar significativamente. Por favor, perdona a los pobres código:Crear un Spinner en una Consola de Delphi

Procedure PositionXY(x , y : Integer); 
var 
hStdOut: HWND; 
ScreenBufInfo: TConsoleScreenBufferInfo; 
Coord1: TCoord; 
z: Integer; 
Begin 
    sleep(100); 
    hStdOut := GetStdHandle(STD_OUTPUT_HANDLE); 
    GetConsoleScreenBufferInfo(hStdOut, ScreenBufInfo); 
    Coord1.X := x; 
    Coord1.Y := y; 
    SetConsoleCursorPosition(hStdOut, Coord1); 
End; 

begin 
while True do begin 
Write('|'); 
    PositionXY(0,0); 
Write('/'); 
    PositionXY(0,0); 
Write('-'); 
    PositionXY(0,0); 
Write('\'); 
    PositionXY(0,0); 
end; 
ReadLn; 
end. 

Gracias de antemano Paul

+1

Mitpickers': hStdOut es ** ** no un HWND pero sólo un mango/THandle. –

+2

Un problema obvio con el código anterior es que no es lógico que 'PositionXY' contenga' sleep (100) '. –

+0

Old Skool. +1 para consola Geekery. –

Respuesta

9

Esto podría guiar a algunas optimizaciones:

Write('|'#8); Sleep(100); 
Write('/'#8); Sleep(100); 
Write('-'#8); Sleep(100); 
Write('\'#8); Sleep(100); 

Consejo: El # 8 es un retroceso.

+0

Gracias ... Empecé a intentar entrenar el retroceso pero no tuve éxito ... –

1

Uso del código que cambiaría un poco,

Procedure WriteXY(x , y : Integer, s : string); 
var 
hStdOut: HWND; 
ScreenBufInfo: TConsoleScreenBufferInfo; 
Coord1: TCoord; 
Begin 
    hStdOut := GetStdHandle(STD_OUTPUT_HANDLE); 
    GetConsoleScreenBufferInfo(hStdOut, ScreenBufInfo); 
    Coord1.X := x; 
    Coord1.Y := y; 
    Write(s); 
    SetConsoleCursorPosition(hStdOut, Coord1); 
End; 

begin 
while True do begin 
    WriteXY(0,0,'|'); Sleep(100); 
    WriteXY(0,0,'/'); Sleep(100); 
    WriteXY(0,0,'-'); Sleep(100); 
    WriteXY(0,0,'\'); Sleep(100); 
end; 
ReadLn; 
end. 

Esto hace WriteXY un poco más el uso completo para mí que simplemente PositionXY

2

Mi solución siguiendo las respuestas dadas y de retroalimentación.
Gracias a Uwe y Christopher

const Frame: array[0..3] of char = ('|','/','-','\'); 

var i : Integer; 

begin 
while True do begin 
    for i := 0 to Length(Frame)-1 do begin 
    Write(Frame[i]+#8); Sleep(100); 
end; 
    ///do something 
end; 
    ReadLn; 
end. 

elige esta opción para permitir el cambio fácil de la carbonización Es decir: Esquina Cooler ASCII Spinners?

Cuestiones relacionadas