2011-10-22 69 views
6

我想在Delphi控制台应用程序中创建一个微调器/等待光标。我可以做到这一点,但我相信代码可以大大简化/改进。请原谅穷人代码:在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. 

在此先感谢 保罗

+1

Mitpickers'角落:hStdOut是** **不是一个HWND,而只是一个HANDLE/THandle。 –

+2

上述代码的一个明显问题是'PositionXY'包含'sleep(100)'是不合逻辑的。 –

+0

旧Skool。 +1用于控制台geekery。 –

回答

9

这可能会引导你到一些优化:

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

提示:#8是一个退格。

+0

Thankyou ...我开始尝试锻炼退格但未成功...... –

1

使用你的代码,我要改变它一点点,

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. 

这使得WriteXY多一点使用全给我的不仅仅是PositionXY

2

我下面给出反馈的答案的解决方案。
由于乌韦和克里斯托弗

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. 

选择这个选项允许字符即更容易变化: Cooler ASCII Spinners?