Contributor: MATS DAHLIN
{
 Sometimes you have trouble to know if the computer really does something
 or if it has gone into an endless loop. This is a problem that I have
 got when I constructed some programs which done some heavy numerical
 computations. (Some of them take about 15 minutes to run on a 66 MHz
 486-DX2.)
 So, to solve my problems I created an object which implement a spinning
 indicator that gives information on the screen that something is really
 going on. I haven't put in much comments but I think it will be easy to
 follow the code anyway. After the code of the SpinU unit is a simple
 demo program.
 Enjoy!
 By Mats Dahlin, 1994年10月13日
 If you have any suggestions/questions, please a message to
 CompuServe: 70622,157
 Internet : 70622.157@compuserve.comsend E-mail to
}
unit SpinU;
{********************************************************************}
interface
{********************************************************************}
type
 TSpin = object
 x, y : Byte;
 ColorAttr: Byte;
 Index : Byte;
 SpinDelay: Byte;
 Clockwise: Boolean;
 Counter : Byte;
 procedure Init(InitX, InitY : Byte; { Coordinate of the "spinner" }
 InitColorAttr: Byte; { Color attribute of "spinner" }
 InitIndex : Byte; { Initial spin character }
 InitSpinDelay: Byte;{ Delay before next turn of "spinner" }
 InitClockwise: Boolean); { Spin clockwise or... ? }
 procedure Display;
 procedure Update;
 procedure Clear;
 end;
{********************************************************************}
implementation
{********************************************************************}
uses
 Crt;
procedure TSpin.Init(InitX, InitY : Byte;
 InitColorAttr: Byte;
 InitIndex : Byte;
 InitSpinDelay: Byte;
 InitClockwise: Boolean);
begin
 x := InitX;
 y := InitY;
 ColorAttr := InitColorAttr;
 Index := InitIndex;
 SpinDelay := InitSpinDelay;
 Counter := 0;
 Clockwise := InitClockwise;
 Display;
end;
{************************************************}
procedure TSpin.Display;
const
 CSpinCh: array [1..4] of Char = ('/', '-', '\', '|');
var
 OldAttr: Byte;
begin
 OldAttr := TextAttr;
 TextColor(ColorAttr);
 Gotoxy(x, y);
 Write(CSpinCh[Index]);
 TextAttr := OldAttr;
end;
{************************************************}
procedure TSpin.Update;
begin
 Display;
 Inc(Counter);
 if (Counter>=SpinDelay) then
 case Clockwise of
 True : begin
 Inc(Index);
 if (Index=5) then
 Index := 1;
 Counter := 0;
 end;
 False: begin
 Dec(Index);
 if (Index=0) then
 Index := 4;
 Counter := 0;
 end;
 end;
end;
{************************************************}
procedure TSpin.Clear;
begin
 Gotoxy(x, y);
 Write(#32);
end;
{********************************************************************}
end.
{ And here comes the demo program... }
program SpinTest;
uses
 Dos, Crt, SpinU;
const
 NoOfSpinners = 15;
 NoOfRows = 4;
var
 Spin: array [1..NoOfSpinners, 1..NoOfRows] of TSpin;
 i, j: Integer;
{************************************************}
procedure CursorOff;
var
 Regs: Registers;
begin
 FillChar(Regs, SizeOf(Regs), 0);
 Regs.AH := 01ドル;
 Regs.CX := 2000ドル;
 Intr(10,ドル Regs);
end;
{************************************************}
procedure CursorOn;
var
 Regs: Registers;
begin
 FillChar(Regs, SizeOf(Regs), 0);
 Regs.AH := 0ドルF;
 Intr(10,ドル Regs);
 if ((Regs.AL and 07ドル)=07ドル) then
 Regs.CX := 0ドルC0D
 else
 Regs.CX := 0607ドル;
 Regs.AH := 01ドル;
 Intr(10,ドル Regs);
end;
{************************************************}
begin
 CursorOff;
 Gotoxy(1, 12);
 Writeln('SPINTEST - By Mats Dahlin, 1994年10月13日');
 Writeln('(A demo program of the SpinU unit)');
 for i := 1 to NoOfSpinners do { Setup the spinners }
 for j := 1 to NoOfRows do
 Spin[i, j].Init(5*i, 2*j, i, j, 15*j, Odd(j));
 repeat { Let them spin... }
 for i := 1 to NoOfSpinners do
 for j := 1 to NoOfRows do
 Spin[i, j].Update;
 until KeyPressed;
 for i := 1 to NoOfSpinners do { These loops aren't really necessary in }
 for j := 1 to NoOfRows do { this little demo program... }
 Spin[i, j].Clear;
 ClrScr;
 CursorOn;
end.


AltStyle によって変換されたページ (->オリジナル) /