home *** CD-ROM | disk | FTP | other *** search
- Program EditMenu;
- {$C-,V-}
- { ------------------------------------------------------------------------
- This program is edit and create menu files that are to be used by the
- TURMENU program. The files could be copies of WANG PC menu, but this
- utility should not be used to edit menu files to be used on a WANG PC.
- ------------------------------------------------------------------------ }
- {*Include File STRING.INC ***** START *****}
- {- Declare standard string types for function/procedure calling }
- {- sequence. }
-
- Type
- Str1=String[1]; { Turbo Pascal requires that }
- Str2=String[2]; { all parameters have a declared }
- Str3=String[3]; { type. Since strings of varying}
- Str4=String[4]; { length must have different type}
- Str5=String[5]; { this file exists to be included}
- Str6=String[6]; { to make sure that the string }
- Str7=String[7]; { types are declared. }
- Str8=String[8]; { .............................. }
- Str9=String[9]; { .............................. }
- Str10=String[10]; { .............................. }
- Str80=String[80]; { 80 char string }
- Str255=String[255]; { Maximum string }
-
-
- {*Include File End STRING.INC ***** END *****}
-
- {*Include File ATTKBD.CON ***** START *****}
-
- { ***************************************************************** }
- { ATT PC Keyboard definitions }
- { ***************************************************************** }
-
- Const
- RETURN_Key=#$0D;
- BACKSPACE_Key=#$08;
- ESCAPE_Key=#$1B;
- BEEP_Key=#$07;
- PREAMBLE_Key=#$00;
- PREAMBLE_Byte=$00;
- UP_Key=#$48;
- DOWN_Key=#$50;
- RIGHT_Key=#$4D;
- LEFT_Key=#$4B;
- HOME_Key=#$47;
- INSERT_Key=#$52;
- DELETE_Key=#$53;
- PageDwn_Key=#$51;
- PageUp_Key=#$49;
- END_Key=#$4F;
- TAB_Key=#$09;
- BACKTAB_Key=#$0F;
-
- CTRL_LEFT_Key=#$73;
- CTRL_RIGHT_Key=#$74;
- CTRL_END_Key=#$75;
- CTRL_PageDwn_Key=#$76;
- CTRL_HOME_Key=#$77;
- CTRL_PageUp_Key=#$84;
-
- SFKey01=#$3B;
- SFKey02=#$3C;
- SFKey03=#$3D;
- SFKey04=#$3E;
- SFKey05=#$3F;
- SFKey06=#$40;
- SFKey07=#$41;
- SFKey08=#$42;
- SFKey09=#$43;
- SFKey10=#$44;
-
- Shift_SFKey01=#$54;
- Shift_SFKey02=#$55;
- Shift_SFKey03=#$56;
- Shift_SFKey04=#$57;
- Shift_SFKey05=#$58;
- Shift_SFKey06=#$59;
- Shift_SFKey07=#$5A;
- Shift_SFKey08=#$5B;
- Shift_SFKey09=#$5C;
- Shift_SFKey10=#$5D;
-
- Alt_SFKey01=#$68;
- Alt_SFKey02=#$69;
- Alt_SFKey03=#$6A;
- Alt_SFKey04=#$6B;
- Alt_SFKey05=#$6C;
- Alt_SFKey06=#$6D;
- Alt_SFKey07=#$6E;
- Alt_SFKey08=#$6F;
- Alt_SFKey09=#$70;
- Alt_SFKey10=#$71;
-
- { ***************************************************************** }
-
-
- {*Include File End ATTKBD.CON ***** END *****}
- {*Include File SCAN.INC ***** START *****}
- Function Read_Char(Var extend:Boolean):Char;
- Type
- Register=Record Case Boolean Of
- True:(ax,bx,cx,dx,bp,si,di,ds,es,flags:Integer);
- False:(al,ah,bl,bh,cl,ch,dl,dh:Byte);
- End;
- Var
- Regs:Register;
- Begin
- With Regs Do
- Begin
- ah:=$07;
- MsDos(Regs);
- If al=PREAMBLE_Byte Then
- Begin
- extend:=True;
- MsDos(Regs);
- End
- Else
- extend:=False;
- Read_Char:=Chr(al);
- End;
- End;
-
- {*Include File End SCAN.INC ***** END *****}
- {*Include File CENTER.INC ***** START *****}
- Function Center(x,y:Integer):Integer;
- { function to return centered position of something of length y in
- a field of width x. }
-
- Begin
- If (y>x) Then
- Center:=0
- Else
- Center:=((x-y)+1) Shr 1;
- End;
-
- {*Include File End CENTER.INC ***** END *****}
- {*Include File INPUTUTI.INC ***** START *****}
- Type
- CharSet=Set Of Char;
-
-
- { UpcaseStr converts a string to upper case }
-
- Function UpcaseStr(S:Str80):Str80;
- Var
- P:Integer;
- Begin
- For P:=1 To Length(S) Do
- S[P]:=UpCase(S[P]);
- UpcaseStr:=S;
- End;
-
- { ConstStr returns a string with N characters of value C }
-
- Function ConstStr(C:Char;N:Integer):Str80;
- Var
- S:String[80];
- Begin
- If N<0 Then
- N:=0;
- S[0]:=Chr(N);
- FillChar(S[1],N,C);
- ConstStr:=S;
- End;
-
- { Beep sounds the terminal bell or beeper }
-
- Procedure Beep;
- Begin
- Write(BEEP_Key);
- End;
-
-
- Procedure InputStr(Var S:Str255;
- L,x,y:Integer;
- Term:CharSet;
- Var TC:Char);
- Var
- P:Integer;
- ch:Char;
- Special:Boolean;
- InsertMode:Boolean;
- Begin
- NormVideo;
- If Length(S)>L Then
- S:=Copy(S,1,L);
- GoToXY(x,y);Write(S,ConstStr('_',L-Length(S)));
- InsertMode:=True;
- P:=0;
- Repeat
- GoToXY(x+P,y);ch:=Read_Char(Special);
- If Not Special Then
- Begin
- Case ch Of
- #32..#126:If P<L Then
- Begin
- Case InsertMode Of
- True:Begin
- If Length(S)=L Then
- Delete(S,L,1);
- P:=P+1;
- Insert(ch,S,P);
- Write(Copy(S,P,L));
- If P=L Then P:=P-1;
- End;
- False:Begin
- P:=P+1;
- If P<=Length(S) Then
- Delete(S,P,1);
- Insert(ch,S,P);
- Write(Copy(S,P,L));
- If P=L Then P:=P-1;
- End;
- End; { case Insert Mode }
- End;
-
- BACKSPACE_Key:If P>0 Then
- Begin
- Delete(S,P,1);
- Write(BACKSPACE_Key,Copy(S,P,L),'_':1);
- P:=P-1;
- End
- Else Beep;
- Else
- If Not(ch In Term) Then Beep;
- End; { of case }
- End
- Else
- Begin
- Case ch Of
- LEFT_Key:If P>0 Then
- P:=P-1
- Else Beep;
- RIGHT_Key:If P<Length(S) Then
- P:=P+1
- Else Beep;
- INSERT_Key:InsertMode:=Not InsertMode;
- HOME_Key:P:=0;
- END_Key:P:=Length(S);
- DELETE_Key:If P<Length(S) Then
- Begin
- Delete(S,P+1,1);
- Write(Copy(S,P+1,L),'_':1);
- End;
- CTRL_END_Key:Begin
- Write(ConstStr('_',Length(S)-P));
- Delete(S,P+1,L);
- End;
- Else
- Beep;
- End; {of case}
- End;
- Until ch In Term;
- P:=Length(S);
- GoToXY(x+P,y);
- If L>P Then Write(ConstStr('_',L-P));
- TC:=ch;
- LowVideo;
- End;
-
-
- Procedure Select(Prompt:Str80;
- Term:CharSet;
- Var TC:Char);
- Var
- ch:Char;
- Special:Boolean;
- Begin
- GoToXY(1,23);Write(Prompt,'? ');ClrEol;
- Repeat
- ch:=Read_Char(Special);
- TC:=UpCase(ch);
- If Not(TC In Term) Then
- Beep;
- Until TC In Term;
- Case ch Of
- #32..#126:Write(TC);
- End;
- End;
-
- Procedure ClearLines(F,L:Integer);
- Var
- I:Integer;
- Begin
- For I:=F To L Do
- Begin
- GoToXY(1,I);ClrEol;
- End;
- End;
-
-
- {*Include File End INPUTUTI.INC ***** END *****}
- {*Include File MESSAGE.INC ***** START *****}
- Procedure Message(S:Str80);
- Begin
- GoToXY(1,25);ClrEol;
- If Length(S)>0 Then
- Begin
- NormVideo;
- Write('ERROR: ',S);
- LowVideo;
- Beep;
- End;
- End;
-
- {*Include File End MESSAGE.INC ***** END *****}
- {*Include File MENUREC.INC ***** START *****}
- Type
-
- PromptField=Record
- x,y:Integer;
- Txt:String[80];
- End;
-
- Path=String[50];
- Headers=Array[1..3] Of PromptField;
-
- FileName=Record
- Name:String[8];
- Ext:String[3];
- End;
-
- ParmsField=String[50];
-
- BlockByte=Record
- o:Byte;
- b:Byte;
- End;
-
- MenuIndex=Array[0..51] Of BlockByte;
- HelpIndex=Array[0..528] Of BlockByte;
-
- MenuEntry=Record
- Prompt:PromptField;
- DirPath:Path;
- Fname:FileName;
- Parms:ParmsField;
- Help:Integer;
- Flag:Integer;
- Drive:String[2];
- End;
-
- WMenuPtr=^WMenu;
- WMenu=Record
- EntryCount:Integer;
- Line:Headers;
- DisplayEntry:Array[1..24] Of MenuEntry;
- End;
-
- HelpScreen=Record
- HLine:Array[1..22] Of PromptField;
- End;
-
- WHelpPtr=^WHelp;
- WHelp=Record
- LastHelp:Integer;
- Htxt:Array[1..24] Of HelpScreen;
- End;
-
- bytechar=Record Case Boolean Of
- True:(C:Char);
- False:(b:Byte);
- End;
-
- MenuPointer=^MenuBuffer;
- MenuBuffer=Record
- Buf:Array[1..5,0..255] Of bytechar;
- End;
-
- HelpPointer=^HelpBuffer;
- HelpBuffer=Record
- Buf:Array[1..187,0..255] Of bytechar;
- End;
-
- ByteFile=File;
-
- Screen=Array[1..24] Of String[80];
-
-
- Const
- Term1:Set Of Char=[RETURN_Key,ESCAPE_Key];
- Term2:Set Of Char=[RETURN_Key,ESCAPE_Key,TAB_Key];
-
-
- {*Include File End MENUREC.INC ***** END *****}
- {*Include File SCREEN.INC ***** START *****}
- Const
- ScreenWidth=80;
-
-
- Procedure InputScreen(Var S:Screen;
- F,L:Integer;
- Term:CharSet;
- Var TC:Char);
- Var
- x,y,P:Integer;
- ch:Char;
- Special:Boolean;
- InsertMode:Boolean;
- Begin
- NormVideo;
- For P:=F To L Do
- Begin
- GoToXY(1,P);ClrEol;Write(S[P],ConstStr('_',ScreenWidth-Length(S[P])));
- End;
- InsertMode:=True;
- P:=0;
- x:=1;
- y:=F;
- Repeat
- GoToXY(x+P,y);ch:=Read_Char(Special);
- If Not Special Then
- Begin
- Case ch Of
- #32..#126:If P<ScreenWidth Then
- Begin
- Case InsertMode Of
- True:Begin
- If Length(S[y])=ScreenWidth Then
- Delete(S[y],ScreenWidth,1);
- P:=P+1;
- Insert(ch,S[y],P);
- Write(Copy(S[y],P,ScreenWidth));
- If P=ScreenWidth Then P:=P-1;
- End;
- False:Begin
- P:=P+1;
- If P<=Length(S[y]) Then
- Delete(S[y],P,1);
- Insert(ch,S[y],P);
- Write(Copy(S[y],P,ScreenWidth));
- If P=ScreenWidth Then P:=P-1;
- End;
- End;
- End;
-
- RETURN_Key:Begin
- If y<L Then
- y:=y+1
- Else y:=F;
- P:=0;
- End;
-
- BACKSPACE_Key:If P>0 Then
- Begin
- Delete(S[y],P,1);
- Write(BACKSPACE_Key,Copy(S[y],P,ScreenWidth),'_':1);
- P:=P-1;
- End
- Else Beep;
- Else
- If Not(ch In Term) Then Beep;
- End;
- End
- Else
- Begin
- Case ch Of
- LEFT_Key:If P>0 Then
- P:=P-1
- Else Beep;
- RIGHT_Key:If P<Length(S[y]) Then
- P:=P+1
- Else Beep;
- UP_Key:If y>F Then
- y:=y-1
- Else Beep;
- PageUp_Key:y:=F;
- INSERT_Key:InsertMode:=Not InsertMode;
- DOWN_Key:If y<L Then
- y:=y+1
- Else Beep;
- PageDwn_Key:y:=L;
- HOME_Key:P:=0;
- END_Key:P:=Length(S[y]);
- DELETE_Key:If P<Length(S[y]) Then
- Begin
- Delete(S[y],P+1,1);
- Write(Copy(S[y],P+1,ScreenWidth),'_':1);
- End;
- CTRL_END_Key:Begin
- Write(ConstStr('_',Length(S[y])-P));
- Delete(S[y],P+1,ScreenWidth);
- End;
- Else
- Beep;
- End; {of case}
- End;
- Until (ch In Term);
- TC:=ch;
- LowVideo;
- End;
-
- Procedure OutScreen(Var S:Screen;F,L:Integer);
- Var
- I:Integer;
- Begin
- For I:=F To L Do
- Begin
- GoToXY(1,I);ClrEol;Write(S[I]);
- End;
- End;
-
- {*Include File End SCREEN.INC ***** END *****}
- {*Include File HANDLE.INC ***** START *****}
- { The Following functions were written to take care of the ReadBlock
- bug in Turbo V3.0. The FileHandle function returns the MSDOS file
- handle to be used in reading from a file. The DosBlockRead function
- will attempt to read Recs number of bytes from a file with handle
- FileH. If no error occurs then the number of bytes read will be
- return in Result, otherwise Result will be -1.
-
- Gary W. Miller
- 70127,3674 Compuserve
-
- }
-
- Function FileHandle(Var FilVar):Integer;
- Var
- H:Integer Absolute FilVar;
- Begin
- FileHandle:=H;
- End;
-
-
- Procedure DosBlockRead(FileH:Integer;Var buffer;Recs:Integer;Var Result:Integer);
- Type
- DosRegs=Record Case Integer Of
- 1:(ax,bx,cx,dx,bp,si,di,ds,es,flags:Integer);
- 2:(al,ah,bl,bh,cl,ch,dl,dh:Byte);
- End;
- Var
- Regs:DosRegs;
- Begin
- With Regs Do
- Begin
- ds:=Seg(buffer); { location of Buffer segment }
- dx:=Ofs(buffer); { offset }
- cx:=Recs; { number of bytes to read }
- ah:=$3f; { Read File or Device Code }
- bx:=FileH; { Pass file handle }
- End;
- MsDos(Regs); { do it , close your eyes }
- With Regs Do
- Begin
- If (flags And 1)<>0 Then
- Result:=-1 { crap, we blew it }
- Else
- Result:=ax; { tell me what you read }
- End;
- End;
-
-
- Procedure DosBlockWrite(FileH:Integer;Var buffer;Recs:Integer;Var Result:Integer);
- Type
- DosRegs=Record Case Integer Of
- 1:(ax,bx,cx,dx,bp,si,di,ds,es,flags:Integer);
- 2:(al,ah,bl,bh,cl,ch,dl,dh:Byte);
- End;
- Var
- Regs:DosRegs;
- Begin
- With Regs Do
- Begin
- ds:=Seg(buffer); { location of Buffer segment }
- dx:=Ofs(buffer); { offset }
- cx:=Recs; { number of bytes to write }
- ah:=$40; { Write File or Device Code }
- bx:=FileH; { Pass file handle }
- End;
- MsDos(Regs); { do it , close your eyes }
- With Regs Do
- Begin
- If (flags And 1)<>0 Then
- Result:=-1 { crap, we blew it }
- Else
- Result:=ax; { tell me what you wrote }
- End;
- End;
-
-
- {*Include File End HANDLE.INC ***** END *****}
-
- Var
- FooMenu:WMenuPtr;
- FooHelp:WHelpPtr;
- FooMBuf:MenuPointer;
- FooHBuf:HelpPointer;
- MenuName:String[80];
- HelpName:String[80];
- MenuFile:ByteFile;
- HelpFile:ByteFile;
- TC:Char;
- I:Integer;
- Help:Boolean;
- Ok:Boolean;
- Create:Boolean;
- LastHelp:Integer;
- SelEntry:Integer;
- SelFun:Integer;
-
-
- {*Include File OUTCHOIC.INC ***** START *****}
- Procedure DisplayChoice(Var Foo;MaxEntry:Integer;Flag:Integer);
- Type
- DisplayTable=Array[0..10] Of PromptField;
- Var
- ScrTxt:DisplayTable Absolute Foo;
- k:Integer;
- Begin
- MaxEntry:=MaxEntry-1;
- For k:=0 To MaxEntry Do
- Begin
- If k=Flag Then
- Begin
- NormVideo;
- With ScrTxt[k] Do
- Begin
- GoToXY(x,y);Write(Txt);
- LowVideo;
- End;
- End
- Else
- With ScrTxt[k] Do
- Begin
- GoToXY(x,y);Write(Txt);
- End;
- End; { For k = 0 to MaxEntry }
- End;
-
- Procedure MakeChoice(Var Foo;
- MaxEntry:Integer;
- Var Flag:Integer;
- Var TC:Char);
- Type
- DisplayTable=Array[0..10] Of PromptField;
- Var
- ScrTxt:DisplayTable Absolute Foo;
- Special:Boolean;
-
- Begin
- MaxEntry:=MaxEntry-1;
- Repeat
- With ScrTxt[Flag] Do
- GoToXY(x-1,y);
- TC:=Read_Char(Special);
- If Not(TC In Term2) Then
- Case TC Of
- #$20:Begin
- LowVideo;
- With ScrTxt[Flag] Do
- Begin
- GoToXY(x,y);Write(Txt);
- NormVideo;
- End;
- Flag:=Flag+1;
- If Flag>MaxEntry Then Flag:=0;
- With ScrTxt[Flag] Do
- Begin
- GoToXY(x,y);Write(Txt);
- LowVideo;
- End;
- End;
-
- #$08:Begin
- LowVideo;
- With ScrTxt[Flag] Do
- Begin
- GoToXY(x,y);Write(Txt);
- NormVideo;
- End;
- Flag:=Flag-1;
- If Flag<0 Then Flag:=MaxEntry;
- With ScrTxt[Flag] Do
- Begin
- GoToXY(x,y);Write(Txt);
- LowVideo;
- End;
- End;
- Else
- Beep;
- End; { case TC of }
- Until (TC In Term2);
- End;
-
-
- {*Include File End OUTCHOIC.INC ***** END *****}
- {*Include File MENUENTR.INC ***** START *****}
- Const
- FlagTxt:Array[0..5] Of PromptField=
- ((x:23;y:22;Txt:'Menu'),(x:38;y:22;Txt:'Program'),(x:8;y:23;Txt:'Other'),
- (x:23;y:23;Txt:'System Func'),(x:38;y:23;Txt:'Command.com'),
- (x:8;y:22;Txt:'Batch Stream'));
-
- Procedure OutEntry(Var Line:MenuEntry);
- Var
- k:Integer;
- Begin
- With Line Do
- Begin
- ClearLines(19,24);
- NormVideo;
- With Line.Prompt Do
- Begin
- GoToXY(x,y+1);Write(Txt,ConstStr('_',32-Length(Txt)));
- End;
- LowVideo;
- GoToXY(6,19);Write('File Name:');
- GoToXY(26,19);Write('File Extension:');
- GoToXY(46,19);Write('On Drive:');
- GoToXY(3,20);Write('In Directory:');
- GoToXY(5,21);Write('Parameters:');
- GoToXY(2,22);Write('Type:');
- GoToXY(51,22);Write('TAB - Accept Screen');
- GoToXY(51,23);Write('ESCAPE - Cancel Operation');
- NormVideo;
- GoToXY(17,19);Write(Fname.Name,ConstStr('_',8-Length(Fname.Name)));
- GoToXY(42,19);Write(Fname.Ext,ConstStr('_',3-Length(Fname.Ext)));
- GoToXY(56,19);Write(Drive,ConstStr('_',1-Length(Drive)));
- GoToXY(17,20);Write(DirPath,ConstStr('_',50-Length(DirPath)));
- GoToXY(17,21);Write(Parms,ConstStr('_',50-Length(Parms)));
- LowVideo;
- DisplayChoice(FlagTxt,6,Flag);
- End; { with Line }
- End;
-
- Procedure EditEntry(Var Line:MenuEntry;Var TC:Char);
- Var
- SLine:MenuEntry;
- L:Integer;
- Begin
- SLine:=Line;
- With Line Do
- Begin
- L:=1;
- Repeat
- Case L Of
- 1:With Prompt Do
- InputStr(Txt,32,x,y+1,Term2,TC);
- 2:InputStr(Fname.Name,8,17,19,Term2,TC);
- 3:InputStr(Fname.Ext,3,42,19,Term2,TC);
- 4:InputStr(Drive,1,56,19,Term2,TC);
- 5:InputStr(DirPath,50,17,20,Term2,TC);
- 6:InputStr(Parms,50,17,21,Term2,TC);
- 7:MakeChoice(FlagTxt,6,Flag,TC);
- End; { case L of }
- L:=L+1;
- If L>8 Then L:=1;
- Until (TC=TAB_Key) Or (TC=ESCAPE_Key);
- End; { with Line }
- If TC=ESCAPE_Key Then
- Line:=SLine;
- ClearLines(19,24);
- End;
-
- {*Include File End MENUENTR.INC ***** END *****}
- {*Include File MENUUTIL.INC ***** START *****}
- Procedure DisplayInfo(Var Prompt:PromptField;Var buffer);
- Type
- LineRec=Record
- y:Byte;
- x:Byte;
- Txt:String[255];
- End;
-
- Var
- MenuLine:LineRec Absolute buffer;
- I:Integer;
- Flag:Boolean;
- Begin
- With MenuLine Do
- Begin
- If x=$ff Then
- Begin
- I:=1;
- While Txt[I]<>#03 Do
- I:=I+1;
- x:=40-((I) Shr 1);
- End;
- If Txt[0]=Chr(2) Then
- Begin
- I:=1;
- Flag:=True;
- While Txt[I]<>#03 Do
- Begin
- If Flag And (Txt[I]>#$20) Then
- Flag:=False;
- I:=I+1;
- End;
- If Not Flag Then
- Txt[0]:=Chr(I-1)
- Else
- Txt[0]:=Chr(0);
- End;
- Prompt.x:=x;
- Prompt.y:=y;
- Prompt.Txt:=Txt;
- End; { with MenuRec }
- End;
-
- Procedure Entry(I:Integer;Var b,o:Byte;Var buffer);
- Type
- OffRec=Record
- offset:Byte;
- blk:Byte;
- End;
- OffTable=Array[0..52] Of OffRec;
- Var
- table:OffTable Absolute buffer;
- Begin
- With table[I] Do
- Begin
- b:=blk;
- o:=offset;
- End;
- End;
-
- Procedure FileInfo(Var buffer;
- Var Stuff:MenuEntry);
- Type
- RunRec=Record
- pflag:Byte;
- phelp:Byte;
- junk:Byte;
- pdisk:Byte;
- ptxt:Array[1..255] Of Char;
- End;
- Var
- prec:RunRec Absolute buffer;
- Fnme:String[14];
- F:Integer;
- k,P:Integer;
- I:Integer;
- Begin
- With prec,Stuff Do
- Begin
- Flag:=pflag;
- Help:=phelp;
- If pdisk=0 Then
- Drive:=''
- Else
- Drive:=Chr($40+pdisk);
- DirPath:='';
- F:=0;
- k:=1;
- If (ptxt[k]='/') Or (ptxt[k]='\') Then
- Begin
- k:=k+1;
- Repeat
- F:=F+1;
- DirPath[F]:=ptxt[k];
- k:=k+1;
- Until ptxt[k]=#$20;
- k:=k+1;
- DirPath[0]:=Chr(F-1);
- End;
- F:=0;
- Fnme:='';
- P:=k+7;
- For I:=k To k+10 Do
- Begin
- If ptxt[I]<>#$20 Then
- Begin
- F:=F+1;
- Fnme[F]:=ptxt[I];
- End;
- If I=P Then
- Begin
- F:=F+1;
- Fnme[F]:='.';
- End;
- End;
- Fnme[0]:=Chr(F);
- F:=Pos('.',Fnme);
- Fname.Name:=Copy(Fnme,1,F-1);
- Fname.Ext:=Copy(Fnme,F+1,Length(Fnme));
- Parms:='';
- k:=0;
- I:=I+1;
- While ptxt[I]<>#$03 Do
- Begin
- k:=k+1;
- Parms[k]:=ptxt[I];
- I:=I+1;
- End;
- Parms[0]:=Chr(k);
- End;
- End;
-
-
- {*Include File End MENUUTIL.INC ***** END *****}
- {*Include File MENUEXTR.INC ***** START *****}
- Procedure ExtractInfo(Var Menu:WMenu;
- Var MBuffer:MenuBuffer;
- Var LastHelp:Integer);
- Var
- k:Integer;
- L:Integer;
- b,o:Byte;
-
- Begin
- For k:=1 To 3 Do
- Begin
- Entry(k,b,o,MBuffer);
- DisplayInfo(Menu.Line[k],MBuffer.Buf[b,o]);
- End;
- Entry(0,b,o,MBuffer);
- L:=MBuffer.Buf[b,o+1].b;
- Menu.EntryCount:=L;
- L:=L-1;
- LastHelp:=0;
- For k:=0 To L Do
- With Menu.DisplayEntry[k+1] Do
- Begin
- Entry(k+4,b,o,MBuffer);
- DisplayInfo(Prompt,MBuffer.Buf[b,o]);
- Entry(k+4+Menu.EntryCount,b,o,MBuffer);
- FileInfo(MBuffer.Buf[b,o],Menu.DisplayEntry[k+1]);
- If Help>0 Then
- If Help>LastHelp Then LastHelp:=Help;
- End;
- End;
-
- Procedure ExtractHelp(I:Integer;Var Help:WHelp;Var HBuffer:HelpBuffer);
- Var
- k,L,t,m:Integer;
- b,o:Byte;
- Begin
- For k:=1 To I Do
- With Help.Htxt[k] Do
- Begin
- L:=1+(k-1)*22;
- m:=1;
- For t:=L To L+21 Do
- Begin
- Entry(t,b,o,HBuffer);
- DisplayInfo(HLine[m],HBuffer.Buf[b,o]);
- m:=m+1;
- End;
- End;
- Help.LastHelp:=I;
- End;
-
- Procedure ReadMenu(Var Fname:Str80;Var Good:Boolean;Var MBuffer:MenuBuffer);
- Var
- k:Integer;
- FilVar:ByteFile;
- Result:Integer;
- Begin
- Assign(FilVar,Fname);
- {$I-}Reset(FilVar); {$I+}
- Good:=(IOResult=0);
- If Good Then
- Begin
- k:=1;
- Repeat
- With MBuffer Do
- DosBlockRead(FileHandle(FilVar),Buf[k],4096,Result);
- k:=k+16;
- Until Result=0;
- Close(FilVar);
- End;
- End;
-
- Procedure ReadHelp(Var Fname:Str80;Var Good:Boolean;Var HBuffer:HelpBuffer);
- Var
- k:Integer;
- FilVar:ByteFile;
- Result:Integer;
- Begin
- Assign(FilVar,Fname);
- {$I-}Reset(FilVar); {$I+}
- Good:=(IOResult=0);
- If Good Then
- Begin
- k:=1;
- Repeat
- With HBuffer Do
- DosBlockRead(FileHandle(FilVar),Buf[k],4096,Result);
- k:=k+16;
- Until Result=0;
- Close(FilVar);
- End;
- End;
-
-
-
- {*Include File End MENUEXTR.INC ***** END *****}
- {*Include File MENUFIX.INC ***** START *****}
- Procedure MenuCursorSet(Var Menu:WMenu);
- Var
- I:Integer;
- MaxLen1,MaxLen2:Integer;
- ScrWidth:Integer;
- HalfWay:Integer;
- yset:Integer;
- xset1,xset2:Integer;
-
- Begin
- For I:=1 To 3 Do
- With Menu.Line[I] Do
- Begin
- x:=Center(80,Length(Txt));
- y:=I-1;
- End;
- MaxLen1:=0;
- MaxLen2:=0;
- ScrWidth:=80;
- If Menu.EntryCount>12 Then
- Begin
- HalfWay:=(Menu.EntryCount+1) Shr 1;
- ScrWidth:=40;
- End
- Else
- HalfWay:=Menu.EntryCount;
- For I:=1 To Menu.EntryCount Do
- With Menu.DisplayEntry[I].Prompt Do
- Begin
- If I<=HalfWay Then
- Begin
- If Length(Txt)>MaxLen1 Then
- MaxLen1:=Length(Txt);
- End
- Else
- If Length(Txt)>MaxLen2 Then
- MaxLen2:=Length(Txt);
- End;
- yset:=6+Center(12,HalfWay);
- xset1:=Center(ScrWidth,MaxLen1);
- xset2:=39+Center(ScrWidth,MaxLen2);
- For I:=1 To HalfWay Do
- Begin
- With Menu.DisplayEntry[I].Prompt Do
- Begin
- x:=xset1;
- y:=yset;
- End;
- If I+HalfWay<=Menu.EntryCount Then
- With Menu.DisplayEntry[I+HalfWay].Prompt Do
- Begin
- x:=xset2;
- y:=yset;
- End;
- yset:=yset+1;
- End;
- End;
-
-
- {*Include File End MENUFIX.INC ***** END *****}
- {*Include File OUTMENU.INC ***** START *****}
- Procedure DisplayTxt(Var Prompt:PromptField);
- Begin
- With Prompt Do
- Begin
- GoToXY(x,y+1);Write(Txt);
- End;
- End;
-
- Procedure OutMenu(Var Menu:WMenu;Select:Integer);
- Var
- I:Integer;
-
- Begin
- With Menu Do
- Begin
- ClearLines(1,18);
- For I:=1 To 3 Do
- DisplayTxt(Line[I]);
- For I:=1 To EntryCount Do
- DisplayTxt(DisplayEntry[I].Prompt);
- NormVideo;
- DisplayTxt(DisplayEntry[Select].Prompt);
- LowVideo;
- End;
- End;
-
- Procedure MoveSelect(Var Old,New:Integer;Var Menu:WMenu);
- Begin
- With Menu.DisplayEntry[Old] Do
- DisplayTxt(Prompt);
- NormVideo;
- With Menu.DisplayEntry[New] Do
- DisplayTxt(Prompt);
- LowVideo;
- Old:=New;
- End;
-
- Procedure MenuSelect(Var Menu:WMenu;
- Var Sel:Integer;
- Var TC:Char);
- Var
- Special:Boolean;
- NextOne:Integer;
- Begin
- Repeat
- With Menu.DisplayEntry[Sel].Prompt Do
- GoToXY(x-1,y+1);
- TC:=Read_Char(Special);
- If Not(TC In Term2) Then
- Case TC Of
- #$20:Begin
- NextOne:=Sel+1;
- If NextOne>Menu.EntryCount Then
- NextOne:=1;
- MoveSelect(Sel,NextOne,Menu);
- End;
-
- #$08:Begin
- NextOne:=Sel-1;
- If NextOne<1 Then
- NextOne:=Menu.EntryCount;
- MoveSelect(Sel,NextOne,Menu);
- End;
- Else
- Beep;
- End; { case TC of }
- Until (TC In Term2);
- End;
-
-
- {*Include File End OUTMENU.INC ***** END *****}
- {*Include File SWAPENTR.INC ***** START *****}
- Procedure SwapEntry(Var Menu:WMenu;New,Old:Integer);
- Var
- SLine:MenuEntry;
- Begin
- With Menu Do
- Begin
- SLine:=DisplayEntry[Old];
- DisplayEntry[Old]:=DisplayEntry[New];
- DisplayEntry[New]:=SLine;
- DisplayEntry[New].Prompt.x:=DisplayEntry[Old].Prompt.x;
- DisplayEntry[New].Prompt.y:=DisplayEntry[Old].Prompt.y;
- DisplayEntry[Old].Prompt.x:=SLine.Prompt.x;
- DisplayEntry[Old].Prompt.y:=SLine.Prompt.y;
- End;
- End;
-
- {*Include File End SWAPENTR.INC ***** END *****}
- {*Include File PRINTMEN.INC ***** START *****}
- Procedure PrintPrompt(Var List:Text;Var Prompt:PromptField);
- Begin
- With Prompt Do
- Begin
- WriteLn(List,'Position (',x:0,',',y:0,')');
- WriteLn(List,Txt);
- End;
- End;
-
- Procedure PrintEntry(Var List:Text;Var MEntry:MenuEntry);
- Begin
- With MEntry Do
- Begin
- PrintPrompt(List,Prompt);
- WriteLn(List,'Path : ',DirPath);
- WriteLn(List,'File : ',Fname.Name);
- WriteLn(List,'Ext : ',Fname.Ext);
- WriteLn(List,'Parm : ',Parms);
- WriteLn(List,'Help : ',Help);
- WriteLn(List,'Flag : ',Flag);
- WriteLn(List,'Drive: ',Drive);
- End;
- End;
-
- Procedure PrintMenu(Var Menu:WMenu;Var List:Text);
- Var
- I:Integer;
- Begin
- With Menu Do
- Begin
- WriteLn(List,'No. of entries :',EntryCount:3);
- WriteLn(List,' Heading lines');
- For I:=1 To 3 Do
- PrintPrompt(List,Line[I]);
- For I:=1 To EntryCount Do
- PrintEntry(List,DisplayEntry[I]);
- End;
- End;
-
- {*Include File End PRINTMEN.INC ***** END *****}
- {*Include File EDTHEAD.INC ***** START *****}
- Procedure EditHeaders(Var Menu:WMenu;Var TC:Char);
- Var
- SLine:Headers;
- L:Integer;
-
- Begin
- With Menu Do
- Begin
- ClrScr;
- LowVideo;
- GoToXY(31,1);Write('Menu Edit Utility');
- GoToXY(36,1);Write('Release 1.0');
- GoToXY(51,19);Write('TAB - Accept Screen');
- GoToXY(51,20);Write('ESCAPE - Terminate');
- GoToXY(51,21);Write('RETURN - Next Field');
- NormVideo;
- GoToXY(1,4);Write('Enter Text to be centered on the first three lines.');
- LowVideo;
- GoToXY(6,6);Write('Line One: ');NormVideo;Write(Line[1].Txt);LowVideo;
- GoToXY(6,8);Write('Line Two: ');NormVideo;Write(Line[2].Txt);LowVideo;
- GoToXY(4,10);Write('Line Three: ');NormVideo;Write(Line[3].Txt);LowVideo;
- SLine:=Line;
- L:=1;
- Repeat
- With Line[L] Do
- InputStr(Txt,60,16,(L Shl 1)+4,Term2,TC);
- L:=L+1;
- If L>3 Then L:=1;
- Until (TC=TAB_Key) Or (TC=ESCAPE_Key);
- If TC=TAB_Key Then
- Begin
- For L:=1 To 3 Do
- With Line[L] Do
- Begin
- x:=40-(Length(Txt) Shr 1);
- y:=L-1;
- End;
- End
- Else
- Line:=SLine;
- End; { with }
- End;
-
-
- {*Include File End EDTHEAD.INC ***** END *****}
- {*Include File EDTSEL.INC ***** START *****}
- Const
- FunSel:Array[0..6] Of PromptField=
- ((x:3;y:19;Txt:'Add'),(x:3;y:20;Txt:'Edit'),(x:3;y:21;Txt:'Reorder'),
- (x:16;y:19;Txt:'Delete'),(x:16;y:20;Txt:'Edit Header'),
- (x:16;y:21;Txt:'Edit Help Screen'),(x:16;y:22;Txt:'End Menu Update'));
-
- Procedure DisplayFunction(EdtFun:Integer);
- Begin
- ClearLines(19,22);
- DisplayChoice(FunSel,7,EdtFun);
- GoToXY(51,19);Write('TAB - Select Operation');
- GoToXY(51,20);Write('ESCAPE - Terminate');
- GoToXY(51,21);Write('SPACE - Next Operation');
- End;
-
- Procedure EditFunction(Var EdtFun:Integer;Var TC:Char);
- Begin
- MakeChoice(FunSel,7,EdtFun,TC)
- End;
-
- {*Include File End EDTSEL.INC ***** END *****}
- {*Include File ADDENTRY.INC ***** START *****}
- Procedure AddEntry(Var Menu:WMenu;Var Select:Integer;Var TC:Char);
- Var
- I:Integer;
- SaveMenu:WMenuPtr;
- SSelect:Integer;
- Begin
- With Menu Do
- Begin
- If EntryCount>=24 Then
- Message('Menu is Full, 24 entries')
- Else
- Begin { Not Full }
- New(SaveMenu);
- SaveMenu^ :=Menu;
- SSelect:=Select;
- If EntryCount>0 Then
- Begin
- Select:=Select+1;
- For I:=EntryCount Downto Select Do
- DisplayEntry[I+1]:=DisplayEntry[I];
- End
- Else
- Select:=1;
- FillChar(DisplayEntry[Select],SizeOf(DisplayEntry[Select]),0);
- EntryCount:=EntryCount+1;
- MenuCursorSet(Menu);
- OutMenu(Menu,Select);
- OutEntry(DisplayEntry[Select]);
- EditEntry(DisplayEntry[Select],TC);
- If TC=ESCAPE_Key Then
- Begin
- Menu:=SaveMenu^;
- Select:=SSelect;
- End;
- Dispose(SaveMenu);
- MenuCursorSet(Menu);
- OutMenu(Menu,Select);
- End; { Not Full }
- End; { with Menu }
- End;
-
- {*Include File End ADDENTRY.INC ***** END *****}
- {*Include File EDITMENU.INC ***** START *****}
- Procedure EditMenuEntry(Var Menu:WMenu;Select:Integer;Var TC:Char);
- Begin
- With Menu Do
- Begin
- OutEntry(DisplayEntry[Select]);
- EditEntry(DisplayEntry[Select],TC);
- If TC<>ESCAPE_Key Then
- MenuCursorSet(Menu);
- OutMenu(Menu,Select);
- End;
- End;
-
-
- {*Include File End EDITMENU.INC ***** END *****}
- {*Include File REORDER.INC ***** START *****}
- Const
- Directions:Set Of Char=[TAB_Key,UP_Key,DOWN_Key];
-
- Procedure ReorderEntry(Var Menu:WMenu;Var Select:Integer;Var TC:Char);
- Var
- Special:Boolean;
- Begin
- ClearLines(19,24);
- GoToXY(51,19);Write('TAB - Complete Move');
- GoToXY(51,20);Write('UP Arrow - Move Entry Up');
- GoToXY(51,21);Write('DOWN Arrow - Move Entry Down');
- Repeat
- With Menu.DisplayEntry[Select].Prompt Do
- GoToXY(x-1,y+1);
- TC:=Read_Char(Special);
- If TC In Directions Then
- Case TC Of
- UP_Key:If Select>1 Then
- Begin
- SwapEntry(Menu,Select-1,Select);
- With Menu.DisplayEntry[Select].Prompt Do
- Begin
- GoToXY(x,y+1);Write('':32);
- GoToXY(x,y+1);Write(Txt);
- End;
- Select:=Select-1;
- NormVideo;
- With Menu.DisplayEntry[Select].Prompt Do
- Begin
- GoToXY(x,y+1);Write('':32);
- GoToXY(x,y+1);Write(Txt);
- End;
- LowVideo;
- End;
-
- DOWN_Key:If Select<Menu.EntryCount Then
- Begin
- SwapEntry(Menu,Select+1,Select);
- With Menu.DisplayEntry[Select].Prompt Do
- Begin
- GoToXY(x,y+1);Write('':32);
- GoToXY(x,y+1);Write(Txt);
- End;
- Select:=Select+1;
- NormVideo;
- With Menu.DisplayEntry[Select].Prompt Do
- Begin
- GoToXY(x,y+1);Write('':32);
- GoToXY(x,y+1);Write(Txt);
- End;
- LowVideo;
- End;
-
- End { case of TC }
- Else
- Beep;
- Until (TC=TAB_Key);
- End;
-
-
- {*Include File End REORDER.INC ***** END *****}
- {*Include File DELENTRY.INC ***** START *****}
- Procedure DeleteEntry(Var Menu:WMenu;Var Sel:Integer;Var TC:Char);
- Var
- I:Integer;
- SaveMenu:WMenuPtr;
- Begin
- With Menu Do
- Begin
- If EntryCount<1 Then
- Message('Menu is empty')
- Else
- Begin { Not Empty }
- New(SaveMenu);
- SaveMenu^ :=Menu;
- For I:=Sel To EntryCount Do
- DisplayEntry[I]:=DisplayEntry[I+1];
- EntryCount:=EntryCount-1;
- MenuCursorSet(Menu);
- OutMenu(Menu,Sel);
- Select('Confirm Delete (Y/N):',['Y','N'],TC);
- ClearLines(19,24);
- If TC='N' Then
- Begin
- Menu:=SaveMenu^;
- OutMenu(Menu,Sel);
- End;
- If Sel>EntryCount Then
- Sel:=EntryCount;
- Dispose(SaveMenu);
- End; { Not Empty }
- End; { with Menu }
- End;
-
- {*Include File End DELENTRY.INC ***** END *****}
- {*Include File EDITHELP.INC ***** START *****}
- Procedure EditHelp(Var Menu:WMenu;
- Var SelEntry:Integer;
- Var HelpTxt:WHelp;
- Var TC:Char);
-
- Var
- I:Integer;
- Scr:Screen;
- SHelp:Integer;
- SLastHelp:Integer;
- InUse:Array[1..24] Of Byte;
-
- Begin
- With Menu.DisplayEntry[SelEntry] Do
- Begin
- SHelp:=Help;
- SLastHelp:=HelpTxt.LastHelp;
- If (Help=0) Then
- Begin
- If (SLastHelp<24) Then
- Begin
- HelpTxt.LastHelp:=HelpTxt.LastHelp+1;
- Help:=HelpTxt.LastHelp;
- With HelpTxt Do
- FillChar(Htxt[Help],SizeOf(Htxt[Help]),0);
- End
- Else
- Begin
- FillChar(InUse,SizeOf(InUse),0);
- For I:=1 To Menu.EntryCount Do
- If Menu.DisplayEntry[I].Help<>0 Then
- InUse[I]:=1;
- I:=1;
- While InUse[I]=1 Do
- I:=I+1;
- Help:=I;
- With HelpTxt Do
- FillChar(Htxt[Help],SizeOf(Htxt[Help]),0);
- End;
- End;
- With HelpTxt.Htxt[Help] Do
- Begin
- For I:=1 To 22 Do
- Scr[I]:=HLine[I].Txt;
- End;
- ClearLines(23,24);
- GoToXY(21,24);Write('TAB - Accept Screen, ESCAPE - Cancel Operation');
- InputScreen(Scr,1,22,[ESCAPE_Key,TAB_Key],TC);
- If TC=ESCAPE_Key Then
- Begin
- Help:=SHelp;
- HelpTxt.LastHelp:=SLastHelp;
- End
- Else
- Begin
- With HelpTxt.Htxt[Help] Do
- For I:=1 To 22 Do
- With HLine[I] Do
- Begin
- x:=1;
- y:=I;
- Txt:=Scr[I];
- End;
- End;
- End;
- ClrScr;
- End;
-
-
- {*Include File End EDITHELP.INC ***** END *****}
- {*Include File WBUFFER.INC ***** START *****}
- Procedure StringOut(Var b,o:Integer;
- Var Foo;
- Var buffer);
- Type
- Str255=String[255];
- Var
- WBuf:HelpBuffer Absolute buffer;
- PassedStr:Str255 Absolute Foo;
- I:Integer;
- Begin
- For I:=1 To Length(PassedStr) Do
- Begin
- WBuf.Buf[b,o].C:=PassedStr[I];
- o:=o+1;
- If o>255 Then
- Begin
- o:=0;
- b:=b+1;
- End;
- End;
- End;
-
- Procedure PromptOut(Var b,o:Integer;
- Var Prompt:PromptField;
- Var buffer);
- Var
- Dummy:String[84];
- Begin
- With Prompt Do
- Begin
- Dummy[0]:=Chr(3);
- Dummy[1]:=Chr(y);
- Dummy[2]:=Chr(x);
- Dummy[3]:=#$02;
- Dummy:=Dummy+Txt;
- Dummy:=Dummy+#$03;
- StringOut(b,o,Dummy,buffer);
- End;
- End;
-
- Procedure InfoOut(Var b,o:Integer;
- Var Info:MenuEntry;
- Var buffer);
- Var
- Dummy:String[255];
- I:Integer;
- Begin
- With Info Do
- Begin
- Dummy[0]:=Chr(4);
- Dummy[1]:=Chr(Flag);
- Dummy[2]:=Chr(Help);
- Dummy[3]:=#$02;
- If (Drive='') Or (Drive=' ') Then
- Dummy[4]:=Chr(0)
- Else
- Dummy[4]:=Chr(Ord(Drive[1])-$40);
- If Not(DirPath='') Then
- Begin
- DirPath:='\'+DirPath+'\';
- Dummy:=Dummy+DirPath+' ';
- End;
- With Fname Do
- Begin
- For I:=Length(Name)+1 To 8 Do
- Name[I]:=' ';
- Name[0]:=Chr(8);
- For I:=Length(Ext)+1 To 3 Do
- Ext[I]:=' ';
- Ext[0]:=Chr(3);
- Dummy:=Dummy+Name+Ext;
- End;
- Dummy:=Dummy+Parms+#$03;
- StringOut(b,o,Dummy,buffer);
- End;
- End;
-
-
-
- {*Include File End WBUFFER.INC ***** END *****}
- {*Include File HELPBUF.INC ***** START *****}
- Procedure WriteHelpBuffer(Var Help:WHelp;
- Var b,o:Integer;
- Var buffer);
- Var
- IndexTable:HelpIndex Absolute buffer;
- Dummy:String[80];
- I:Integer;
- k:Integer;
- index:Integer;
- Begin
- index:=0;
- b:=0;
- o:=0;
- If Help.LastHelp>0 Then
- With Help Do
- Begin
- o:=34;
- b:=5;
- IndexTable[index].b:=b;
- IndexTable[index].o:=o;
- Dummy:=#$00+Chr(LastHelp)+#$02;
- StringOut(b,o,Dummy,buffer);
- For I:=1 To LastHelp Do
- With Htxt[I] Do
- For k:=1 To 22 Do
- Begin
- index:=index+1;
- IndexTable[index].b:=b;
- IndexTable[index].o:=o;
- PromptOut(b,o,HLine[k],buffer);
- End;
- End;
- End;
-
-
-
-
- {*Include File End HELPBUF.INC ***** END *****}
- {*Include File MENUBUF.INC ***** START *****}
- Procedure WriteMenuBuffer(Var Menu:WMenu;
- Var b,o:Integer;
- Var buffer);
- Var
- IndexTable:MenuIndex Absolute buffer;
- Dummy:String[80];
- I:Integer;
- index:Integer;
- Begin
- index:=0;
- With Menu Do
- Begin
- o:=(EntryCount*4)+8;
- b:=1;
- IndexTable[index].b:=b;
- IndexTable[index].o:=o;
- Dummy:=#$00+Chr(EntryCount)+#$02;
- StringOut(b,o,Dummy,buffer);
- For I:=1 To 3 Do
- Begin
- index:=index+1;
- IndexTable[index].b:=b;
- IndexTable[index].o:=o;
- PromptOut(b,o,Line[I],buffer);
- End;
- For I:=1 To EntryCount Do
- Begin
- index:=index+1;
- IndexTable[index].b:=b;
- IndexTable[index].o:=o;
- PromptOut(b,o,DisplayEntry[I].Prompt,buffer);
- End;
- For I:=1 To EntryCount Do
- Begin
- index:=index+1;
- IndexTable[index].b:=b;
- IndexTable[index].o:=o;
- InfoOut(b,o,DisplayEntry[I],buffer);
- End;
- End;
- End;
-
-
-
-
- {*Include File End MENUBUF.INC ***** END *****}
- {*Include File WBACK.INC ***** START *****}
- Procedure WriteMenu(Var FilVar:ByteFile;
- b:Integer;
- Var Good:Boolean;
- Var MBuffer:MenuBuffer);
- Var
- k:Integer;
- Result:Integer;
- Begin
- {$I-}Rewrite(FilVar); {$I+}
- Good:=(IOResult=0);
- If Good Then
- Begin
- For k:=1 To b Do
- With MBuffer Do
- DosBlockWrite(FileHandle(FilVar),Buf[k],256,Result);
- Close(FilVar);
- End;
- End;
-
- Procedure WriteHelp(Var FilVar:ByteFile;
- b:Integer;
- Var Good:Boolean;
- Var HBuffer:HelpBuffer);
- Var
- k:Integer;
- Result:Integer;
- Begin
- {$I-}Rewrite(FilVar); {$I+}
- Good:=(IOResult=0);
- If Good Then
- Begin
- For k:=1 To b Do
- With HBuffer Do
- DosBlockWrite(FileHandle(FilVar),Buf[k],256,Result);
- Close(FilVar);
- End;
- If b=0 Then
- Erase(FilVar);
- End;
-
- Procedure WriteBack(Var Menu:WMenu;
- Var MBuf:MenuBuffer;
- Var Help:WHelp;
- Var HBuf:HelpBuffer);
-
- Var
- b,o:Integer;
- Good:Boolean;
- Begin
- WriteMenuBuffer(Menu,b,o,MBuf);
- WriteMenu(MenuFile,b,Good,MBuf);
- WriteHelpBuffer(Help,b,o,HBuf);
- WriteHelp(HelpFile,b,Good,HBuf);
- End;
-
-
-
- {*Include File End WBACK.INC ***** END *****}
-
- Begin
- ClrScr;
- LowVideo;
- New(FooMenu);
- New(FooHelp);
- New(FooMBuf);
- New(FooHBuf);
- FillChar(FooMenu^,SizeOf(FooMenu^),0);
- FillChar(FooMBuf^,SizeOf(FooMBuf^),0);
- FillChar(FooHelp^,SizeOf(FooHelp^),0);
- FillChar(FooHBuf^,SizeOf(FooHBuf^),0);
- MenuName:='';
- Repeat
- GoToXY(1,1);Write('Menu File Name: ');
- InputStr(MenuName,25,17,1,Term1,TC);
- If TC<>ESCAPE_Key Then
- Begin
- I:=Pos('.',MenuName);
- If I=0 Then
- HelpName:=MenuName+'.HLP'
- Else
- HelpName:=Copy(MenuName,1,I)+'HLP';
- Assign(MenuFile,MenuName);
- Assign(HelpFile,HelpName);
- Create:=False;
- {$I-}Reset(MenuFile){$I+};
- Ok:=(IOResult=0);
- If Not Ok Then
- Begin
- Select('File does not exits, Create [Y,N]',['Y','N'],TC);
- If TC='Y' Then
- Begin
- {$I-}Rewrite(MenuFile){$I+};
- Ok:=(IOResult=0);
- Create:=True;
- End;
- End;
- End;
- Until Ok Or (TC=ESCAPE_Key);
- If TC<>ESCAPE_Key Then
- Begin
- Close(MenuFile);
- If Not Create Then
- Begin
- ReadMenu(MenuName,Ok,FooMBuf^);
- ReadHelp(HelpName,Help,FooHBuf^);
- ExtractInfo(FooMenu^,FooMBuf^,LastHelp);
- If Help Then
- ExtractHelp(LastHelp,FooHelp^,FooHBuf^);
- End;
- EditHeaders(FooMenu^,TC);
- SelEntry:=1;
- SelFun:=0;
- OutMenu(FooMenu^,SelEntry);
- If Create Then
- AddEntry(FooMenu^,SelEntry,TC);
- If TC<>ESCAPE_Key Then
- Repeat
- DisplayFunction(SelFun);
- Repeat
- MenuSelect(FooMenu^,SelEntry,TC);
- If TC=RETURN_Key
- Then EditFunction(SelFun,TC);
- Until Not(TC=RETURN_Key);
- If TC<>ESCAPE_Key Then
- Begin
- Case SelFun Of
- 0:AddEntry(FooMenu^,SelEntry,TC);
- 1:EditMenuEntry(FooMenu^,SelEntry,TC);
- 2:ReorderEntry(FooMenu^,SelEntry,TC);
- 3:DeleteEntry(FooMenu^,SelEntry,TC);
- 4:Begin
- EditHeaders(FooMenu^,TC);
- OutMenu(FooMenu^,SelEntry);
- End;
-
- 5:Begin
- EditHelp(FooMenu^,SelEntry,FooHelp^,TC);
- OutMenu(FooMenu^,SelEntry);
- End;
-
- 6:WriteBack(FooMenu^,FooMBuf^,FooHelp^,FooHBuf^);
- End;
- TC:=RETURN_Key;
- End;
- Until (TC=ESCAPE_Key) Or (SelFun=6);
- If (TC=ESCAPE_Key) And Create Then
- Erase(MenuFile);
- End;
- Dispose(FooMenu);
- Dispose(FooHelp);
- Dispose(FooMBuf);
- Dispose(FooHBuf);
- End.