home *** CD-ROM | disk | FTP | other *** search
- {$M 8000,0,96000}
- {$R-} {Range checking off}
- {$B+} {Boolean complete evaluation on}
- {$S+} {Stack checking on}
- {$I+} {I/O checking on}
- {$N-} {No numeric coprocessor}
- Unit ScrEdit;
-
- Interface
-
- {$DEFINE MOUSE}
- {$DEFINE VALIDATE}
- {$DEFINE COLORCHANGE}
-
- {$IFDEF MOUSE}
- Uses Crt,Dos,ScrMouse;
- {$ELSE}
- Uses Crt,Dos;
- {$ENDIF}
-
- Const
- S_St : Integer = 0;
- S_FileOpen: Boolean = False;
- S_DupFields: Boolean = False;
- S_SetDupFields : Boolean = False;
- S_DupType: Boolean = False;
- S_EntryType: Boolean = False;
- S_DispType: Boolean = False;
- S_ChangeScreen: Boolean = True;
- S_LineSize: Integer = 160;
- S_Zeros: String[8] = '00000000';
-
- Type
- S_128= Array[1..128] of Byte;
- S_Cursors= (S_Off,S_Bold,S_Normal,S_InverseBold,S_InverseNormal,S_GetCursor);
- S_RecType= (S_Index,S_Data,S_Fields,S_FieldRanges);
- S_Str8= String[8];
- S_Str80= String[80];
- S_Rec= Record
- Case S_RecordType:S_RecType of
- S_Index: {Total Bytes 3457}
- (S_Name : Array[1..128] of String[16];
- S_Number : S_128;
- S_RecordNumber : Array[1..128] of Integer;
- S_FieldsRecNo : Array[1..128] of Integer;
- S_RangeRecNo : Array[1..128] of Integer;
- S_FirstField : S_128;
- S_Count : S_128;
- S_CompiledInd : S_128;
- S_RangeRecNext : Integer;
- S_RangeLineNext: Integer;
- S_sFiled : Integer;);
- S_Data: {Total Bytes 3840 + 1}
- (S_Video : Array[1..3840]of Char;
- S_WorkArray : Array[1..80,1..2] of Char;);
- S_Fields: {Total Bytes 4225}
- (S_FieldName : Array[1..128] of String[16];
- S_Row : S_128;
- S_Col : S_128;
- S_Len : S_128;
- S_Type : S_128;
- S_Prev : S_128;
- S_Next : S_128;
- S_DataLen : S_128;
- S_NormalBG : S_128;
- S_NormalFG : S_128;
- S_PromptBG : S_128;
- S_PromptFG : S_128;
- S_DisplayBG : S_128;
- S_DisplayFG : S_128;
- S_RangeNextRec : Array[1..128] of Integer;
- S_RangeNextLine: S_128);
- S_FieldRanges: {Total Bytes 3608 + 1}
- (S_RangeList : Array[1..51] of String[78];
- S_RangeRec : Array[1..51] of Integer;
- S_RangeLine : Array[1..51] of Byte);
- End;
- S_RecPointer= ^S_Rec;
- WorkAreaType= Array[1..4096] of byte;
- WorkAreaPtr= ^WorkAreaType;
- FieldPointerType= Array[1..128] of integer;
- FieldPointer= ^FieldPointerType;
- BufferPointerType= Array[1..128] of Pointer;
- BufferPointer= ^BufferPointerType;
-
- Var
- S_File: File of S_Rec;
- S_Indx: S_RecPointer;
- S_Record: S_RecPointer;
- S_Field: S_RecPointer;
- S_Validate: S_RecPointer;
- S_WorkArea: WorkAreaPtr;
- S_FieldPtr: FieldPointer;
- S_BuffPtr: BufferPointer;
-
- S_Cursor: S_Cursors;
- S_CursorOld: Integer;
- S_ErrorMsg,
- S_UserMsg,
- S_Msg,
- S_WorkStr,
- S_EditStr,
- S_EditMask,
- S_InitialValue,
- S_AutoHelpMsg : S_Str80;
- S_FastVideo,
- S_BufferOnly,
- S_DelayScreen,
- S_Delayed,
- S_QuickHelp,
- S_SetDupeFields,
- S_Force_EditMask,
- S_AutoHelp,
- S_AutoValidate :Boolean;
- S_FType,
- S_StLabelColor,
- S_StLabelBg,
- S_StLabelFg,
- S_StColor,
- S_StBg,
- S_StFg,
- S_ErrorBg,
- S_ErrorFg,
- S_HelpBg,
- S_HelpFg,
- S_UserBg,
- S_UserFg: Byte;
- S_ScrEditPrevExit : Pointer;
- S_VRec,
- S_RecNo,
- S_MessBg,
- S_MessFg,
- S_Num,
- S_Count,
- S_FirstField,
- S_Direction,
- S_PrevFld,
- S_Point,
- S_RegCX : Integer;
- S_Day,
- S_Month,
- S_Year,
- S_DayOfWeek,
- S_HelpFreq,
- S_HelpDur,
- S_UserFreq,
- S_UserDur,
- S_ErrorFreq,
- S_ErrorDur,
- S_Freq,
- S_Dur,
- S_Seg,
- S_Ofs : Word;
- S_Wait,
- S_BW,
- S_Sound_Hold,
- S_Sound,
- S_UserSound,
- S_HelpSound,
- S_ErrorSound,
- S_ShowStatus,
- S_EnterAsTab,
- S_Mono,
- S_Fkey,
- S_Shift,
- S_LeftShift,
- S_RightShift,
- S_Alt,
- S_Ctrl,
- S_ScrollLock,
- S_NumLock,
- S_Caps,
- S_ESC,
- S_Enter,
- S_F1,
- S_F2,
- S_F3,
- S_F4,
- S_F5,
- S_F6,
- S_F7,
- S_F8,
- S_F9,
- S_F10,
- S_F11,
- S_F12,
- S_BkSp,
- S_Home,
- S_Up,
- S_PgUp,
- S_Left,
- S_Right,
- S_End,
- S_Down,
- S_PgDn,
- S_Ins,
- S_Del,
- S_Tab,
- S_InsertMode,
- S_LeftArrow,
- S_RightArrow,
- S_InsertKey,
- S_DeleteKey,
- S_BackSpace,
- S_Validate_Upcase,
- S_VDone,
- S_ScreenValid : Boolean;
- S_Attrib,
- S_Reverse : Byte;
- S_Ch : Char;
- S_Ch_Num : Byte absolute S_Ch;
- S_NumLockBit : Integer absolute $40:$17;
-
- Var
- S_Ins_Str : String[1];
- S_NewStr,
- S_Blanks,
- S_Padding,
- S_WorkAttrib,
- S_NormAttrib,
- S_EditAttrib : String[80];
- S_StAttrWork : String[20];
- S_StAttrib,
- S_StLine : String[40];
- S_ValidateField,
- S_V_RecNo,
- S_ValidateLine,
- S_Fg,
- S_Bg,
- S_Max_Dec,
- S_Max_Dig,
- S_Dec_Pos,
- S_Pos : Integer;
- S_UpCase,
- S_Skip,
- S_Matched,
- S_Done,
- S_EndLine,
- S_InIf : Boolean;
- S_CompMin,
- S_CompMax,
- S_CurStr : S_Str80;
- S_FieldCounter,
- S_NextRec,
- S_NextLine,
- S_Result,
- S_FieldNo,
- S_Str_Ptr : Integer;
- S_Numeric,
- S_CompMin_Numeric,
- S_CompMax_Numeric :Real;
- S_VideoPort : Integer absolute $40:$63;
-
- Function S_SetDisplayOff(X:Integer):Integer;
- Function S_SetDisplayOn(X:Integer):Integer;
- Function S_IsDupe(S_Index:Integer):Boolean;
- Function S_SetDupe(S_Index:Integer):Boolean;
- Procedure S_ReSetDupe(S_Index:Integer);
- Function S_UpShiftedStr(Target_String:S_Str80):S_Str80;
- {$IFDEF COLORCHANGE}
- Function S_ChangeFieldColor(Fl,ST,Bg,Fg:Integer):Integer;
- Function S_ChangeScreenColor(CT,Bg,Fg:Byte;SR,ER,SC,EC:Integer):Integer;
- Procedure S_StoreColorChanges;
- {$ENDIF}
- Procedure S_RefreshScreen;
- Procedure S_ClearDupes;
- Procedure S_SetCursor(Switch:S_Cursors);
- Procedure S_Beep(Freq,Dur:Word);
- Procedure S_PreEdit (HR,HL:Integer);
- Procedure S_EditString (R,C,T,L,F,B,DF,DB,NF,NB,HR,HL:Integer;Var S:S_Str80);
- Procedure S_DisplayScreenField(R,C,T,L,DL,DF,DB,NF,NB:Integer;Var S:S_Str80);
-
-
- Procedure S_OpenScreenFile(ScrFileName:S_Str80);
- Procedure S_LoadScreen(ScrName:S_Str80);
- Procedure S_ClearScreen(Initialize:Integer);
- Procedure S_CloseScreenFile;
-
- Procedure S_ResetKeyFlags;
- Procedure S_NextKey;
- Procedure S_ReadKey;
- Procedure S_ReadField;
- Procedure S_ReadScreen;
-
- Procedure S_FillScreen;
- Procedure S_DisplayMessage(BackG,ForG : Integer; Message: S_Str80);
- Procedure S_PutScrMem(var Source, Dest; Len : integer);
- Procedure S_GetScrMem(var Source, Dest; Len : integer);
- Procedure S_Write(Row,Col,Lgth : Integer; Lines,Attribs : S_Str80);
- Procedure S_FlushKeyBuf;
-
- Procedure S_ValidateScreen;
- Procedure S_Validate_Location;
- Procedure S_Store_Buf_Loc (ScrName:S_Str80;ScrBuf:WorkAreaPtr);
- Procedure S_GetFieldType (Var FType:Byte);
- {==}
- Implementation
- {==}
-
- {$F+}
- Procedure S_ExitProc;
- Begin
- S_SetCursor(S_Normal);
- End;
- {$F-}
-
-
-
- Procedure S_Write(Row,Col,Lgth : Integer; Lines,attribs : S_Str80);
- Var Pointer:integer;
- Begin
- For Pointer := 1 to lgth do
- Begin
- S_Record^.S_WorkArray[Pointer,1] := Chr(Ord(Lines[Pointer]));
- S_Record^.S_WorkArray[Pointer,2] := Chr(Ord(Attribs[Pointer]));
- End;
- S_PutScrMem(S_Record^.S_WorkArray[1,1],
- Mem[S_Seg:S_Ofs + ((Row-1)*S_LineSize) + ((Col-1)*2)],Lgth * 2);
- End;
-
-
-
-
-
- Function S_UpShiftedStr(Target_String:S_Str80):S_Str80;
- Var
- Point : integer;
- Begin
- Point := 1;
- While Point <= Length(Target_String) do
- Begin
- Target_String[Point] := UpCase(Target_String[Point]);
- Point := Point + 1;
- End;
- S_UpShiftedStr := Target_String;
- End;
-
-
-
- Function S_TruncateStr(S:S_Str80):S_Str80;
- Var TStr : String;
- Begin
- TStr := S + S_Blanks;
- TStr[0] := Chr(Pos(S_Blanks,TStr)-1);
- S_TruncateStr := TStr;
- End;
-
-
-
- Procedure S_FlushKeyBuf;
- Var
- S_Regs : Registers;
- Begin
- FillChar(S_Regs,SizeOf(S_Regs),00);
- S_Regs.AH := $0C;
- Intr($21,S_Regs);
- End;
-
-
-
-
-
- Function S_Length(Var S:S_Str80):Integer;
- Begin
- S_Length:=Pos(S_Blanks,S+S_Blanks) - 1;
- End;
-
-
-
-
- Function S_FindScreen(ScrName:S_Str80):Integer;
- Var S_Count:Integer;
- Begin
- S_Count := 0;
- Repeat
- S_Count := S_Count + 1;
- Until ((S_UpShiftedStr(ScrName)=S_UpShiftedStr(S_Indx^.S_Name[S_Count])) or
- (S_Count > S_Indx^.S_sFiled));
- If S_Count > S_Indx^.S_sFiled Then
- S_ErrorMsg := ' Is not in file.'
- Else
- If S_Indx^.S_CompiledInd[S_Count] = 0 Then
- S_ErrorMsg := ' has not been compiled..'
- Else
- S_ErrorMsg := '';
- S_St := 0;
- If (S_ChangeScreen = True) And (S_ErrorMsg > '') then
- Begin
- S_St := 1;
- S_DisplayMessage(S_MessBg,S_MessFg,'<'+ScrName+'>'+S_ErrorMsg);
- S_CloseScreenFile;
- End;
- S_FindScreen := S_Count;
- End;
-
-
-
-
-
- Procedure S_PutScrMem(var Source, Dest; Len : integer);
- Begin
- If (S_Mono) Or (S_FastVideo) Then
- Move(Source,Dest,Len)
- Else
- Begin
- Len := Len shr 1;
- Inline($1E/$55/$BA/$DA/$03/$C5/$B6/Source/$C4/$BE/Dest/$8B/$8E/
- Len/$FC/$AD/$89/$C5/$B4/$09/$EC/$D0/$D8/$72/$FB/$FA/$EC/
- $20/$E0/$74/$FB/$89/$E8/$AB/$FB/$E2/$EA/$5D/$1F);
- End;
- End;
-
-
-
-
-
- Procedure S_GetScrMem(var Source, Dest; Len : integer);
- Begin
- If (S_Mono) Or (S_FastVideo) Then
- Move(Source,Dest,Len)
- Else
- Begin
- Len := Len shr 1;
- Inline($1E/$55/$BA/$DA/$03/$C5/$B6/Source/$C4/$BE/Dest/$8B/$8E/
- Len/$FC/$EC/$D0/$D8/$72/$FB/$FA/$EC/$D0/$D8/$73/$FB/$AD/
- $FB/$AB/$E2/$F0/$5D/$1F);
- End;
- End;
-
-
-
-
-
-
- Procedure S_ResetKeyFlags;
- Begin
- S_Fkey:= False;
- S_Tab:= False;
- S_Ctrl:= False;
- S_Esc:= False;
- S_Alt:= False;
- S_Shift:= False;
- S_F1:= False;
- S_F2:= False;
- S_F3:= False;
- S_F4:= False;
- S_F5:= False;
- S_F6:= False;
- S_F7:= False;
- S_F8:= False;
- S_F9:= False;
- S_F10:= False;
- S_F11:= False;
- S_F12:= False;
- S_Enter:= False;
- S_BkSp:= False;
- S_Home:= False;
- S_Up:= False;
- S_PgUp:= False;
- S_Left:= False;
- S_Right:= False;
- S_End:= False;
- S_Down:= False;
- S_PgDn:= False;
- S_Ins:= False;
- S_Del:= False;
- S_NumLock:= False;
- S_InsertKey:= False;
- S_DeleteKey:= False;
- S_BackSpace:= False;
- S_LeftArrow:= False;
- S_RightArrow:= False;
- End;
-
-
-
-
-
-
- Function S_SetColor(Var Bg,Fg:Byte):Byte;
- Var X : integer;
- Begin
- X := 0;
- If FG > 15 Then
- Begin
- X := 127;
- Fg := Fg - 16;
- End;
- S_SetColor := (Bg*16) + Fg + X;
- End;
-
-
-
-
- Procedure S_GetFieldType(Var FType:Byte);
- Begin
-
- S_DupType:= False;
- S_EntryType:= False;
- S_DispType:= False;
-
- If FType In[0..9] Then
- Begin
- S_Ftype:= Ftype;
- S_EntryType:= True;
- Exit;
- End;
- If FType In[10..19] Then
- Begin
- S_Ftype:= Ftype Mod 10;
- S_DupType:= True;
- Exit;
- End;
- If FType In[90..99] Then
- Begin
- S_Ftype:= Ftype Mod 90;
- S_DispType:= True;
- Exit;
- End;
- If FType In [100..109] Then
- Begin
- S_Ftype:= Ftype Mod 100;
- S_DispType:= True;
- S_DupType:= True;
- Exit;
- End;
- End;
-
-
-
-
-
- Procedure S_SetCursor(Switch:S_Cursors);
- Const
- IntNo:Integer = $10;
- Var
- S_Regs:Registers;
-
- Begin
- FillChar(S_Regs,SizeOf(S_Regs),00);
- S_Regs.AH := 1;
- S_Regs.Bh := 0;
-
- Case Switch of
- S_InverseNormal,
- S_Normal : S_Regs.Cx := S_CursorOld;
- S_Off : S_Regs.CX := 4096;
- S_InverseBold,
- S_Bold : S_Regs.CX := 15;
- S_GetCursor : S_Regs.AH := 3;
- End;{Case}
-
- Intr(IntNo,S_Regs);
-
- If Switch = S_GetCursor Then S_CursorOld := S_Regs.Cx;
- End;
-
-
-
-
-
- Procedure S_CloseScreenFile;
- Begin
- If S_Delayed Then
- S_Delayed := False;
- S_St := 1;
- If Not S_FileOpen Then
- Exit;
- S_St := 0;
- S_FileOpen := False;
- {$I-}
- Close(S_File);
- S_Result := IoResult;
- {$I+}
- S_SetCursor(S_Normal);
- End;
-
-
-
-
-
-
- Procedure S_OpenScreenFile(ScrFileName:S_Str80);
- Var
- IOerr : Integer;
- Begin
- If S_Delayed Then
- S_Delayed := False;
- If S_FileOpen Then S_CloseScreenFile;
- S_St := 0;
-
- {$I-}
- If Pos('.',ScrFileName) = 0 Then ScrFileName := ScrFileName + '.Scr';
- Assign(S_File,ScrFileName);
- IoErr := IoResult;
- If IoErr = 0 Then
- Begin
- Reset(S_FILE);
- IOerr := IOResult;
- End;
- {$I+}
- If IOerr > 0 then
- Begin
- S_St := 1;
- Str(IoErr:4,S_ErrorMsg);
- S_ErrorMsg := 'IO error <' + S_ErrorMsg + '> reading ';
- End
- Else
- If FileSize(S_File) = 0 Then
- Begin
- S_ErrorMsg := 'No records in screen file ';
- S_St := 2;
- End;
- If S_St > 0 Then
- Begin
- If S_Result = 9999 Then Exit;
- S_DisplayMessage(S_MessBg,S_MessFg,S_ErrorMsg+' <'+ScrFileName+'>');
- S_CloseScreenFile;
- End;
-
- S_Result := 0;
- Seek(S_File,0);
- Read(S_File,S_Indx^);
- S_FileOpen := True;
- End;
-
-
-
-
-
- Procedure S_Beep(Freq,Dur:Word);
- Begin
- If S_Sound = True Then
- Begin
- Sound(Freq);
- Delay(Dur);
- NoSound;
- End;
- End;
-
-
-
-
-
- Procedure S_DisplayMessage(BackG,ForG : Integer; Message: S_Str80);
- Begin
- FillChar(S_WorkAttrib,81,02);
- FillChar(S_Padding,81,32);
- S_WorkAttrib[0] := #80;
- S_Padding[0] := #80;
- Move(Message[1],S_Padding[((80-Length(Message)) Div 2)+1],Length(Message));
- FillChar(S_WorkAttrib[((80-Length(Message)) Div 2)+1],Length(Message),(BackG * 16) + ForG);
- If Message > '' Then
- S_Beep(S_Freq,S_Dur);
- S_Write(25,1,80,S_Padding,S_WorkAttrib);
- End;
-
-
-
-
-
- Procedure S_Store_Buf_Loc (ScrName:S_Str80;ScrBuf:WorkAreaPtr);
- Begin
- S_BuffPtr^[S_FindScreen(ScrName)] := ScrBuf;
- End;
-
-
-
- Procedure S_LoadScreen(ScrName:S_Str80);
- Var
- X,Y,Z : Integer;
-
- Begin
- If S_Delayed Then
- S_Delayed := False;
- S_St := 0;
-
- S_Num := S_FindScreen(ScrName);
- If S_St > 0 Then Exit;
-
- If (S_Indx^.S_Count [S_Num] > 0) And
- (S_BuffPtr^[S_Num] = Nil) Then
- Begin
- S_St := 2;
- If S_Result = 9999 Then Exit;
- S_ErrorMsg := ' Buffer has not been initialized..(Initialize_ScreenName_Buf)';
- S_CloseScreenFile;
- Halt;
- End;
-
- S_DupType := False;
- S_WorkArea := S_BuffPtr^[S_Num];
-
- Seek(S_File,S_Indx^.S_RecordNumber[S_Num]);
- Read(S_File,S_Record^);
-
- If S_BW Then
- Begin
- X := 2;
- While X < 4000 Do
- Begin
- S_Record^.S_Video[X] := #15;
- inc(X,2);
- End;
- End;
-
- If S_Indx^.S_FieldsRecNo[S_Num] > 0 then
- Begin
- If S_ChangeScreen Then
- Begin
- Seek(S_File,S_Indx^.S_FieldsRecNo[S_Num]);
- Read(S_File,S_Field^);
- End;
- S_Point := 1;
- For X := 1 to S_Indx^.S_Count[S_Num] do
- Begin
- S_GetFieldType(S_Field^.S_Type[X]);
- If S_BW Then
- Begin
- S_Field^.S_DisplayBg[X] := 0;
- S_Field^.S_DisplayFg[X] := 15;
- S_Field^.S_NormalBg [X] := 0;
- S_Field^.S_NormalFg [X] := 15;
- S_Field^.S_PromptBg [X] := 7;
- S_Field^.S_PromptFg [X] := 0;
- End;
- S_FieldPtr^[X] := S_Point;
- If S_FType In [8,9] Then
- S_Point := S_Point + S_Field^.S_Len[X]+1
- Else
- S_Point := S_Point + SizeOf(Real);
- For Z:=S_Field^.S_Col[X] to (S_Field^.S_Col[X]+S_Field^.S_Len[X]+1)do
- S_Record^.S_Video[((S_Field^.S_Row[X]-1)*S_LineSize)+((Z-1)*2)+1]:= #32;
- End;
- End;
-
- S_FirstField := S_Indx^.S_FirstField[S_Num];
- S_Point := S_FirstField;
-
- If S_ChangeScreen = True Then
- Begin
- If S_DelayScreen Then
- Begin
- S_Delayed := True;
- S_DelayScreen := False;
- End
- Else
- S_PutScrMem(S_Record^.S_Video[1],Mem[S_Seg:S_Ofs],3840)
- End
- Else
- S_ChangeScreen := True;
- End;
-
-
-
-
-
- Procedure S_DisplayScreenField(R,C,T,L,DL,DF,DB,NF,NB:Integer;Var S:S_Str80);
- Var
- RealWork : Real;
- X,Y,
- S_Result : Integer;
- BackColor,
- ForColor : Integer;
-
- Begin
- If T in [1..7] Then
- Begin
- If Pos(S,'-0.000000') = 1 Then Begin DL := DL - 2; Delete(S,1,2); End;
- If Pos(S,'-0.000000') = 2 then Begin DL := DL - 1; Delete(S,1,1); End;
- If Pos('-0',S) > 1 then Begin DL := DL - 1; Delete(S,2,1); End;
- End;
-
- S_Padding := Copy(S_Blanks,1,(L-DL));
-
- If Dl > 0 Then S_Result := (DB * 16) + DF
- Else S_Result := (NB * 16) + NF;
-
- FillChar(S_NormAttrib,81,S_Result);
- S_NormAttrib[0] := Chr(80);
-
- If T in [0..7] Then
- Begin
- S_Padding := S_Padding + S;
- If Pos('-.',S) = 1 Then Begin S_Ins_Str := '0'; Insert(S_Ins_Str,S,2); End;
- If S[1] <> '-' Then S := '0' + S;
- If Pos('.',S) = 0 Then S:= S + '.0' Else S := S + '0';
- End
- Else
- S_Padding := S + S_Padding;
-
- S_Write(R,C,L+2,' '+S_Padding+' ',S_NormAttrib)
- End;
-
-
-
-
-
- Procedure S_FillScreen;
- VAR
- S_PrevFld : Integer;
- RealWork : Real;
-
- Begin
- {
- S_BufferOnly := True;
- }
- S_PrevFld := S_Point;
- S_Point := 0;
- While S_Point < S_Indx^.S_Count[S_Num] Do
- With S_Field^ Do
- Begin
- S_Point := S_Point + 1;
- S_GetFieldType(S_Type[S_Point]);
- If S_FType In [8,9] Then
- Move(S_WorkArea^[S_FieldPtr^[S_Point]],S_EditStr,S_Len[S_Point] + 1)
- Else
- Begin
- Move(S_WorkArea^[S_FieldPtr^[S_Point]],RealWork,6);
- If S_FType = 0 Then
- Str(RealWork:1:0,S_EditStr)
- Else
- Str(RealWork:1:S_FType-1,S_EditStr);
- End;
- S_DataLen[S_Point] := Ord(S_EditStr[0]);
- S_DisplayScreenField(
- S_Field^.S_Row[S_Point],
- S_Field^.S_Col[S_Point],
- S_FType,
- S_Field^.S_Len[S_Point],
- S_Field^.S_DataLen[S_Point],
- S_Field^.S_DisplayFg[S_Point],
- S_Field^.S_DisplayBg[S_Point],
- S_Field^.S_NormalFg[S_Point],
- S_Field^.S_NormalBg[S_Point],
- S_EditStr);
- S_Field^.S_DataLen[S_Point] := S_Length(S_EditStr);
- END;
- S_Point := S_PrevFld;
- End;
-
-
-
-
-
- Procedure S_GetKey;
- Var ClearLine : Boolean;
- Begin
- ClearLine := False;
- S_ResetKeyFlags;
- S_Ch := #00;
-
- If (S_ErrorMsg[0]>#00) Then
- Begin
- S_Freq := S_ErrorFreq;
- S_Dur := S_ErrorDur;
- S_Sound := S_ErrorSound;
- S_MessBg := S_ErrorBg;
- S_MessFg := S_ErrorFg;
- S_Msg := S_ErrorMsg;
- S_ErrorMsg[0]:=#00;
- End
- Else
- If (S_UserMsg[0]>#00) Then
- Begin
- S_Freq := S_UserFreq;
- S_Dur := S_UserDur;
- S_Sound := S_UserSound;
- S_MessBg := S_UserBg;
- S_MessFg := S_UserFg;
- S_Msg := S_UserMsg;
- S_UserMsg[0]:=#00;
- End
- Else
- If (S_AutoHelpMsg[0]>#00) Then
- Begin
- S_Freq := S_HelpFreq;
- S_Dur := S_HelpDur;
- S_Sound := S_HelpSound;
- S_MessBg := S_HelpBg;
- S_MessFg := S_HelpFg;
- S_Msg := S_AutoHelpMsg;
- S_AutoHelpMsg[0]:=#00;
- End;
-
- If (S_Msg[0]>#00) Then
- Begin
- S_Wait := True;
- S_DisplayMessage(S_MessBg,S_MessFg,S_Msg);
- ClearLine := True;
- End;
-
-
- {$IFDEF MOUSE}
- If S_MouseActive And S_MouseVisable Then
- S_RestoreMouse;
- While (Not (KeyPressed) And Not(S_MouseEvent)) Do
- {$ELSE}
- While Not KeyPressed Do
- {$ENDIF}
- Begin
- S_Count:= 0;
- S_LeftShift:= False;
- S_RightShift:= False;
- S_Shift:= False;
- S_Ctrl:= False;
- S_Alt:= False;
- S_ScrollLock:= False;
- S_NumLock:= False;
- S_Caps:= False;
- S_InsertMode:= False;
- If ((S_NumLockBit and 2)=2) Then
- Begin
- S_Count := S_Count + 1;
- S_LeftShift := True;
- S_Shift := True;
- End;
- If ((S_NumLockBit and 1)=1) Then
- Begin
- S_Count := S_Count + 1;
- S_RightShift := True;
- S_Shift := True;
- End;
- If ((S_NumLockBit And 4)=4) Then
- Begin
- S_Count := S_Count + 1;
- S_Ctrl := True;
- End;
- If ((S_NumLockBit And 8)=8) Then
- Begin
- S_Count := S_Count + 1;
- S_Alt := True;
- End;
- If ((S_NumLockBit And 16)=16) Then S_ScrollLock := True;
- If ((S_NumLockBit and 32)=32) then S_NumLock := True;
- If ((S_NumLockBit And 64)=64) Then S_Caps := True;
- If ((S_NumLockBit And 128)=128) Then S_InsertMode := True;
- If (S_ShowStatus)And(Not(S_Wait)) Then
- Begin
- FillChar(S_StAttrib,41,S_StColor);
- FillChar(S_StAttrWork,21,S_StLabelColor);
- S_StAttrib[0] := #40;
- S_StAttrWork[0]:= #20;
- If S_InsertMode Then Move(S_StAttrWork[1],S_StAttrib[1],8);
- If S_Caps Then Move(S_StAttrWork[1],S_StAttrib[10],6);
- If S_NumLock Then Move(S_StAttrWork[1],S_StAttrib[17],10);
- If S_ScrollLock Then Move(S_StAttrWork[1],S_StAttrib[28],13);
- S_Write(25,21,40,S_StLine,S_StAttrib);
- End;
-
- If S_Count > 1 Then
- Begin
- S_Fkey := True;
- S_Wait := False;
- Exit;
- End;
- End;
-
- {$IFDEF MOUSE}
- If (S_MouseActive And S_MouseVisable) Then
- S_RemoveMouse;
- {$ENDIF}
-
- If ClearLine Then
- Begin
- S_Wait := False;
- S_Msg := '';
- S_DisplayMessage(S_MessBg,S_MessFg,S_Msg);
- ClearLine := False;
- End;
-
- {$IFDEF MOUSE}
- if S_MouseEvent Then
- Begin
- S_Ch_Num := 0;
- Exit;
- End;
- {$ENDIF}
-
- S_Ch := ReadKey;
-
- S_Done := True;
- Case S_Ch_Num of
- 9 : S_Tab:=True;
- 27 : Begin S_Esc:=True; S_Fkey:=True; Exit;End;
- 13 : Begin
- If S_EnterAsTab Then
- S_Tab := True
- Else
- S_Enter := True;
- End;
- 8 : Begin S_BkSp:=True; S_BackSpace:=True;End;
- Else
- S_Done:=False;
- End;
-
- If S_Done Then
- Begin
- S_Ch_Num := 0;
- Exit;
- End;
-
- If S_Ctrl Then
- Begin
- If S_Ch_Num = 127 Then
- Begin
- S_BackSpace := True;
- S_Ch := #00;
- Exit;
- End;
- If S_Ch_Num In [1..26] Then
- Begin
- S_Fkey := True;
- S_Ch_Num := S_Ch_Num + 64;
- Exit
- End;
- End;
-
- If S_Shift Then
- Begin
- S_Done := True;
- Case S_Ch of
- '8': S_Up := True;
- '7': S_Home := True;
- '9': S_PgUp := True;
- '4': S_Left := True;
- '6': S_Right:= True;
- '1': S_End := True;
- '2': S_Down := True;
- '3': S_PgDn := True;
- '0': S_Ins := True;
- '.': S_Del := True;
- Else
- S_Done := False;
- End;
- If S_Done Then
- Begin
- S_Fkey := True;
- S_Ch_Num := 0;
- Exit;
- End;
- End;
-
- If S_Ch_Num = 0 Then
- Begin
- S_Ch := ReadKey;
- Case S_Ch_Num Of
- 84..93,135,136: S_Shift := True;
- 94..103,115..119,132,137,138: S_Ctrl := True;
- 16..25,30..38,44..50,104..113,120..121,139,140 : S_Alt := True;
- End;
- If S_Alt Then
- Begin
- S_Done := True;
- Case S_Ch_Num Of
- 30 :S_Ch:='A';
- 48 :S_Ch:='B';
- 46 :S_Ch:='C';
- 32 :S_Ch:='D';
- 18 :S_Ch:='E';
- 33 :S_Ch:='F';
- 34 :S_Ch:='G';
- 35 :S_Ch:='H';
- 23 :S_Ch:='I';
- 36 :S_Ch:='J';
- 37 :S_Ch:='K';
- 38 :S_Ch:='L';
- 50 :S_Ch:='M';
- 49 :S_Ch:='N';
- 24 :S_Ch:='O';
- 25 :S_Ch:='P';
- 16 :S_Ch:='Q';
- 19 :S_Ch:='R';
- 31 :S_Ch:='S';
- 20 :S_Ch:='T';
- 22 :S_Ch:='U';
- 47 :S_Ch:='V';
- 17 :S_Ch:='W';
- 45 :S_Ch:='X';
- 21 :S_Ch:='Y';
- 44 :S_Ch:='Z';
- 114 :S_Ch:='*';
- 120 :S_Ch:='1';
- 121 :S_Ch:='2';
- 122 :S_Ch:='3';
- 123 :S_Ch:='4';
- 124 :S_Ch:='5';
- 125 :S_Ch:='6';
- 126 :S_Ch:='7';
- 127 :S_Ch:='8';
- 128 :S_Ch:='9';
- 129 :S_Ch:='0';
- 130 :S_Ch:='-';
- 131 :S_Ch:='=';
- Else
- S_Done := False;
- End;
- If S_Done Then
- Begin
- S_Fkey := True;
- Exit;
- End;
- End;
-
- S_Done := True;
- Case S_Ch_Num Of
- 15 : S_Tab := True;
- 75 : Begin S_Left := True;S_LeftArrow := True;End;
- 77 : Begin S_Right := True;S_RightArrow:= True;End;
- 82 : Begin S_Ins := True;S_InsertKey := True;End;
- 83 : Begin S_Del := True;S_DeleteKey := True;End;
- Else
- S_Done := False;
- End;
-
- If S_Done Then
- Begin
- S_Ch_Num := 0;
- Exit;
- End;
- S_Done := True;
- Case S_Ch_Num Of
- 59,84,94,104 : S_F1:= True;
- 60,85,95,105 : S_F2:= True;
- 61,86,96,106 : S_F3:= True;
- 62,87,97,107 : S_F4:= True;
- 63,88,98,108 : S_F5:= True;
- 64,89,99,109 : S_F6:= True;
- 65,90,100,110 : S_F7:= True;
- 66,91,101,111 : S_F8:= True;
- 67,92,102,112 : S_F9:= True;
- 68,93,103,113 : S_F10:= True;
- 133,135,137,139 : S_F11:= True;
- 134,136,138,140 : S_F12:= True;
- 71,119 : S_Home:= True;
- 79,117 : S_End:= True;
- 72 : S_Up:= True;
- 80 : S_Down:= True;
- 73,132 : S_PgUp:= True;
- 75,115 : S_Left:= True;
- 77,116 : S_Right:= True;
- 81,118 : S_PgDn:= True;
- 82 : S_Ins:= True;
- 83 : S_Del:= True;
- Else
- S_Done := False;
- End;
-
- If S_Done Then
- Begin
- S_Fkey := True;
- S_Ch_Num := 0;
- End;
- End;
- End;
-
-
-
-
-
- Procedure S_Get_Field_Value(X:Integer);
- Var
- RealWork: Real;
- S_Result: Integer;
-
- Begin
- S_EditStr := '';
- With S_Field^ Do
- Begin
- S_GetFieldType(S_Type[X]);
- If S_FType IN [8,9] Then
- Move(S_WorkArea^[S_FieldPtr^[X]],S_EditStr,S_Len[X]+1)
- Else
- Begin
- Move(S_WorkArea^[S_FieldPtr^[X]],RealWork,6);
- IF S_FType = 0 Then
- Str(RealWork:1:0,S_EditStr)
- Else
- Str(RealWork:1:S_FType-1,S_EditStr);
- End;
- S_DataLen[X] := Ord(S_EditStr[0]);
- End;
- End;
-
-
-
-
-
-
- Procedure S_PreEdit(HR,HL:Integer);
- var
- Work:String[4];
- X : integer;
- Rec: LongInt;
- Begin
- FillChar(S_InitialValue,81,0);
- FillChar(S_AutoHelpMsg,81,0);
- FillChar(S_EditMask,81,0);
- S_Force_EditMask := False;
- X := 0;
- While (((HR>0) And (X<3))) Do
- Begin
- If (S_VRec<>HR) Then
- Begin
- S_VRec := HR;
- Seek(S_File,HR);
- Read(S_File,S_Validate^);
- End;
-
- Inc(X);
-
- If (((S_AutoHelp)Or(S_QuickHelp)) And
- (S_Validate^.S_RangeList[HL][1]='H')) Then
- S_AutoHelpMsg :=
- Copy(S_Validate^.S_RangeList[HL],6,Length(S_Validate^.S_RangeList[Hl])-5);
-
- If ((S_Validate^.S_RangeList [HL][1]='E')And
- (S_Validate^.S_RangeList [HL][2]='D')) Then
- Begin
- If (S_Validate^.S_RangeList[HL][6]='F') Then
- Begin
- S_Force_EditMask := True;
- S_EditMask :=
- Copy(S_Validate^.S_RangeList[HL],9,Length(S_Validate^.S_RangeList[Hl])-9);
- End
- Else
- Begin
- S_EditMask :=
- Copy(S_Validate^.S_RangeList[HL],7,Length(S_Validate^.S_RangeList[Hl])-7);
- End;
- End;
-
- If ((S_Validate^.S_RangeList[HL][1]='S')And
- (S_Validate^.S_RangeList[HL][2]='E')) Then
- Begin
- S_InitialValue:=
- Copy(S_Validate^.S_RangeList[HL],6,Length(S_Validate^.S_RangeList[Hl])-6);
- If (S_UpShiftedStr(S_InitialValue)='SYSDATE') Then
- Begin
- GetDate(S_Year,S_Month,S_Day,S_DayOfWeek);
- Str(S_Month:2,Work);
- If Work[1]=#32 Then Work[1]:='0';
- S_InitialValue := Work + '/';
- Str(S_Day:2,Work);
- If Work[1]=#32 Then Work[1]:='0';
- S_InitialValue := S_InitialValue + Work + '/';
- Str(S_Year:4,Work);
- S_InitialValue := S_InitialValue + Work;
- End;
- End;
- HR := S_Validate^.s_rangerec [HL];
- HL := S_Validate^.s_rangeline[HL];
- End;
- End;
-
-
-
-
- Procedure S_EditString (R,C,T,L,F,B,DF,DB,NF,NB,HR,HL:Integer;Var S:S_Str80);
- Var
- WorkNum: Real;
- X,Y,Z,S_Result: Integer;
- Begin
- S_Fg:= 2;
- S_Bg:= 0;
- S_Pos:= 1;
- S_Ins_Str:= ' ';
- S_Attrib := Trunc((B*16) + F);
- If S_Cursor In [S_Off,S_InverseNormal,S_InverseBold] Then
- Begin
- If S_Attrib > 16 Then
- Begin
- If F = 0 Then
- S_Reverse := 15
- Else
- S_Reverse := F;
- End
- Else
- Begin
- If F = 7 Then
- S_Reverse := 127
- Else
- S_Reverse := 112+F;
- End;
- End
- Else
- S_Reverse := S_Attrib;
-
- FillChar(S_EditAttrib,81,S_Attrib);
-
- S_EditAttrib[0] := Chr(L+2);
-
- If T < 8 Then
- Begin
- If Pos(S,'0.000000') > 0 Then S := '';
- If Pos('0.',S) = 1 Then Delete(S,1,1);
- If Pos('-0.',S) = 1 Then Delete(S,2,1);
- End;
-
- S_StLabelColor:= S_SetColor(S_StLabelBg,S_StLabelFg);
- S_StColor:= S_SetColor(S_StBg,S_StFg);
- S_WorkStr:= S + S_Blanks;
- S_WorkStr[0]:= Chr(L);
- S_Max_Dig:= L - T;
-
- If S_LeftArrow Then
- Begin
- S_Pos := S_Length(S_WorkStr);
- If S_Pos < L Then S_Pos := S_Pos + 1;
- End;
-
- S_Setcursor(S_Cursor);
-
- If S_EditMask > '' Then
- Begin
- While Not(S_EditMask[S_Pos] In ['@','2','#','3','$','4']) Do
- If S_LeftArrow Then Dec(S_Pos) Else Inc(S_Pos);
- For X := 1 to L do
- If Not(S_EditMask[X] In ['@','2','#','3','$','4']) Then
- S_WorkStr[X] := S_EditMask[X];
- End;
-
- Repeat
- If (T<8) And (S_Pos > S_Length(S_WorkStr)) then
- S_Pos := S_Length(S_WorkStr)+1
- Else
- If (S_EditMask[0]>#00) Then
- Begin
- While Not(S_EditMask[S_Pos] In ['@','2','#','3','$','4']) Do
- Begin
- S_WorkStr[S_Pos] := S_EditMask[S_Pos];
- If (S_LeftArrow) Then Dec(S_Pos) Else Inc(S_Pos);
- End;
- End;
-
- S_EditAttrib[S_Pos+1]:=Chr(S_Reverse);
- S_Write(R,C,L+2,' ' + S_WorkStr + ' ',S_EditAttrib);
- GoToXY((C)+S_Pos,R);
- S_GetKey;
- S_EditAttrib[S_Pos+1]:=S_EditAttrib[1];
- S_Write(R,C,L+2,' '+S_WorkStr+' ',S_EditAttrib);
-
- If S_LeftArrow Or S_BackSpace Then
- Begin
- If S_Pos > 1 Then
- Begin
- S_Pos := S_Pos - 1;
- If S_BackSpace Then
- S_DeleteKey := True;
- End
- Else
- If S_LeftArrow Then
- Begin
- S_Shift := True;
- S_Tab := True;
- End;
- End;
-
- If S_RightArrow Then
- If S_Pos < L Then
- Begin
- If (T < 8) And (S_Pos > S_Length(S_WorkStr)) Then
- S_Tab := True
- Else
- S_Pos := S_Pos + 1;
- End
- Else
- S_Tab := True;
-
- If (S_Shift And S_Del) Or (S_DeleteKey) Then
- Begin
- If S_Length(S_WorkStr) > 0 Then
- Begin
- If S_Shift Then
- Begin
- FillChar(S_WorkStr[S_Pos],(Length(S_WorkStr)-S_Pos)+1,32);
- S_Fkey := False;
- X := S_Pos;
- If (S_EditMask[0]>#00) Then
- Begin
- While X <= L Do
- Begin
- If Not(S_EditMask[X] In ['@','2','#','3','$','4']) Then
- S_WorkStr[X] := S_EditMask[X];
- Inc(X);
- End;
- End;
- End
- Else
- Begin
- If (S_EditMask > '') And (S_Pos < L) Then
- Begin
- Y := 0;
- X := S_Pos+1;
- Z := S_Pos;
- While X <= L Do
- Begin
- If S_EditMask[X] In ['@','2','#','3','$','4'] Then
- Begin
- If (S_EditMask[X] <> S_EditMask[Z]) Then
- Begin
- S_WorkStr[Z] := #32;
- X := L+1
- End
- Else
- Begin
- S_WorkStr[Z] := S_WorkStr[X];
- Inc(Z);
- While Not(S_EditMask[Z]In['@','2','#','3','$','4'])Do Inc(Z);
- End;
- End;
- Inc(X);
- If X > L Then S_WorkStr[Z] := #32
- End;
- End
- Else
- Begin
- Delete(S_WorkStr,S_Pos,1);
- S_WorkStr := S_WorkStr + #32;
- End;
- End;
- End;
- S_Fkey := False;
- End;
-
- If (S_Pos=1) And (S_Ch='?') Then
- Begin
- S_QuickHelp := True;
- S_PreEdit(HR,HL);
- S_QuickHelp := False;
- If S_AutoHelpMsg = '' Then
- S_AutoHelpMsg := ' No HELP available for this field. ';
- S_Ch := #00;
- End;
-
- If (Not S_Ctrl) And
- (Not S_Alt ) And (Not S_Fkey) And (S_Ch In [#32..#127]) Then
- Begin
- If T < 8 Then
- Begin
- Case S_Ch of
- '-' : If ((Pos('-',S_WorkStr) > 0) Or (S_Pos > 1)) Then S_Ch := #00;
- '.' : If ((T = 0 ) Or
- (Pos('.',S_WorkStr) > 0)) And
- (Pos('.',S_WorkStr) <> S_Pos) Then S_Ch := #00;
- '0'..'9':
- Else
- S_Ch := #00;
- End;{Case of}
- End;
-
- If T = 8 Then
- Begin
- If (S_EditMask > '') And (S_EditMask[S_Pos] In ['@','2']) Then
- Begin
- If Not(UpCase(S_Ch) In['A'..'Z']) Then
- Begin
- S_Ch := #00;
- S_ErrorMsg := ' Only a value of "a" thru "z" or "A" thur "Z" acceptable here.';
- End;
- End
- Else
- If Not (S_Ch In [#32,'A'..'Z','a'..'z']) Then S_Ch := #00;
- End;
-
- If (T = 9) And (S_EditMask > '') Then
- Begin
- If S_EditMask[S_Pos] in ['@','2'] Then
- Begin
- If Not(UpCase(S_ch) In ['A'..'Z']) Then
- Begin
- S_ErrorMsg := ' Only a value of "a" thru "z" or "A" thur "Z" is acceptable here.';
- S_Ch := #00;
- End;
- End;
- If S_EditMask[S_Pos] in ['3','#'] Then
- Begin
- If Not(S_ch In ['0'..'9']) Then
- Begin
- S_ErrorMsg := ' Only a value of "0" thru "9" is acceptable here.';
- S_Ch := #00;
- End;
- End;
- End;
-
- If S_ch > #00 Then
- Begin
- If S_InsertMode = True Then
- Begin
- If S_Pos <= L Then
- Begin
- If (S_Pos < L) And (S_EditMask > '') Then
- Begin
- Y := 0;
- X := S_Pos;
- Z := S_Pos;
- While (Not(S_EditMask[X+1] In ['@','2','#','3','$','4']) Or
- (S_EditMask[X+1] = S_EditMask[Z])) And
- (X < L) Do Inc(X);
- Y := X - 1;
- While Y >= S_Pos Do
- Begin
- If Not(S_EditMask[Y] In['@','2','#','3','$','4'])Then Dec(Y)
- Else
- If ((S_EditMask[Z]<>S_EditMask[X])Or
- (Not(S_EditMask[X] In['@','2','#','3','$','4'])))Then
- Begin Dec(X);Y:=X-1;End
- Else
- Begin
- S_WorkStr[X] := S_WorkStr[Y];
- Dec(X);
- Dec(Y);
- End;
- End;
- S_WorkStr[S_Pos] := S_Ch;
- End
- Else
- Begin
- S_Ins_Str[1] := S_Ch;
- Insert(S_Ins_Str,S_WorkStr,S_Pos);
- End;
- End;
- End
- Else
- S_WorkStr[S_Pos] := S_ch;
- If S_Pos < L Then
- S_Pos := S_Pos + 1
- Else
- Begin
- S_Tab := True;
- S_Shift := False;
- End;
- S_WorkStr[0] := Chr(L);
- End;
- End;
-
- If (Not S_Enter)And(S_Tab) Then
- Begin
- if ((S_Shift)And(S_Pos>1)) Then
- Begin
- X:=S_Pos-1;
- While Not (S_EditMask[X] In ['#','3','$','4','@','2']) Do Dec(X);
- S_Pos:=1;
- If (X>1) And (S_EditMask[0]>#00) Then
- Begin
- If S_EditMask[X] In ['#','3','$','4','@','2'] Then
- While ((X>1)And(S_EditMask[X] In ['#','3','$','4','@','2'])) do
- Dec(X);
- {
- While Not (S_EditMask[X] In ['#','3','$','4','@','2']) Do Dec(X);
- While ((X>1)And(S_EditMask[X] In ['#','3','$','4','@','2'])) Do Dec(X);
- }
- If X > 1 Then Inc(X);
- S_Pos := X;
- End;
- S_Tab := False;
- S_Fkey:= False;
- End;
-
- If (Not(S_Shift)And(S_Pos<=L)) Then
- Begin
- If S_EditMask[0]>#00 Then
- Begin
- X := S_Pos;
- While ((X<=L)And(S_EditMask[X] In ['#','3','$','4','@','2'])) Do
- Inc(x);
- While ((X<=L)And(Not(S_EditMask[X] In ['#','3','$','4','@','2']))) Do
- Inc(x);
- If (X<=L) Then
- Begin
- S_Pos := X;
- S_Tab:=False;
- S_Fkey:=False;
- End;
- End;
- End;
-
- End;
-
- If S_Force_EditMask Then
- Begin
- If (S_Enter) Or (S_Tab) Then
- Begin
- X := 0;
- While X <= L Do
- Begin
- Inc(X);
- If (S_EditMask[X] In ['#','3','@','2']) And (S_WorkStr[X] = ' ') Then
- Begin
- S_Pos := X;
- S_ErrorMsg := '"'+S_Ch+'" does not fit edit mask '+ S_EditMask;
- S_Enter := False;
- S_Tab := False;
- X := L;
- End;
- End;
- End;
- End;
-
- {$IFDEF MOUSE}
- Until S_Enter Or S_Tab Or S_Esc Or S_Fkey Or S_MouseEvent;
- {$ELSE}
- Until S_Enter Or S_Tab Or S_Esc Or S_Fkey;
- {$ENDIF}
- S_SetCursor(S_Off);
-
- S_WorkStr := Copy (S_WorkStr,1,S_Length(S_WorkStr));
-
- If length(S_WorkStr) > 0 Then
- S_Attrib := Trunc((DB*16) + DF)
- Else
- S_Attrib := Trunc((NB*16) + NF);
-
- FillChar(S_EditAttrib,81,S_Attrib);
- S_EditAttrib[0] := Chr(L+2);
-
- S_Msg := '';
-
- If T < 8 Then
- Begin
- If S_WorkStr = '' then S_workstr := '0.0';
- If S_WorkStr[1] = '.' Then S_WorkStr := '0'+S_WorkStr;
- If Pos('-.',S_WorkStr) = 1 Then
- Begin
- S_Ins_Str[1] := '0';
- Insert(S_Ins_Str,S_WorkStr,2);
- End;
- Val(S_WorkStr,WorkNum,S_Result);
- If T = 0 Then
- Str(WorkNum:L:T,S_WorkStr)
- Else
- Str(WorkNum:L:(T-1),S_WorkStr);
- While (S_WorkStr [1]= ' ') Or (Length(S_WorkStr)>L) Do
- Delete(S_WorkStr,1,1);
- If Pos('0.',S_WorkStr) = 1 Then Delete(S_WorkStr,1,1);
- If Pos('-0.',S_WorkStr) = 1 Then Delete(S_WorkStr,2,1);
- If (T = 0) And (S_WorkStr = '') Then S_WorkStr := '0';
- End
- Else
- Begin
- If S_EditMask[0]>#00 Then
- Begin
- Y:=0;
- X:=0;
- While ((X<L)And(Y=0))do
- Begin
- Inc(X);
- If ((S_WorkStr[X]>#32)And
- (S_EditMask[X] In['#','3','@','2','$','4'])) Then Inc(Y);
- End;
- If Y=0 Then FillChar(S_WorkStr,L,0);
- End
- Else
- Begin
- X := L;
- While ((X>0)And(S_WorkStr[X]<#33)) Do
- Begin
- S_WorkStr[X]:=#00;
- Dec(X);
- End;
- S_WorkStr[0]:=Chr(X);
- End;
- End;
- S_AutoHelpMsg:= '';
- S_EditMask := '';
- S_EditStr := S_WorkStr;
- S:= S_WorkStr;
-
- S_DisplayScreenField(R,C,T,L,Length(S_EditStr),DF,DB,NF,NB,S)
- End;
-
-
-
- Function S_SetDisplayOn(X:Integer):Integer;
- Var Z,Y:Integer;
- Begin
- Y:=0;
- Z:=1;
- S_Result := 0;
- If S_Indx^.S_Count[S_Num] > 1 Then
- Begin
- Repeat
- If (s_field^.s_type[Z] >= 0) And (s_field^.s_type[Z] <= 9) Then Inc(Y);
- Inc(Z);
- Until Z > S_Indx^.S_Count[S_Num];
-
- If (Y=0) Then S_Result := 1;
- If Not (X In [1..S_Indx^.s_count[S_Num]]) Then S_Result := 2;
- If (s_field^.s_type[X] > 19) Then S_Result := 3;
- End
- Else
- S_Result := 4;
- If (S_Result = 0) And (s_field^.s_type[X] < 20) Then
- Inc(S_Field^.S_Type[X],90);
- S_SetDisplayOn := S_Result;
- End;
-
-
-
-
- Function S_SetDisplayOff(X:Integer):Integer;
- Begin
- S_Result := 0;
-
- If X < 1 Then S_Result := 4
- Else
- If Not(X In [1..S_Indx^.S_Count[S_Num]]) Then S_Result := 2
- Else
- If (S_Field^.S_Type[X] < 20) Then S_Result := 3
- Else
- If (S_Field^.S_Type[X] > 19) Then Dec(S_Field^.S_Type[X],90);
-
- S_SetDisplayOff := S_Result;
- End;
-
-
-
-
- Function S_IsDupe(S_Index:Integer):Boolean;
- Begin
- If (S_Index in [1..S_Indx^.S_Count[S_Num]]) And
- (S_Field^.S_type[S_Index] In [10..19,100..109]) Then
- S_IsDupe := True
- Else
- S_IsDupe := False;
- End;
-
-
-
-
- Function S_SetDupe(S_Index:Integer):Boolean;
- Var X,Y : integer;
- Begin
- Y := 0;
- X := 0;
- While X < S_Indx^.S_Count[S_Num] Do
- Begin
- Inc(X);
- If S_Field^.S_Type[x] In [0..9] Then Inc(y);
- End;
- S_SetDupeFields := False;
-
- If (Not(S_Index in [1..S_Indx^.S_Count[S_Num]])) Or
- (S_Field^.S_type[S_Index] In [10..19,100..109]) Then
- S_SetDupe := False
- Else
- If (Y > 1) Or
- (S_Field^.S_Type[S_Index] In [90..99]) Then
- Begin
- Inc(S_Field^.S_type[S_Index],10);
- S_SetDupe := True;
- If S_Field^.S_Type[S_Index] In [10..19] Then
- S_SetDupeFields := True;
- End
- Else
- Begin
- S_ErrorMsg := 'At least one field must remain a data entry field.';
- S_SetDupe := False;
- End;
- End;
-
-
-
-
- Procedure S_ReSetDupe(S_Index:Integer);
- Begin
- If (S_Index in [1..S_Indx^.S_Count[S_Num]]) And
- (S_Field^.S_type[S_Index] In [10..19,100..109]) Then
- Dec(S_Field^.S_type[S_Index],10);
- End;
-
-
-
-
- Procedure S_ClearDupes;
- Var
- S_Index :Integer;
- Dummy :Boolean;
- Begin
- S_Index := 0;
- While S_Index < S_Indx^.S_Count[S_Num] Do
- Begin
- If S_Field^.S_Type[S_Index] in [10..19,100..109] Then S_ReSetDupe(S_Index);
- Inc(S_Index);
- End;
- End;
-
-
-
-
- Procedure S_ClearScreen(Initialize:integer);
- Var
- X : Integer;
- RealWork : Real;
- Begin
- RealWork := 0;
- Fillchar(S_InitialValue,80,0);
- For X := 1 To S_Indx^.S_Count[S_Num] Do
- Begin
- S_GetFieldType(S_Field^.S_Type[X]);
- If Initialize = 1 Then
- S_PreEdit(
- S_Field^.S_RangeNextRec[X],
- S_Field^.S_RangeNextLine[X]);
- If Not S_DupType Then
- Begin
- If S_FType < 8 Then
- Begin
- Val(S_InitialValue,RealWork,S_Result);
- Move(RealWork,S_WorkArea^[S_FieldPtr^[x]],SizeOf(Real));
- End
- Else
- Begin
- if S_initialValue > '' Then
- Begin
- S_InitialValue := S_InitialValue + S_Blanks;
- S_InitialValue[0] := Chr(S_Field^.S_Len[x]);
- End;
- MOVE(S_InitialValue,S_WorkArea^[S_FieldPtr^[x]],S_Field^.S_Len[x]+ 1);
- End;
- End;
- End;
- End;
-
-
-
-
-
- Procedure S_RefreshScreen;
- Begin
- If S_Delayed Then
- S_Delayed := False;
- S_PutScrMem(S_Record^.S_Video[1],Mem[S_Seg:S_Ofs],3840);
- S_FillScreen;
- End;
-
-
-
-
- {$IFDEF COLORCHANGE}
- Function S_ChangeScreenColor(CT,Bg,Fg:Byte;SR,ER,SC,EC:Integer):Integer;
- Var
- Row, Col, Ch, Color, Error, F, P:Integer;
- Begin
-
- If (CT>4) Then
- S_ChangeScreenColor := 1
- Else
- If (Bg>7) Then
- S_ChangeScreenColor := 2
- Else
- If (Fg>30) Then
- S_ChangeScreenColor := 3
- Else
- If ((SR < 1)Or(SR>24)) Then
- S_ChangeScreenColor := 4
- Else
- If ((ER<SR)Or(ER>24)) Then
- S_ChangeScreenColor := 5
- Else
- If ((SC < 1)Or(SC>80)) Then
- S_ChangeScreenColor := 6
- Else
- if ((EC<SC)Or(EC>80)) Then
- S_ChangeScreenColor := 7
- Else
- Begin
- F :=1;
- Row :=SR;
- Col :=SC;
- Color := S_SetColor(Bg,Fg);
-
- While ((F<=S_Indx^.s_count[S_Num])And(S_Field^.s_row[F] <= Row)) Do Inc(F);
-
- While ((F<=S_Indx^.s_count[S_Num])And
- (((S_Field^.s_col[F])+(S_Field^.s_len[F]+1))<Col)
- ) Do Inc(F);
-
- If (F>S_Indx^.s_count[S_Num]) Then F:=0;
-
- Repeat
- Begin
- if (F>0) Then
- Begin
- While(
- (F>0)And
- (Row=S_Field^.s_row[F])And
- (Col>((S_Field^.s_col[F])+(S_Field^.s_len[F]+1)))) Do
- Begin
- If (F<=S_Indx^.s_count[S_Num]) Then Inc(F) Else F:=0;
- End;
- While(
- (F>0)And
- (Row>=S_Field^.s_row[F])And
- (Col>=S_Field^.s_col[F])And
- (Col<=((S_Field^.s_col[F])+(S_Field^.s_len[F]+1)))) Do
- Begin
-
- Col := ((S_Field^.s_col[F])+(S_Field^.s_len[F]+2));
- Inc(F);
-
- if (Col>EC) Then Begin Inc(Row);Col:=SC;End;
-
- if (Row>S_Field^.s_row[F]) Then
- while ((F<S_Indx^.s_count[S_Num])And(Row>S_Field^.s_row[F])) Do
- Inc(F);
-
- while((Row=S_Field^.s_row[F])And
- (SC>((S_Field^.s_col[F])+(S_Field^.s_len[F]+1)))) Do Inc(F);
- if (F>S_Indx^.s_count[S_Num]) Then F:=0;
- End;
- End;
-
- if (Row<=ER) And (Col<=EC) Then
- Begin
- P:=(((Row-1)*160)+((Col-1)*2))+1;
- Ch:= Ord(s_record^.s_video[P]);
- Case CT of
- 0 :s_record^.s_video[P+1]:=Chr(Color);
- 1 :if Ch In [179,180,191..197,217,218] Then
- s_record^.s_video[P+1]:=Chr(Color);
- 2 :if Ch in [181..190,198..216] Then
- s_record^.s_video[P+1]:=Chr(Color);
- 3 :if Ch in [219..223] Then
- s_record^.s_video[P+1]:=Chr(Color);
- End;
- End;
- Inc(Col);
- if (Col>EC) Then Begin Inc(Row);Col:=SC;End;
- End;
- Until (Row>ER);
- S_ChangeScreenColor := 0;
- End;
- End;
-
-
-
-
- Function S_ChangeFieldColor(Fl,ST,Bg,Fg:Integer):Integer;
- Begin
- If (Fl>S_Indx^.s_count[S_Num]) Then
- S_ChangeFieldColor := 1
- Else
- If (ST>2) Then
- S_ChangeFieldColor := 2
- Else
- If (Bg>7) Then
- S_ChangeFieldColor := 3
- Else
- If (Fg>30) Then
- S_ChangeFieldColor := 4
- Else
- Begin
- Case ST of
- 0 :Begin
- S_Field^.s_normalbg[Fl]:=Bg;
- S_Field^.s_normalfg[Fl]:=Fg;
- End;
- 1 :Begin
- S_Field^.s_promptbg[Fl]:=Bg;
- S_Field^.s_promptfg[Fl]:=Fg;
- End;
- 2 :Begin
- S_Field^.s_displaybg[Fl]:=Bg;
- S_Field^.s_displayfg[Fl]:=Fg;
- End;
- End;
- S_ChangeFieldColor := 0;
- End;
- End;
-
-
-
-
- Procedure S_StoreColorChanges;
- Var
- Hold : String[16];
- A,B,C,X,Y,Z,RR:Integer;
-
- Begin
- If S_Indx^.s_fieldsrecno[S_Num] > 0 Then
- Begin
- S_FirstField := (S_Indx^.s_firstfield[S_Num]);
- S_Point := 0;
- X := 0;
- While X < S_Indx^.s_count[S_Num] Do
- Begin
- Inc(X);
- Z := (((S_Field^.s_col[X])-1)*2)+1;
- A := (S_Field^.s_col[X]+S_Field^.s_len[X])*2;
- B := (S_Field^.s_row[X]-1)*160;
- s_record^.s_video[B+Z]:='[';
- s_record^.s_video[B+A]:=']';
- C := 1;
- Z := S_Field^.s_col[X]*2;
- While (C<16) Do
- Begin
- if (S_Field^.s_fieldname[X][C] > #32) Then
- s_record^.s_video[B+Z] := S_Field^.s_fieldname[X][C]
- else
- C:=99;
- inc(Z,2);
- inc(C);
- End;
- End;
- Seek(S_File,S_Indx^.s_fieldsrecno[S_Num]);
- Write(S_File,S_Field^);
- End;
- Seek(S_File,0);
- Write(S_File,S_record^);
- S_LoadScreen(S_Indx^.s_name[S_Num]);
- End;
-
- {$ENDIF}
-
-
-
-
- {$IFDEF VALIDATE}
- {$I VALIDATE.PAS}
- {$ENDIF}
-
-
-
-
- Procedure S_NextKey;
- Begin
- S_ErrorMsg := '';
- S_UserMsg := '';
- S_AutoHelpMsg := '';
- S_Wait := True;
- S_FlushKeyBuf;
- S_GetKey;
- End;
-
-
-
-
- Procedure S_ReadKey;
- Begin
- If S_Delayed Then
- Begin
- S_RefreshScreen;
- S_Delayed := False;
- End;
- If S_Indx^.S_Count[S_Num] > 0 Then S_FillScreen;
- S_FlushKeyBuf;
- S_StLabelColor := S_SetColor(S_StLabelBg,S_StLabelFg);
- S_StColor := S_SetColor(S_StBg,S_StFg);
- S_GetKey;
- End;
-
-
-
-
-
- Procedure S_ReadField;
- Var
- RealWork : Real;
- S_Result : Integer;
- Testcnt : integer;
-
- Begin
- If Not S_FileOpen Then
- Begin
- S_ErrorMsg := '** No screen has been opened.!! **';
- S_Readkey;
- Exit;
- End;
-
- If S_Delayed Then
- S_RefreshScreen;
-
- If S_Indx^.S_Count[S_Num] > 0 Then S_FillScreen;
-
- If (S_Point < 0) Or (S_Point > S_Indx^.S_Count[S_Num]) Then
- Begin
- S_ErrorMsg := ' Field number in S_Point is out of range ';
- S_ReadKey;
- Exit;
- End;
-
- If S_Field^.S_Type[S_Point] In [90..99,100..109] Then
- Begin
- S_ErrorMsg := ' Cannot do entry into a PROTECTED field - Any Key To Continue';
- S_Readkey;
- Exit;
- End;
-
-
- If S_Field^.S_Type[S_Point] In [10..19] Then
- Begin
- If Not(S_SetDupFields) then
- Begin
- S_ErrorMsg := ' Invalid access of dupe (repeating) field - Any key to Continue';
- S_Readkey;
- Exit;
- End
- Else
- S_SetDupFields := False;
- End
- Else
- If S_SetDupFields Then
- Begin
- S_ErrorMsg := ' Invalid access of dupe (repeating) fields - Any key to Continue';
- S_Readkey;
- Exit;
- End;
-
-
- S_PrevFld := S_Point;
-
- Repeat
- S_Get_Field_Value(S_Point);
- S_GetFieldType (S_Field^.S_Type[S_Point]);
- Repeat
- S_PreEdit(
- S_Field^.S_RangeNextRec[S_Point],
- S_Field^.S_RangeNextLine[S_Point]);
- S_EditString (
- S_Field^.S_Row[S_Point],
- S_Field^.S_Col[S_Point],
- S_FType,
- S_Field^.S_Len[S_Point],
- S_Field^.S_PromptFG[S_Point],
- S_Field^.S_PromptBG[S_Point],
- S_Field^.S_DisplayFg[S_Point],
- S_Field^.S_DisplayBg[S_Point],
- S_Field^.S_NormalFg[S_Point],
- S_Field^.S_NormalBg[S_Point],
- S_Field^.S_RangeNextRec[S_Point],
- S_Field^.S_RangeNextLine[S_Point],
- S_EditStr);
- S_Field^.S_DataLen[S_Point] := S_Length(S_EditStr);
- If S_FType in [0..7] Then
- Begin
- Val(S_EditStr,RealWork,S_Result);
- Move(RealWork,S_WorkArea^[S_FieldPtr^[S_Point]],6);
- End
- Else
- Begin
- Fillchar(S_WorkStr,80,0);
- Move(S_EditStr,S_WorkStr,Length(S_EditStr)+1);
- MOVE(S_WorkStr,S_WorkArea^[S_FieldPtr^[S_Point]],
- S_Field^.S_Len[S_Point] + 1);
- End;
-
- If S_Tab Then S_Fkey := True;
-
- {$IFDEF MOUSE}
- Until ((S_MouseEvent) Or (S_Enter) or (S_PrevFld <> S_Point) or (S_Fkey));
- {$ELSE}
- Until ((S_Enter) or (S_PrevFld <> S_Point) or (S_Fkey));
- {$ENDIF}
-
- S_Point := S_PrevFld;
- If (S_Enter)Or(S_Tab)Or(S_LeftArrow)Or(S_RightArrow) Then
- Begin
- {$IFDEF VALIDATE}
- If (S_Field^.S_RangeNextRec[S_Point] > 0) Then
- Begin
- S_ValidateField := S_Point;
- S_ValidateScreen;
- S_ValidateField := 0;
- If not S_ScreenValid Then S_ResetKeyFlags;
- End
- Else
- {$ENDIF}
- If (Length(S_EditStr) > S_Field^.S_Len[S_Point]) Or (S_Enter) Then
- S_ScreenValid := True;
- End;
-
- {$IFDEF MOUSE}
- Until (S_MouseEvent) Or (S_ScreenValid) OR (S_Fkey);
- {$ELSE}
- Until (S_ScreenValid) OR (S_Fkey);
- {$ENDIF}
- End;
-
-
-
-
-
-
- Procedure S_ReadScreen;
- Var
- RealWork: Real;
- S_Result: Integer;
- Begin
- If Not S_FileOpen Then
- Begin
- S_ErrorMsg := '** No screen has been opened.!! **';
- S_Readkey;
- Exit;
- End;
-
- If S_Delayed Then
- S_RefreshScreen;
-
- Case S_Indx^.S_CompiledInd [S_Num] Of
- 1,2 : S_ReadKey;
- 3 : Begin
- S_ScreenValid := False;
- S_ValidateField := 0;
- Repeat
- S_FillScreen;
- If S_Point = 0 Then S_PrevFld := 9999;
- S_Direction := 1;
- If Not(S_Point In [1..S_Indx^.S_Count[S_Num]]) Then
- S_Point := S_Indx^.S_FirstField[S_Num];
- Repeat
- If (S_Field^.S_Type[S_Point] > 19) Or
- (Not S_SetDupeFields)And(S_Field^.S_Type[S_Point] > 9) Then
- Begin
- S_PrevFld := 0;
- Repeat
- If S_Direction > 0 then S_Point := S_Field^.S_Next [S_Point];
- If S_Direction < 0 then S_Point := S_Field^.S_Prev [S_Point];
- S_GetFieldType(S_Field^.S_Type[S_Point]);
- If (S_EntryType)Or
- ((Not(S_DispType)And(S_DupType)And(S_Direction = -1))) Then
- S_PrevFld := S_Point;
- Until S_PrevFld > 0;
- End
- Else
- S_SetDupeFields := False;
-
- S_PrevFld := S_Point;
-
- S_Get_Field_Value(S_Point);
- S_PreEdit(
- S_Field^.S_RangeNextRec[S_Point],
- S_Field^.S_RangeNextLine[S_Point]);
- S_EditString(
- S_Field^.S_Row[S_Point],
- S_Field^.S_Col[S_Point],
- S_FType,
- S_Field^.S_Len[S_Point],
- S_Field^.S_PromptFG[S_Point],
- S_Field^.S_PromptBG[S_Point],
- S_Field^.S_DisplayFg[S_Point],
- S_Field^.S_DisplayBg[S_Point],
- S_Field^.S_NormalFg[S_Point],
- S_Field^.S_NormalBg[S_Point],
- S_Field^.S_RangeNextRec[S_Point],
- S_Field^.S_RangeNextLine[S_Point],
- S_EditStr);
-
- S_Field^.S_DataLen[S_Point] := S_Length(S_EditStr);
-
- If S_FType in [0..7] Then
- Begin
- Val(S_EditStr,RealWork,S_Result);
- Move(RealWork,S_WorkArea^[S_FieldPtr^[S_Point]],SizeOf(Real));
- End
- Else
- Begin
- Fillchar(S_WorkStr,80,0);
- Move(S_EditStr,S_WorkStr,Length(S_EditStr)+1);
- MOVE(S_WorkStr,S_WorkArea^[S_FieldPtr^[S_Point]],
- S_Field^.S_Len[S_Point] + 1);
- End;
-
- {$IFDEF VALIDATE}
- If S_AutoValidate Then
- Begin
- If (S_Field^.S_RangeNextRec[S_Point] > 0) Then
- Begin
- S_ValidateField := S_Point;
- S_ValidateScreen;
- S_ValidateField := 0;
- If not S_ScreenValid Then
- S_Tab := False;
- End;
- End;
- {$ENDIF}
- If S_Tab Then
- Begin
- S_PrevFld := 0;
- If S_Shift then
- Begin
- S_Direction := -1;
- S_Point := S_Field^.S_Prev [S_Point];
- If S_Field^.S_Type[S_Point] In [10..20] Then
- S_SetDupeFields := True;
- End
- Else
- Begin
- S_Direction := 1;
- S_Point := S_Field^.S_Next [S_Point];
- End;
- S_Fkey := False;
- S_Shift := False;
- End;
-
- {$IFDEF MOUSE}
- Until (S_MouseEvent) Or (S_Enter) OR (S_Fkey);
- {$ELSE}
- Until (S_Enter) OR (S_Fkey);
- {$ENDIF}
-
- {$IFDEF VALIDATE}
- If S_ENTER then S_ValidateScreen;
- {$ELSE}
- S_ScreenValid := True;
- {$ENDIF}
-
- {$IFDEF MOUSE}
- Until (S_MouseEvent) Or (S_ScreenValid) OR (S_Fkey);
- {$ELSE}
- Until (S_ScreenValid) OR (S_Fkey);
- {$ENDIF}
-
- End; {End Case Of}
- End;
- End;
-
-
-
- Begin
- S_ScrEditPrevExit := ExitProc;
- ExitProc := @S_ExitProc;
- FillChar (S_Msg,81,00);
- FillChar (S_Blanks,81,32);
- S_Blanks[0] := Chr(80);
- FillChar(S_StAttrWork,21,112);
- S_StAttrWork[0] := #20;
- FillChar(S_NormAttrib,81,00);
- S_StLine := '[Insert] [Caps] [Num Lock] [Scroll Lock]';
-
- S_StLabelBg := 7;
- S_StLabelFg := 0;
- S_StBg := 0;
- S_StFg := 2;
- S_FastVideo := False;
- S_Wait := False;
- S_SetDupeFields := False;
- S_QuickHelp := False;
- S_DelayScreen := False;
- S_Delayed := False;
- S_BufferOnly := False;
- S_UserBg := 4;
- S_UserFg := 15;
- S_UserSound := True;
- S_UserFreq := 300;
- S_UserDur := 150;
- S_UserMsg := '';
-
- S_ErrorBg := 4;
- S_ErrorFg := 15;
- S_ErrorSound := True;
- S_ErrorFreq := 300;
- S_ErrorDur := 150;
- S_ErrorMsg := '';
-
- S_HelpBg := 4;
- S_HelpFg := 15;
- S_HelpSound := True;
- S_HelpFreq := 300;
- S_HelpDur := 150;
- S_AutoHelp := False;
- S_AutoHelpMsg := '';
- S_AutoValidate:= False;
-
- S_EditMask := '';
- S_Force_EditMask := False;
- S_Cursor := S_Off;
- S_Msg := '';
- S_MessBg := 4;
- S_MessFg := 15;
- S_Sound := True;
- S_Freq := 300;
- S_Dur := 100;
-
- S_EnterAsTab := False;
-
- S_Ch := Chr(00);
- S_Point := 0;
- S_Direction:= 1;
- S_NewStr := '';
- S_Padding := '';
- S_VRec := 0;
- S_RecNo := 0;
- S_ValidateLine:= 0;
-
- S_ResetKeyFlags;
-
- S_Seg := $B000;
-
- If S_VideoPort = $3B4 Then
- Begin
- S_Ofs := $0000;
- S_Mono := True;
- End
- Else
- Begin
- S_Mono := False;
- S_Ofs := $8000;
- End;
-
- S_BW := False;
- For S_Count := 1 to ParamCount Do
- Begin
- S_WorkStr := ParamStr(S_Count);
- If S_UpShiftedStr(S_WorkStr) = '/BW' Then S_BW := True;
- End;
-
- If S_BW Then
- Begin
- S_UserBg := 0;
- S_UserFg := 15;
- S_MessBg := 0;
- S_MessFg := 15;
- S_HelpBg := 0;
- S_HelpFg := 15;
- S_ErrorBg := 0;
- S_ErrorFg := 15;
- End;
-
- If MaxAvail > 25000 Then
- Begin
- GetMem(S_Indx, SizeOf(S_Indx^));
- GetMem(S_Record, SizeOf(S_Indx^));
- GetMem(S_Field, SizeOf(S_Indx^));
- GetMem(S_Validate,SizeOf(S_Indx^));
- GetMem(S_FieldPtr,SizeOf(S_FieldPtr^));
- GetMem(S_BuffPtr, SizeOf(S_BuffPtr^));
- FillChar(S_BuffPtr^, SizeOf(S_BuffPtr^),0);
- FillChar(S_FieldPtr^,SizeOf(S_FieldPtr^),0);
- End
- Else
- Begin
- ClrScr;
- Write ('Not enough free heap memory for Turbo ScrEdit to run properly ');
- Halt;
- End;
-
- S_SetCursor(S_GetCursor);
- S_SetCursor(S_Off);
- End.{Unit}