120 lines
2.5 KiB
ObjectPascal
120 lines
2.5 KiB
ObjectPascal
Unit m_Output_ScrollBack;
|
|
|
|
{$I M_OPS.PAS}
|
|
|
|
Interface
|
|
|
|
Uses
|
|
m_Types,
|
|
m_Output;
|
|
|
|
Const
|
|
MaxScrollBufferSize = 1000;
|
|
|
|
Type
|
|
TConsoleScrollback = Class(TOutput)
|
|
ScrollBuf : Array[1..MaxScrollBufferSize] of TConsoleLineRec;
|
|
ScrollPos : SmallInt;
|
|
Capture : Boolean;
|
|
|
|
Constructor Create (A: Boolean);
|
|
Destructor Destroy; Override;
|
|
|
|
Procedure ClearBuffer;
|
|
Procedure AddLine (Line: Word);
|
|
Function IsBlankLine (Line: Word) : Boolean;
|
|
Procedure ClearScreen; Override;
|
|
Procedure ScrollWindow; Override;
|
|
End;
|
|
|
|
Implementation
|
|
|
|
Constructor TConsoleScrollback.Create (A: Boolean);
|
|
Begin
|
|
Inherited Create(A);
|
|
|
|
ClearBuffer;
|
|
|
|
Capture := False;
|
|
End;
|
|
|
|
Destructor TConsoleScrollback.Destroy;
|
|
Begin
|
|
Inherited Destroy;
|
|
End;
|
|
|
|
Procedure TConsoleScrollback.ClearBuffer;
|
|
Var
|
|
Count1 : LongInt;
|
|
Count2 : LongInt;
|
|
Begin
|
|
ScrollPos := 0;
|
|
|
|
For Count1 := 1 to MaxScrollBufferSize Do
|
|
For Count2 := 1 to 80 Do Begin
|
|
ScrollBuf[Count1][Count2].Attributes := 7;
|
|
ScrollBuf[Count1][Count2].UnicodeChar := ' ';
|
|
End;
|
|
End;
|
|
|
|
Procedure TConsoleScrollback.AddLine (Line: Word);
|
|
Begin
|
|
If ScrollPos = MaxScrollBufferSize Then Begin
|
|
Move(ScrollBuf[2][1], ScrollBuf[1][1], SizeOf(TConsoleLineRec) * (MaxScrollBufferSize - 1));
|
|
Dec(ScrollPos);
|
|
End;
|
|
|
|
Inc (ScrollPos);
|
|
Move (Buffer[Line][1], ScrollBuf[ScrollPos][1], SizeOf(TConsoleLineRec));
|
|
End;
|
|
|
|
Function TConsoleScrollback.IsBlankLine (Line: Word) : Boolean;
|
|
Var
|
|
Count : LongInt;
|
|
Begin
|
|
Result := True;
|
|
|
|
For Count := 1 to 80 Do
|
|
// If (Buffer[Line][Count].UnicodeChar <> #0) and ((Buffer[Line][Count].UnicodeChar <> ' ') and (Buffer[Line][Count].Attributes <> 7)) Then Begin
|
|
If (Buffer[Line][Count].UnicodeChar <> #0) and ((Buffer[Line][Count].UnicodeChar <> ' ') or (Buffer[Line][Count].Attributes <> 7)) Then Begin
|
|
Result := False;
|
|
|
|
Exit;
|
|
End;
|
|
End;
|
|
|
|
Procedure TConsoleScrollback.ClearScreen;
|
|
Var
|
|
Line : LongInt;
|
|
Count : LongInt;
|
|
Begin
|
|
If Capture Then Begin
|
|
{$IFDEF WIN32}
|
|
Line := Window.Bottom + 1;
|
|
{$ELSE}
|
|
Line := FWinBot;
|
|
{$ENDIF}
|
|
|
|
While Line > 0 Do Begin
|
|
If Not IsBlankLine(Line) Then Break;
|
|
|
|
Dec(Line);
|
|
End;
|
|
|
|
If Line <> 0 Then
|
|
For Count := 1 to Line Do
|
|
AddLine(Count);
|
|
End;
|
|
|
|
Inherited ClearScreen;
|
|
End;
|
|
|
|
Procedure TConsoleScrollBack.ScrollWindow;
|
|
Begin
|
|
If Capture Then AddLine(1);
|
|
|
|
Inherited ScrollWindow;
|
|
End;
|
|
|
|
End.
|