Создайте Spinner в консоли Delphi - PullRequest
7 голосов
/ 22 октября 2011

Я пытаюсь создать курсор вращения / ожидания в консольном приложении 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.

Спасибо заранее Пол

Ответы [ 3 ]

10 голосов
/ 22 октября 2011

Это может привести вас к оптимизации:

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

Подсказка: # 8 - это BackSpace.

2 голосов
/ 22 октября 2011

Мое решение с учетом полученных ответов и отзывов.
Спасибо Уве и Кристоферу

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.

Выберите эту опцию, чтобы упростить смену символов, например: Охладители ASCII Spinners?

1 голос
/ 22 октября 2011

Используя ваш код, я бы немного его изменил,

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

...