mysticbbs/mystic/bbs_edit_full.pas

849 lines
24 KiB
ObjectPascal
Raw Normal View History

2012-02-13 16:50:48 -08:00
Unit bbs_Edit_Full;
{ this editor really should be rewritten from scratch again, since i wrote }
{ it sooo many years ago. i'm sure i could do a better job now! in any }
{ case, some things which could be added or included in new editor: }
{ }
{ 1. cut/paste line functions }
{ 2. move word left/right commands }
{ 3. optional spell checker? }
{ 4. reformat paragraph command }
{ 5. tag lines? }
{ 6. ability to show embedded ansi/pipes }
{ 7. ability to toggle off word wrap? }
{ 8. ability to set foreground/background color }
{ 9. ability to change extended character sets }
{ 10. maybe remove Squish msgbase support and add a OWNER field to each }
{ message. Owners can be assigned by Sysop ACS or the original poster }
{ Ownership allows message editing but not deleting. this combined with }
{ the above allows artists to collaborate ANSIs in the message bases with}
{ the FSE. totally badass feature no one has ever done. }
{ CTRL-A = change attribute CTRL-C change character set? CTRL-W on off}
{ then ahve a PUBLISH feature which can allow downloads or moving to the}
{ ANSI gallery? }
{ add SAUCE editor if this happens too }
{ how will message quoting work though? has to strip colors }
{ hmm what happens if two users want to work together though? }
{$I M_OPS.PAS}
Interface
Function AnsiEditor (Var Lines: SmallInt; WrapPos: Byte; MaxLines: SmallInt; TEdit, Forced: Boolean; Var Subj: String) : Boolean;
Implementation
Uses
m_Strings,
bbs_Common,
bbs_Core;
Procedure Print (S: String);
Begin
{$IFNDEF UNIX}
If Not Session.LocalMode Then Session.io.BufAddStr(S);
{$ENDIF}
Screen.WriteStr(S);
End;
Procedure PrintLn (S: String);
Begin
Print (S + #13#10);
End;
Function AnsiEditor (Var Lines: Integer; WrapPos: Byte; MaxLines: Integer; TEdit, Forced: Boolean; Var Subj: String) : Boolean;
Const
WinStart : Byte = 2;
WinEnd : Byte = 22;
InsertMode : Boolean = True;
Var
Done : Boolean;
Save : Boolean;
Ch : Char;
tColor : Byte;
CurX : Byte;
CurY : Integer;
CurLine : Integer;
TotalLine : Integer;
QuoteCurLine : Integer;
QuoteTopPage : Integer;
Procedure UpdatePosition;
Begin
If CurLine > TotalLine Then TotalLine := CurLine;
If CurX > Length(Session.Msgs.MsgText[CurLine]) Then CurX := Length(Session.Msgs.MsgText[CurLine]) + 1;
Session.io.AnsiGotoXY (CurX, CurY);
End;
Procedure ReFresh_Part;
Var
A,
B : Integer;
Begin
Session.io.AnsiGotoXY (1, CurY);
A := CurY;
B := CurLine;
Repeat
If B <= TotalLine Then Print(Session.Msgs.MsgText[B]);
If B <= TotalLine + 1 Then Begin
Session.io.AnsiClrEOL;
PrintLn('');
End;
Inc (A);
Inc (B);
Until A > WinEnd;
UpdatePosition;
End;
Procedure Refresh_Text;
Var
A,
B : Integer;
Begin
{ b = first line at top of window }
{ cury = yposition of last line. }
CurY := WinStart + 5;
B := CurLine - 5;
If B < 1 Then Begin
CurY := WinStart + (5 + B - 1);
B := 1;
End;
Session.io.AnsiGotoXY (1, WinStart);
A := WinStart;
Repeat
If B <= TotalLine Then Print(Session.Msgs.MsgText[B]);
Session.io.AnsiClrEOL;
PrintLn('');
Inc (A);
Inc (B);
Until A > WinEnd;
UpdatePosition;
End;
Procedure Insert_Line (Num: Integer);
Var
A : Integer;
Begin
Inc (TotalLine);
For A := TotalLine DownTo Num + 1 Do
Session.Msgs.MsgText[A] := Session.Msgs.MsgText[A - 1];
Session.Msgs.MsgText[Num] := '';
End;
Procedure Format_Text;
Var
OldStr : String; { holds the line text to be wrapped }
NewStr : String;
Line : Integer; { holds current line number being wrapped }
A : Integer;
NewY : Integer; { holds new y position on screen }
NewLine : Integer; { holds new line number }
Moved : Boolean;
Begin
If TotalLine = MaxLines Then Exit;
Line := CurLine;
OldStr := Session.Msgs.MsgText[Line];
NewY := CurY;
NewLine := CurLine;
Moved := False;
Repeat
If Pos(' ', OldStr) = 0 Then Begin
Inc (Line);
Insert_Line (Line);
Session.Msgs.MsgText[Line] := Copy(OldStr, CurX, Length(OldStr));
Session.Msgs.MsgText[Line-1][0] := Chr(CurX - 1);
If CurX > WrapPos Then Begin
Inc (NewLine);
Inc (NewY);
CurX := 1;
End;
If NewY <= WinEnd Then Refresh_Part;
CurY := NewY;
CurLine := NewLine;
If CurY > WinEnd Then Refresh_Text Else UpdatePosition;
Exit;
End Else Begin
A := strWrap (OldStr, NewStr, WrapPos);
If (A > 0) And (Not Moved) And (CurX > Length(OldStr) + 1) Then Begin
CurX := CurX - A;
Moved := True;
Inc (NewLine);
Inc (NewY);
End;
Session.Msgs.MsgText[Line] := OldStr;
Inc (Line);
If (Session.Msgs.MsgText[Line] = '') or ((Pos(' ', Session.Msgs.MsgText[Line]) = 0) And (Length(Session.Msgs.MsgText[Line]) >= WrapPos)) Then Begin
Insert_Line(Line);
OldStr := NewStr;
End Else
OldStr := NewStr + ' ' + Session.Msgs.MsgText[Line];
End;
Until Length(OldStr) <= WrapPos;
Session.Msgs.MsgText[Line] := OldStr;
If NewY <= WinEnd Then Begin
Session.io.AnsiGotoXY(1, CurY);
A := CurLine;
Repeat
If (CurY + (A - CurLine) <= WinEnd) and (A <= TotalLine) Then Begin
Print(Session.Msgs.MsgText[A]);
Session.io.AnsiClrEOL;
PrintLn('');
End Else
Break;
Inc (A);
Until False;
End;
CurY := NewY;
CurLine := NewLine;
If CurY > WinEnd Then Refresh_Text Else UpdatePosition;
End;
Procedure Do_Enter;
Begin
If TotalLine = MaxLines Then Exit;
Insert_Line (CurLine + 1);
If CurX < Length(Session.Msgs.MsgText[CurLine]) + 1 Then Begin
Session.Msgs.MsgText[CurLine+1] := Copy(Session.Msgs.MsgText[CurLine], CurX, Length(Session.Msgs.MsgText[CurLine]));
Delete (Session.Msgs.MsgText[CurLine], CurX, Length(Session.Msgs.MsgText[CurLine]));
End;
If CurY + 1 > WinEnd Then Refresh_Text Else Refresh_Part;
CurX := 1;
Inc(CurY);
Inc(CurLine);
UpdatePosition;
End;
Procedure Down_Key;
Begin
If CurLine = TotalLine Then Exit;
If CurY = WinEnd Then
ReFresh_Text
Else Begin
Inc (CurY);
Inc (CurLine);
UpdatePosition;
End;
End;
Procedure Up_Key (EOL: Boolean);
Begin
{ if curline = 1 then exit;}
{ appearently, exit is larger and slower than the statement below: }
If CurLine > 1 Then Begin
If EOL then begin
CurX := Length(Session.Msgs.MsgText[CurLine - 1]) + 1;
If CurX > WrapPos Then CurX := WrapPos + 1;
End;
If CurY = WinStart Then
Refresh_Text
Else Begin
Dec (CurY);
Dec (CurLine);
UpdatePosition;
End;
End;
End;
Procedure Delete_Line (Num : Integer);
Var
A : Integer;
Begin
For A := Num To TotalLine - 1 Do
Session.Msgs.MsgText[A] := Session.Msgs.MsgText[A + 1];
Session.Msgs.MsgText[TotalLine] := '';
Dec (TotalLine);
End;
Procedure Backspace;
Var
A : Integer;
Begin
If CurX > 1 Then Begin
Session.io.OutBS(1, True);
Dec (CurX);
Delete (Session.Msgs.MsgText[CurLine], CurX, 1);
If CurX < Length(Session.Msgs.MsgText[CurLine]) + 1 Then Begin
Print (Copy(Session.Msgs.MsgText[CurLine], CurX, Length(Session.Msgs.MsgText[CurLine])) + ' ');
UpdatePosition;
End;
End Else
If CurLine > 1 Then Begin
If Length(Session.Msgs.MsgText[CurLine - 1]) + Length(Session.Msgs.MsgText[CurLine]) <= WrapPos Then Begin
CurX := Length(Session.Msgs.MsgText[CurLine - 1]) + 1;
Session.Msgs.MsgText[CurLine - 1] := Session.Msgs.MsgText[CurLine - 1] + Session.Msgs.MsgText[CurLine];
Delete_Line (CurLine);
Dec (CurLine);
Dec (CurY);
If CurY < WinStart Then Refresh_Text Else Refresh_Part;
End Else
If Pos(' ', Session.Msgs.MsgText[CurLine]) > 0 Then Begin
For A := Length(Session.Msgs.MsgText[CurLine]) DownTo 1 Do
If (Session.Msgs.MsgText[CurLine][A] = ' ') and (Length(Session.Msgs.MsgText[CurLine - 1]) + A - 1 <= WrapPos) Then Begin
CurX := Length(Session.Msgs.MsgText[CurLine - 1]) + 1;
Session.Msgs.MsgText[CurLine - 1] := Session.Msgs.MsgText[CurLine - 1] + Copy(Session.Msgs.MsgText[CurLine], 1, A - 1);
Delete (Session.Msgs.MsgText[CurLine], 1, A);
Dec (CurLine);
Dec (CurY);
If CurY < WinStart Then Refresh_Text Else Refresh_Part;
Exit;
End;
Up_Key(True);
End;
End;
End;
procedure left_key;
begin
if curx > 1 then Begin
Dec (CurX);
UpdatePosition;
end else
up_key(true);
End;
procedure right_key;
Begin
if curx < length(Session.Msgs.MsgText[curline])+1 then begin
Inc (CurX);
UpdatePosition;
end else begin
if curY < totalline then curx := 1;
down_key;
end;
End;
Procedure Insert_Ch (Ch: Char);
Begin
If InsertMode Then Begin
Insert (Ch, Session.Msgs.MsgText[Curline], CurX);
Print (Copy(Session.Msgs.MsgText[CurLine], CurX, Length(Session.Msgs.MsgText[CurLine])));
End Else Begin
If CurX > Length(Session.Msgs.MsgText[CurLine]) Then Inc(Session.Msgs.MsgText[CurLine][0]);
Session.Msgs.MsgText[CurLine][CurX] := Ch;
Print (Ch); {outchar}
End;
Inc (CurX);
UpdatePosition;
End;
Procedure ToggleInsert (Toggle: Boolean);
Begin
If Toggle Then InsertMode := Not InsertMode;
Session.io.AnsiColor (Session.io.ScreenInfo[3].A);
Session.io.AnsiGotoXY (Session.io.ScreenInfo[3].X, Session.io.ScreenInfo[3].Y);
If InsertMode Then Print('INS') else Print('OVR'); { ++lang }
Session.io.AnsiGotoXY (CurX, CurY);
Session.io.AnsiColor (tColor);
End;
Procedure Draw_Screen;
Begin
If TEdit Then Session.io.OutFile ('ansitext', True, 0) Else Session.io.OutFile ('ansiedit', True, 0);
WinStart := Session.io.ScreenInfo[1].Y;
WinEnd := Session.io.ScreenInfo[2].Y;
tColor := Session.io.ScreenInfo[1].A;
ToggleInsert (False);
Refresh_Text;
End;
Procedure Quote;
Var
InFile : Text;
Start,
Finish : Integer;
NumLines : Integer;
Text : Array[1..mysMaxMsgLines] of String[80];
PI1 : String;
PI2 : String;
Begin
Assign (InFile, Session.TempPath + 'msgtmp');
{$I-} Reset (InFile); {$I+}
If IoResult <> 0 Then Begin
Session.io.OutFullLn (Session.GetPrompt(158));
Exit;
End;
NumLines := 0;
Session.io.AllowPause := True;
While Not Eof(InFile) Do Begin
Inc (NumLines);
ReadLn (InFile, Text[NumLines]);
End;
Close (InFile);
PI1 := Session.io.PromptInfo[1];
PI2 := Session.io.PromptInfo[2];
Session.io.OutFullLn(Session.GetPrompt(452));
For Start := 1 to NumLines Do Begin
Session.io.PromptInfo[1] := strI2S(Start);
Session.io.PromptInfo[2] := Text[Start];
Session.io.OutFullLn (Session.GetPrompt(341));
If (Session.io.PausePtr >= Session.User.ThisUser.ScreenSize) and (Session.io.AllowPause) Then
Case Session.io.MorePrompt of
'N' : Break;
'C' : Session.io.AllowPause := False;
End;
End;
Session.io.AllowPause := True;
Session.io.OutFull (Session.GetPrompt(159));
Start := strS2I(Session.io.GetInput(3, 3, 11, ''));
Session.io.OutFull (Session.GetPrompt(160));
Finish := strS2I(Session.io.GetInput(3, 3, 11, ''));
If (Start > 0) and (Start <= NumLines) and (Finish <= NumLines) Then Begin
If Finish = 0 Then Finish := Start;
For NumLines := Start to Finish Do Begin
If TotalLine = mysMaxMsgLines Then Break;
If Session.Msgs.MsgText[CurLine] <> '' Then Begin
Inc (CurLine);
Insert_Line (CurLine);
End;
Session.Msgs.MsgText[CurLine] := Text[NumLines];
End;
If CurLine < MaxLines then Inc(CurLine);
End;
Session.io.PromptInfo[1] := PI1;
Session.io.PromptInfo[2] := PI2;
End;
Procedure QuoteWindow;
Var
QText : Array[1..mysMaxMsgLines] of String[80];
InFile : Text;
QuoteLines : Integer;
NoMore : Boolean;
Procedure UpdateBar (On: Boolean);
Begin
Session.io.AnsiGotoXY (1, QuoteCurLine + Session.io.ScreenInfo[2].Y);
If On Then
Session.io.AnsiColor (Session.Lang.QuoteColor)
Else
Session.io.AnsiColor (Session.io.ScreenInfo[2].A);
Print (strPadR(QText[QuoteTopPage + QuoteCurLine], 79, ' '));
End;
Procedure UpdateWindow;
Var
A : Integer;
Begin
Session.io.AnsiGotoXY (1, Session.io.ScreenInfo[2].Y);
Session.io.AnsiColor (Session.io.ScreenInfo[2].A);
For A := QuoteTopPage to QuoteTopPage + 5 Do Begin
If A <= QuoteLines Then Print (QText[A]);
Session.io.AnsiClrEOL;
If A <= QuoteLines Then PrintLn('');
End;
UpdateBar(True);
End;
Var
Scroll : Integer;
Temp1 : Integer;
Ch : Char;
Added : Boolean;
Begin
Added := False;
Assign (InFile, Session.TempPath + 'msgtmp');
{$I-} Reset(InFile); {$I+}
If IoResult <> 0 Then Exit;
QuoteLines := 0;
NoMore := False;
Scroll := CurLine + 4;
While Not Eof(InFile) Do Begin
Inc (QuoteLines);
ReadLn (InFile, QText[QuoteLines]);
End;
Close (InFile);
Session.io.OutFile ('ansiquot', True, 0);
If CurY >= Session.io.ScreenInfo[1].Y Then Begin
Session.io.AnsiColor(tColor);
Temp1 := WinEnd;
WinEnd := Session.io.ScreenInfo[1].Y;
Refresh_Text;
WinEnd := Temp1;
End;
UpdateWindow;
Repeat
Ch := Session.io.GetKey;
If Session.io.IsArrow Then Begin
Case Ch of
#71 : If QuoteCurLine > 0 Then Begin
QuoteTopPage := 1;
QuoteCurLine := 0;
UpdateWindow;
End;
#72 : Begin
If QuoteCurLine > 0 Then Begin
UpdateBar(False);
Dec(QuoteCurLine);
UpdateBar(True);
End Else
If QuoteTopPage > 1 Then Begin
Dec (QuoteTopPage);
UpdateWindow;
End;
NoMore := False;
End;
#73,
#75 : Begin
If QuoteTopPage > 6 Then
Dec (QuoteTopPage, 6)
Else Begin
QuoteTopPage := 1;
QuoteCurLine := 0;
End;
NoMore := False;
UpdateWindow;
End;
#79 : Begin
If QuoteLines <= 6 Then
QuoteCurLine := QuoteLines - QuoteTopPage
Else Begin
QuoteTopPage := QuoteLines - 5;
QuoteCurLine := 5;
End;
UpdateWindow;
End;
#80 : If QuoteTopPage + QuoteCurLine < QuoteLines Then Begin
If QuoteCurLine = 5 Then Begin
Inc (QuoteTopPage);
UpdateWindow;
End Else Begin
UpdateBar(False);
Inc (QuoteCurLine);
UpdateBar(True);
End;
End;
#77,
#81 : Begin
If QuoteLines <= 6 Then
QuoteCurLine := QuoteLines - QuoteTopPage
Else
If QuoteTopPage + 6 < QuoteLines - 6 Then
Inc (QuoteTopPage, 6)
Else Begin
QuoteTopPage := QuoteLines - 5;
QuoteCurLine := 5;
End;
UpdateWindow;
End;
End;
End Else
Case Ch of
#27 : Break;
#13 : If (TotalLine < mysMaxMsgLines) and (Not NoMore) Then Begin
Added := True;
If QuoteTopPage + QuoteCurLine = QuoteLines Then NoMore := True;
Insert_Line (CurLine);
Session.Msgs.MsgText[CurLine] := QText[QuoteTopPage + QuoteCurLine];
Inc (CurLine);
Session.io.AnsiColor(tColor);
Temp1 := WinEnd;
WinEnd := Session.io.ScreenInfo[1].Y;
If CurLine - Scroll + WinStart + 4 >= WinEnd Then Begin
Refresh_Text;
Scroll := CurLine;
End Else Begin
Dec (CurLine);
Refresh_Part;
Inc (CurLine);
Inc (CurY);
End;
WinEnd := Temp1;
If QuoteTopPage + QuoteCurLine < QuoteLines Then
If QuoteCurLine = 5 Then Begin
Inc (QuoteTopPage);
UpdateWindow;
End Else Begin
UpdateBar(False);
Inc (QuoteCurLine);
UpdateBar(True);
End;
End;
End;
Until False;
Session.io.OutFull('|16');
If (CurLine < mysMaxMsgLines) And Added Then Inc(CurLine);
End;
Procedure Commands;
Var
Ch : Char;
Str : String;
Begin
Done := False;
Save := False;
Repeat
Session.io.OutFull (Session.GetPrompt(354));
Ch := Session.io.OneKey ('?ACHQRSTU', True);
Case Ch of
'?' : Session.io.OutFullLn (Session.GetPrompt(355));
'A' : If Forced Then Begin
Session.io.OutFull (Session.GetPrompt(307));
Exit;
End Else Begin
Done := Session.io.GetYN(Session.GetPrompt(356), False);
Exit;
End;
'C' : Exit;
'H' : Begin
Session.io.OutFile ('fshelp', True, 0);
Exit;
End;
'Q' : Begin
If Session.User.ThisUser.UseLBQuote Then
QuoteWindow
Else
Quote;
Exit;
End;
'R' : Exit;
'S' : Begin
Save := True;
Done := True;
End;
'T' : Begin
Session.io.OutFull(Session.GetPrompt(463));
Str := Session.io.GetInput(60, 60, 11, Subj);
If Str <> '' Then Subj := Str;
Session.io.PromptInfo[2] := Subj;
Exit;
End;
'U' : Begin
Session.Msgs.MessageUpload(CurLine);
TotalLine := CurLine;
Exit;
End;
End;
Until Done;
End;
Procedure Page_Up;
Begin
If CurLine > 1 Then Begin
If LongInt(CurLine - (WinEnd - WinStart)) >= 1 Then
Dec (CurLine, (WinEnd - WinStart)) {scroll one page up}
Else
CurLine := 1;
Refresh_Text;
End;
End;
Procedure Page_Down;
Begin
If CurLine < TotalLine Then Begin
If CurLine + (WinEnd - WinStart) <= TotalLine Then
Inc (CurLine, (WinEnd - WinStart))
Else
CurLine := TotalLine;
Refresh_Text;
End;
End;
Var
A : Integer;
Begin
QuoteCurLine := 0;
QuoteTopPage := 1;
CurLine := Lines;
If Lines = 0 Then CurLine := 1;
Done := False;
CurX := 1;
CurY := WinStart;
TotalLine := CurLine;
Dec (WrapPos); { Kludge to make sure text length = WrapPos length }
For A := Lines + 1 to mysMaxMsgLines Do Session.Msgs.MsgText[A] := '';
Draw_Screen;
Session.io.AllowArrow := True;
Repeat
Ch := Session.io.GetKey;
If Session.io.IsArrow Then Begin
Case Ch of
#71 : Begin
CurX := 1;
UpdatePosition;
End;
#72 : Up_Key(False);
#73 : Page_Up;
#75 : Left_Key;
#77 : Right_Key;
#79 : Begin
CurX := Length(Session.Msgs.MsgText[CurLine]) + 1;
If CurX > WrapPos Then CurX := WrapPos + 1; {since we DEC(WrapPos) on start}
UpdatePosition;
End;
#80 : Down_Key;
#81 : Page_Down;
#82 : ToggleInsert (True);
#83 : If CurX <= Length(Session.Msgs.MsgText[CurLine]) Then Begin
Delete (Session.Msgs.MsgText[CurLine], CurX, 1);
Print (Copy(Session.Msgs.MsgText[CurLine], CurX, Length(Session.Msgs.MsgText[CurLine])) + ' ');
UpdatePosition;
End Else
If CurLine < TotalLine Then
If (Session.Msgs.MsgText[CurLine] = '') and (TotalLine > 1) Then Begin
Delete_Line (CurLine);
Refresh_Part;
End Else
If TotalLine > 1 Then
If Length(Session.Msgs.MsgText[CurLine]) + Length(Session.Msgs.MsgText[CurLine + 1]) <= WrapPos Then Begin
Session.Msgs.MsgText[CurLine] := Session.Msgs.MsgText[CurLine] + Session.Msgs.MsgText[CurLine + 1];
Delete_Line (CurLine + 1);
Refresh_Part;
End Else
For A := Length(Session.Msgs.MsgText[CurLine + 1]) DownTo 1 Do
If (Session.Msgs.MsgText[CurLine + 1][A] = ' ') and (Length(Session.Msgs.MsgText[CurLine]) + A <= WrapPos) Then Begin
Session.Msgs.MsgText[CurLine] := Session.Msgs.MsgText[CurLine] + Copy(Session.Msgs.MsgText[CurLine + 1], 1, A - 1);
Delete (Session.Msgs.MsgText[CurLine + 1], 1, A);
Refresh_Part;
End;
End;
End Else
Case Ch of
^A : Begin
Done := True;
Save := False;
End;
{B} #2 : Draw_Screen;
#8 : Backspace;
{I} #9,
#13 : Begin
Session.io.PurgeInputBuffer;
Do_Enter;
End;
^Q : Begin
If Session.User.ThisUser.UseLBQuote Then
QuoteWindow
Else
Quote;
Draw_Screen;
End;
^V : ToggleInsert (True);
{Y} #25 : begin
delete_line (curline);
refresh_part;
end;
#27 : Begin
Commands;
If (Not Save) and (Not Done) Then Draw_Screen;
Session.io.AllowArrow := True; { just in case... }
End;
#32..
#254: Begin
If Length(Session.Msgs.MsgText[CurLine]) >= WrapPos Then begin
If TotalLine < MaxLines Then Begin
insert_ch (ch);
format_text;
End;
End Else
If (CurX = 1) and (Ch = '/') Then begin
Commands;
If (Not Save) and (Not Done) Then Draw_Screen;
Session.io.AllowArrow := True; { just in case ... }
End Else
insert_ch (ch);
End;
End;
Until Done;
Session.io.AllowArrow := False;
If Save Then Begin
A := TotalLine;
While (Session.Msgs.MsgText[A] = '') and (A > 1) Do Begin
Dec(A);
Dec(TotalLine);
End;
Lines := TotalLine;
End;
AnsiEditor := (Save = True);
Session.io.AnsiGotoXY (1, Session.User.ThisUser.ScreenSize);
{ Session.io.AnsiGotoXY (1, WinEnd + 1);}
End;
End.