2011-10-22 16 views
6

Próbuję utworzyć kursor spinner/wait w aplikacji konsoli Delphi. Mogę to zrobić, ale jestem pewien, że kod można znacznie usprawnić/poprawić. Proszę wybaczyć słabe kod:Tworzenie Spinner w konsoli 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. 

z góry dzięki Pawła

+1

Mitpickers': hStdOut jest ** nie ** HWND ale tylko uchwyt/THandle. –

+2

Jednym z oczywistych problemów z powyższym kodem jest to, że jest nielogiczne, że 'PositionXY' zawiera' sleep (100) '. –

+0

Stary Skool. +1 dla geekery konsolowej. –

Odpowiedz

9

Może to prowadzić do pewnych optymalizacje:

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

wskazówka: # 8 jest Backspace.

+0

Dziękuję ... Zacząłem ćwiczyć backspace, ale nie udało się ... –

1

Stosowanie kodu chciałbym zmienić go trochę,

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. 

To sprawia WriteXY nieco bardziej wykorzystywać pełny mnie niż tylko PositionXY

2

moje rozwiązanie następującej odpowiedzi udzielonych i sprzężenia zwrotnego.
Dzięki Uwe i 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. 

Wybraliśmy tę opcję, aby umożliwić łatwiejsze zmiany chars IE: narożną Cooler ASCII Spinners?