=================================================================== <*> Computer Tyme MarxMenu <*> Reference Manual Copyright 1989 - 1995 by Marc Perkel All Rights Reserved * Version 2.50 * Release Date: 05-16-95 Computer Tyme * 411 North Sherman Suite 300 * Springfield, MO 65802 (417) 866-1222 voice * (417) 866-1665 bbs/fax CompuServe: 71333,427 MHS: Marc @ CTyme Internet: Marc @ CTyme.MHS.Compuserve.com =================================================================== Computer Tyme * MarxMenu * Table of Contents Page #1 ----------------------------------------------------------------- Copyright .............................................. 1 License Agreement ...................................... 1 MarxMenu Trademarks .................................... 3 Technical Support ...................................... 3 Installation ........................................... 4 Getting Started Quick .................................. 6 Use MarxHelp ........................................... 8 Common Questions and Mistakes .......................... 8 MarxMenu Features ...................................... 12 Overview of the MarxMenu System ........................ 13 What MarxMenu Does ..................................... 15 The MARX.BAT File ...................................... 16 DROPTO.BAT ............................................. 18 Support for early DOS versions ......................... 19 About Environment Variables ............................ 20 Dealing with Multiple DOS Shells ....................... 22 MarxMenu and TSR Control ............................... 22 Network Users .......................................... 23 Network Menu Strategy .................................. 23 Using TRUENAME on Networks ............................. 24 Novell Users ........................................... 24 Netware 4.x Issues ..................................... 25 The Novell Menu Translator ............................. 25 Logging out under Menu Control ......................... 27 Logging out with VLM Shells ............................ 28 Logging in with MarxMenu ............................... 28 Logging in with VLM Shells ............................. 28 Using Novell's Login ................................... 29 The CONFIG.SYS File .................................... 30 The AUTOEXEC.BAT File .................................. 30 Using a Menu File to Log In ............................ 32 Novell Search Drives ................................... 32 Novell Drive Mapping Tricks ............................ 33 Setting File Attributes ................................ 34 Novell Semaphores ...................................... 34 Using Semaphores for Software Metering ................. 35 NetWare MHS & MarxMenu ................................. 36 Upgrading MarxMenu ..................................... 37 Customizing MarxMenu Sample Files ...................... 38 Menu Analysis .......................................... 39 Onkey Statements ....................................... 39 Popup Menus ............................................ 40 The Console ............................................ 41 Repositioning the Top Window ........................... 42 Mouse Support .......................................... 42 Starting off the Easy Way .............................. 42 About Variables ........................................ 43 Numeric Variables ...................................... 44 Boolean Variables ...................................... 44 String Variables ....................................... 44 Real Numbers ........................................... 45 Local Variables ........................................ 46 Dates .................................................. 46 Passing Parameters to Procedures ....................... 46 About Constants ........................................ 47 Computer Tyme * MarxMenu * Table of Contents Page #2 ----------------------------------------------------------------- About Arrays ........................................... 48 About Qualifiers ....................................... 49 Pointer Variables ...................................... 50 Comments in Menu Files ................................. 51 The MarxMenu Compiler .................................. 51 MarxMenu Language Rules ................................ 52 Compiler Compatibility ................................. 52 A word about DOS versions .............................. 53 A word about BUGS ...................................... 54 Tips From the Master ................................... 54 Computers do Simple Tasks .............................. 54 Complex Tasks are made of Simple Tasks ................. 55 Learning Good Programming Habits ....................... 55 Use Long Names ......................................... 55 Use Comments Liberally ................................. 57 Indent Your code ....................................... 58 For Duplicate Tasks, Use Procedures .................... 59 Don't Program Yourself into a Corner ................... 59 For the POWER User ..................................... 60 Where MarxMenu is Heading .............................. 60 A word to Writers and Reviewers ........................ 61 Security Issues ........................................ 62 Keeping Users in the Menu .............................. 63 Using BREAK.SYS ........................................ 63 Using the SHELL= Command ............................... 64 Conditional Statements ................................. 65 Environment Variables used by MarxMenu ................. 67 MarxMenu DataBase Functions ............................ 68 Additional Information ................................. 69 Computer Tyme on Compuserve ............................ 69 MarxMenu Commands ...................................... 70 #Define ................................................ 71 #If .................................................... 72 #Else .................................................. 72 #Endif ................................................. 72 | ...................................................... 73 ( ...................................................... 73 ) ...................................................... 73 * ...................................................... 74 + ...................................................... 74 - ...................................................... 74 / ...................................................... 74 < ...................................................... 75 <= ..................................................... 75 <> ..................................................... 75 = ...................................................... 75 > ...................................................... 75 >= ..................................................... 76 Abs .................................................... 76 Actual ................................................. 76 AllowAbort ............................................. 76 AllowEsc ............................................... 77 AmPm ................................................... 77 And .................................................... 77 AnsiInstalled .......................................... 77 Computer Tyme * MarxMenu * Table of Contents Page #3 ----------------------------------------------------------------- AnsiWindows ............................................ 78 AppendArray ............................................ 78 AppendInstalled ........................................ 78 ApplicationMemory ...................................... 78 ArcTan ................................................. 79 ArrayInsert ............................................ 79 AssignInstalled ........................................ 79 AssignList ............................................. 79 BadDate ................................................ 80 Bat .................................................... 80 BatFileName ............................................ 80 BigShadow .............................................. 81 BinString .............................................. 81 BiosDate ............................................... 81 Blanked ................................................ 81 BlankMessage ........................................... 81 BlankScreenProgram ..................................... 82 BlankTime .............................................. 83 Blink .................................................. 83 BlockBox ............................................... 83 BootDrive .............................................. 84 BoxBorderColor ......................................... 84 BoxFooter .............................................. 84 BoxFooterLeft .......................................... 84 BoxFooterRight ......................................... 85 BoxHeader .............................................. 85 BoxHeaderColor ......................................... 86 BoxHeaderLeft .......................................... 86 BoxHeaderRight ......................................... 86 BoxInsideColor ......................................... 87 Break .................................................. 87 BrightBackground ....................................... 87 BtrvAbortTransaction ................................... 88 BtrvBeginTransaction ................................... 88 BtrvClearOwner ......................................... 88 BtrvClose .............................................. 88 BtrvCreate ............................................. 89 BtrvDelete ............................................. 91 BtrvEndTransaction ..................................... 91 BtrvGetEqual ........................................... 92 BtrvGetFirst ........................................... 92 BtrvGetGreater ......................................... 93 BtrvGetGreaterOrEqu .................................... 93 BtrvGetLast ............................................ 94 BtrvGetLess ............................................ 94 BtrvGetLessOrEqu ....................................... 95 BtrvGetNext ............................................ 95 BtrvGetPrev ............................................ 95 BtrvIndexes ............................................ 96 BtrvInsert ............................................. 96 BtrvOpen ............................................... 96 BtrvPageSize ........................................... 97 BtrvRecLen ............................................. 97 BtrvRecords ............................................ 97 BtrvReset .............................................. 98 Computer Tyme * MarxMenu * Table of Contents Page #4 ----------------------------------------------------------------- BtrvResult ............................................. 98 BtrvResultMessage ...................................... 99 BtrvSetOwner ........................................... 99 BtrvStepFirst .......................................... 99 BtrvStepLast ........................................... 100 BtrvStepNext ........................................... 100 BtrvStepPrev ........................................... 101 BtrvStop ............................................... 101 BtrvUnUsedPages ........................................ 101 BtrvUpdate ............................................. 102 BtrvVersion ............................................ 102 BuildPath .............................................. 103 CancelListEntry ........................................ 103 CapFirstChar ........................................... 103 CapsColor .............................................. 103 CapsLock ............................................... 104 CarouselLoaded ......................................... 104 Chain .................................................. 104 Char ................................................... 105 CharString ............................................. 105 ChDir .................................................. 105 CleanFileName .......................................... 105 ClearIfNewInput ........................................ 106 ClearKbdBuffer ......................................... 106 ClearKeyEvents ......................................... 106 ClearLine .............................................. 106 ClearScreen ............................................ 107 ClearScreenFirst ....................................... 107 ClearScreenOnExit ...................................... 107 ClockColor ............................................. 107 ClockMode .............................................. 108 ClockPos ............................................... 108 ClosePrinter ........................................... 109 ClusterSize ............................................ 109 CmdLine ................................................ 109 CMOS ................................................... 110 ColdBoot ............................................... 110 ColorScreen ............................................ 110 ComAcceptFileProgram ................................... 110 ComAutoDownload ........................................ 111 ComBasePort ............................................ 112 ComBaud ................................................ 112 ComBlockErrors ......................................... 112 ComBlockNumber ......................................... 112 ComBlockSize ........................................... 113 ComBreakReceived ....................................... 113 ComBytesRemaining ...................................... 113 ComBytesTransferred .................................... 113 ComCD .................................................. 113 ComCDAbort ............................................. 114 ComCharReady ........................................... 114 ComCheckActivity ....................................... 114 ComDataBits ............................................ 115 ComDonePort ............................................ 115 ComDrainSendBuffer ..................................... 115 Computer Tyme * MarxMenu * Table of Contents Page #5 ----------------------------------------------------------------- ComDTR ................................................. 115 ComEchoRecChar ......................................... 115 ComEchoSendChar ........................................ 116 ComEmptyRecBuffer ...................................... 116 ComEmptySendBuffer ..................................... 116 ComErrorLimit .......................................... 116 ComFileName ............................................ 116 ComFileSize ............................................ 117 ComFullFileName ........................................ 117 ComInitPort ............................................ 117 ComHangupOnExit ........................................ 117 ComIRQ ................................................. 117 ComLastChar ............................................ 118 ComLastLine ............................................ 118 ComLocalInput .......................................... 118 CommaString ............................................ 118 Comment ................................................ 119 ComNewLineProgram ...................................... 119 ComParity .............................................. 119 ComPort ................................................ 120 ComProtocol ............................................ 120 ComReadChar ............................................ 120 ComReadln .............................................. 121 ComReadTimeout ......................................... 121 ComRec1kXmodem ......................................... 121 ComRecKermit ........................................... 121 ComRecXmodem ........................................... 122 ComRecYmodem ........................................... 122 ComRecYmodemG .......................................... 122 ComRecZmodem ........................................... 122 ComResult .............................................. 123 ComRI .................................................. 123 ComRTS ................................................. 123 ComSendBreak ........................................... 123 ComSend1kXmodem ........................................ 123 ComSendKermit .......................................... 124 ComSendKbdChar ......................................... 124 ComSendXmodem .......................................... 124 ComSendYmodem .......................................... 124 ComSendYmodemG ......................................... 125 ComSendZmodem .......................................... 125 ComStopBits ............................................ 126 ComStripHighBit ........................................ 126 ComThisLine ............................................ 126 ComTimeout ............................................. 126 ComTotalErrors ......................................... 127 ComUseInt14 ............................................ 127 ComUseUart ............................................. 127 ComWatchCD ............................................. 127 ComWrite ............................................... 128 ComWriteln ............................................. 128 ComWriteRecChar ........................................ 128 ComWriteTimeout ........................................ 128 ComXmitAbortProgram .................................... 128 ComXmitEnding .......................................... 129 Computer Tyme * MarxMenu * Table of Contents Page #6 ----------------------------------------------------------------- ComXmitStarting ........................................ 129 ComXmitStatusProgram ................................... 129 ComZRecover ............................................ 129 Console ................................................ 130 ConsoleBorderColor ..................................... 130 ConsoleHeaderColor ..................................... 130 ConsoleInsideColor ..................................... 130 ConsolePos ............................................. 130 Const .................................................. 131 Contains ............................................... 131 CopyFile ............................................... 131 Cos .................................................... 131 CountryCode ............................................ 132 CpuClass ............................................... 132 CpuName ................................................ 132 CurrencySymbol ......................................... 133 CurrentDirectory ....................................... 133 CurrentDrive ........................................... 133 CurrentEnvironment ..................................... 133 CurrentWindow .......................................... 133 Cursor ................................................. 134 CustomBox .............................................. 134 DateSeparator .......................................... 134 DateString ............................................. 134 Day .................................................... 135 DayOf .................................................. 135 DayOfWeek .............................................. 135 DayOfWeekOf ............................................ 135 DBaseMode .............................................. 136 DbClose ................................................ 136 DbDeleted .............................................. 136 DbCreateFile ........................................... 136 DbDeleteRecord ......................................... 137 DbGetRecord ............................................ 137 DbFields ............................................... 137 DbLockFile ............................................. 138 DbLockRecord ........................................... 138 DbOpen ................................................. 138 DbRecLen ............................................... 139 DbRecords .............................................. 139 DbUnDeleteRecord ....................................... 139 DbUnLockFile ........................................... 139 DbUnLockRecord ......................................... 139 DbWriteRecord .......................................... 140 DecimalSeparator ....................................... 140 DefaultExtension ....................................... 140 Delete ................................................. 141 DelFile ................................................ 141 Devices ................................................ 142 DirectoriesOnly ........................................ 142 DisplayType ............................................ 142 DiskType ............................................... 142 Dispose ................................................ 143 DisposeAll ............................................. 143 DosBusy ................................................ 144 Computer Tyme * MarxMenu * Table of Contents Page #7 ----------------------------------------------------------------- DosKeyInstalled ........................................ 144 DosVersion ............................................. 144 DosVersionString ....................................... 144 DosWindow .............................................. 144 DoubleLineBox .......................................... 145 DPMIInstalled .......................................... 145 DPMIVersion ............................................ 145 DrawBox ................................................ 145 Drives ................................................. 146 DriveType .............................................. 146 DvAppNumber ............................................ 146 DvFrame ................................................ 146 DvFreeze ............................................... 146 DvHide ................................................. 147 DvKillTask ............................................. 147 DvLastHandle ........................................... 147 DvLoaded ............................................... 147 DvMoveWindow ........................................... 147 DvMyHandle ............................................. 148 DvPifExecute ........................................... 148 DvResizeWindow ......................................... 148 DvSetBottom ............................................ 148 DvSetTop ............................................... 149 DvUnFreeze ............................................. 149 DvUnHide ............................................... 149 EatKbdChar ............................................. 149 EchoChar ............................................... 149 Else ................................................... 150 ElseIf ................................................. 150 EmsInstalled ........................................... 151 EmsOverlays ............................................ 151 EmsVersion ............................................. 151 EndComment ............................................. 151 Endif .................................................. 152 EndLoop ................................................ 152 EndOfFile .............................................. 152 EndProc ................................................ 153 EndsWith ............................................... 153 EndWhile ............................................... 153 EnvExpandString ........................................ 153 EnvFree ................................................ 154 EnvSize ................................................ 154 EraseWinAfterOvr ....................................... 154 EraseTopWindow ......................................... 154 EraseWindow ............................................ 154 Execute ................................................ 155 ExistDir ............................................... 156 ExistFile .............................................. 156 ExistOnPath ............................................ 157 ExitCode ............................................... 157 ExitMenu ............................................... 157 Exp .................................................... 157 Explode ................................................ 158 ExplodeDelay ........................................... 158 Extension .............................................. 158 Computer Tyme * MarxMenu * Table of Contents Page #8 ----------------------------------------------------------------- FileAppend ............................................. 158 FileAssign ............................................. 159 FileAttr ............................................... 159 FileClose .............................................. 160 FileCreate ............................................. 160 FileDate ............................................... 160 FileFlush .............................................. 160 FileLog ................................................ 160 FileOpen ............................................... 161 FilePart ............................................... 161 FilePos ................................................ 161 FileReadln ............................................. 161 FileRename ............................................. 162 FileResult ............................................. 162 FileSeek ............................................... 162 FileSize ............................................... 162 FileTime ............................................... 163 FileWrite .............................................. 163 FileWriteln ............................................ 163 FixPath ................................................ 163 Floppies ............................................... 163 ForceExplosion ......................................... 164 ForceExtension ......................................... 164 Forever ................................................ 164 FormatNum .............................................. 164 Fraction ............................................... 165 FreeDiskSpace .......................................... 165 FreeEms ................................................ 165 FreeMem ................................................ 165 FreeMemory ............................................. 166 FreeXms ................................................ 166 FullLineReturn ......................................... 166 GetMem ................................................. 166 GotoXY ................................................. 167 Hash ................................................... 167 HashDispose ............................................ 167 HashDisposeAll ......................................... 168 HashDisposeLevel ....................................... 168 HashLevel .............................................. 168 HashLib ................................................ 168 HexString .............................................. 169 HiddenAndSystem ........................................ 169 HighWord ............................................... 169 Hour ................................................... 169 HourOf ................................................. 169 Hundredth .............................................. 170 IdleProgram ............................................ 170 If ..................................................... 171 InactiveBox ............................................ 171 InactiveBoxColor ....................................... 172 InactiveShadow ......................................... 172 Include ................................................ 172 IncludeDirectories ..................................... 173 InFile ................................................. 173 InitialCursorPos ....................................... 173 Computer Tyme * MarxMenu * Table of Contents Page #9 ----------------------------------------------------------------- InMem .................................................. 174 InputBlankChar ......................................... 174 InputLength ............................................ 174 InputRedirected ........................................ 175 InputString ............................................ 175 Insert ................................................. 175 InsertMode ............................................. 176 Int .................................................... 176 Integer ................................................ 176 InterpretCounter ....................................... 176 Intr ................................................... 177 InverseColor ........................................... 177 InvertString ........................................... 177 IpxLoaded .............................................. 177 Jump ................................................... 177 KbdReady ............................................... 178 KeyEvent ............................................... 178 KeyFromMouse ........................................... 178 KeySave ................................................ 178 KillMusic .............................................. 179 LastDrive .............................................. 179 LastKey ................................................ 179 Left ................................................... 179 Length ................................................. 179 LeftOfEqual ............................................ 180 Ln ..................................................... 180 Loc .................................................... 180 Local .................................................. 182 LockWord ............................................... 182 Logoff ................................................. 183 LogoffTime ............................................. 183 Logout ................................................. 184 LongestLine ............................................ 184 LongestString .......................................... 184 Loop ................................................... 184 LoopIndex .............................................. 186 LoopLevel .............................................. 186 LoopLimit .............................................. 186 LoopVal ................................................ 187 LowerCase .............................................. 187 LowWord ................................................ 187 MachineName ............................................ 188 MakeListEntry .......................................... 188 MarxVersion ............................................ 188 MasterEnvironment ...................................... 188 Max .................................................... 188 MatrixInvert ........................................... 189 McpClass ............................................... 189 McpName ................................................ 189 Mem .................................................... 189 MemL ................................................... 190 MemSize ................................................ 190 MemW ................................................... 190 MemoryLoc .............................................. 190 MenuFileName ........................................... 191 Computer Tyme * MarxMenu * Table of Contents Page #10 ----------------------------------------------------------------- MenuKeyBuffer .......................................... 191 MhsDirectory ........................................... 191 MhsMailDirectory ....................................... 191 MhsReadFile ............................................ 192 MhsSendDirectory ....................................... 192 MhsUserDirectory ....................................... 192 Mid .................................................... 193 Min .................................................... 193 MinorDosVersion ........................................ 193 Minute ................................................. 193 MinuteOf ............................................... 194 MkDir .................................................. 194 Mod .................................................... 194 ModifyPath ............................................. 194 Month .................................................. 195 MonthOf ................................................ 195 Mouse .................................................. 195 MouseHorizontal ........................................ 195 MouseIRQ ............................................... 196 MouseType .............................................. 196 MouseVersion ........................................... 196 MouseVertical .......................................... 196 MoveWindow ............................................. 196 MsDos .................................................. 197 MxCmd .................................................. 197 NamePart ............................................... 197 NetworkVersion ......................................... 198 NewOverlayName ......................................... 198 NextWord ............................................... 198 Nil .................................................... 198 NilProgram ............................................. 199 NoBoxBorder ............................................ 199 NoExit ................................................. 199 Not .................................................... 199 NotesLeft .............................................. 200 NotesPlayed ............................................ 200 NovAccountDisabled ..................................... 200 NovAccountExpDate ...................................... 200 NovAddUserToGroup ...................................... 200 NovAddToSet ............................................ 201 NovAddTrustee .......................................... 201 NovAttach .............................................. 201 NovAttachedServers ..................................... 202 NovAutoDetach .......................................... 202 NovBinderyAccess ....................................... 202 NovBroadcastMode ....................................... 202 NovCaptureBanner ....................................... 203 NovCaptureCopies ....................................... 203 NovCaptureFF ........................................... 203 NovCaptureFile ......................................... 203 NovCaptureFlush ........................................ 204 NovCaptureForm ......................................... 204 NovCaptureIgnoreTabs ................................... 204 NovCaptureNotify ....................................... 205 NovCaptureQueue ........................................ 205 Computer Tyme * MarxMenu * Table of Contents Page #11 ----------------------------------------------------------------- NovCaptureReset ........................................ 205 NovCaptureSetup ........................................ 206 NovCaptureTabSize ...................................... 206 NovCaptureTimeOut ...................................... 206 NovCaptureUseBanner .................................... 206 NovChangePassword ...................................... 207 NovChangeObjPassword ................................... 207 NovCleanVolumeName ..................................... 207 NovClearConnection ..................................... 207 NovCloseBindery ........................................ 208 NovCloseSemaphore ...................................... 208 NovConLoggedIn ......................................... 208 NovConnection .......................................... 208 NovConnectionInfo ...................................... 209 NovConnectionsInUse .................................... 209 NovConOpenFiles ........................................ 209 NovConsoleOperator ..................................... 210 NovConTableSize ........................................ 210 NovConUsingAFile ....................................... 210 NovCreateGroup ......................................... 210 NovCreateObject ........................................ 211 NovCreatePrintQueue .................................... 212 NovCreateProperty ...................................... 212 NovCreateUser .......................................... 213 NovDefaultServer ....................................... 213 NovDeleteFromSet ....................................... 213 NovDeleteObject ........................................ 214 NovDeleteProperty ...................................... 214 NovDeleteTrustee ....................................... 214 NovDetach .............................................. 214 NovDirectoryRights ..................................... 214 NovDiskSpaceDel ........................................ 215 NovDiskSpaceDelNA ...................................... 215 NovDownServer .......................................... 215 NovEndCapture .......................................... 215 NovFirstNetworkDrive ................................... 215 NovForceDownServer ..................................... 216 NovFreeDirSlots ........................................ 216 NovFreeVolumeSpace ..................................... 216 NovFullName ............................................ 216 NovGetConnections ...................................... 217 NovGetMessage .......................................... 217 NovGetRootLevel ........................................ 217 NovGraceLoginReset ..................................... 218 NovGraceLogins ......................................... 218 NovGroupMembers ........................................ 218 NovGroups .............................................. 219 NovInGroup ............................................. 219 NovLastLoginDate ....................................... 219 NovLogin ............................................... 219 NovLoginName ........................................... 220 NovLoginTime ........................................... 220 NovLoginType ........................................... 221 NovLogout .............................................. 221 NovLongMachineName ..................................... 221 Computer Tyme * MarxMenu * Table of Contents Page #12 ----------------------------------------------------------------- NovManager ............................................. 221 NovMapDrive ............................................ 221 NovMapRoot ............................................. 222 NovMaxConnections ...................................... 222 NovMaxConnectionsUsed .................................. 222 NovMaxUserConnections .................................. 222 NovMinPasswordLength ................................... 223 NovMyLoginName ......................................... 223 NovMyPassword .......................................... 223 NovMyPrintQueues ....................................... 223 NovNumberOfPrinters .................................... 224 NovObjectID ............................................ 224 NovObjects ............................................. 224 NovObjectSecurity ...................................... 225 NovOpenBindery ......................................... 225 NovOpenSemaphore ....................................... 225 NovPasswordExpDate ..................................... 226 NovPasswordInterval .................................... 226 NovPasswordRequired .................................... 226 NovPreferredServer ..................................... 226 NovPrimaryServer ....................................... 227 NovPrintQueues ......................................... 227 NovPropertySecurity .................................... 227 NovPropertyValues ...................................... 228 NovReadGroups .......................................... 228 NovReadSecurityEquals .................................. 229 NovRemoveUserFromGroup ................................. 229 NovRenameObject ........................................ 229 NovResult .............................................. 229 NovScanProperties ...................................... 230 NovScanTrusteePaths .................................... 230 NovSecurityEquals ...................................... 230 NovSemaphoreInfo ....................................... 231 NovSemaphoreTimeout .................................... 231 NovSemaphoreUsers ...................................... 231 NovSemaphoreValue ...................................... 232 NovSendMessage ......................................... 232 NovSerialNumber ........................................ 232 NovServDescription ..................................... 232 NovServerLogin ......................................... 233 NovServers ............................................. 233 NovServerTime .......................................... 233 NovSetPreferredServer .................................. 233 NovSetPrimaryServer .................................... 234 NovSetProperty ......................................... 234 NovShellLoaded ......................................... 234 NovShellVersion ........................................ 234 NovShortMachineName .................................... 235 NovShowNotLoggedIn ..................................... 235 NovSignalSemaphore ..................................... 235 NovSpaceLimit .......................................... 235 NovSpaceUsed ........................................... 235 NovStaticObject ........................................ 236 NovStaticProperty ...................................... 236 NovStationAddress ...................................... 236 Computer Tyme * MarxMenu * Table of Contents Page #13 ----------------------------------------------------------------- NovTotalDirSlots ....................................... 237 NovTotalVolumeSpace .................................... 237 NovUsedVolumeSpace ..................................... 237 NovUserDirectories ..................................... 237 NovUserFiles ........................................... 238 NovUserInGroup ......................................... 238 NovUserPassword ........................................ 238 NovUsers ............................................... 238 NovUsersLoggedIn ....................................... 239 NovVersionNumber ....................................... 239 NovVolumeNumber ........................................ 239 NovVolumes ............................................. 239 NovWaitOnSemaphore ..................................... 240 NovWritePropValue ...................................... 240 NumberOfElements ....................................... 240 Now .................................................... 241 NumericOnly ............................................ 241 NumLock ................................................ 241 Offset ................................................. 242 OldKbdBuffer ........................................... 242 OnKey .................................................. 242 OnScreenOnly ........................................... 244 OpenPrinter ............................................ 244 OptionSwitch ........................................... 244 Or ..................................................... 245 Ord .................................................... 245 OutFile ................................................ 245 OutputRedirected ....................................... 246 OverKey ................................................ 246 Overlay ................................................ 246 Overlayed .............................................. 246 PadLeft ................................................ 247 PadLeftChar ............................................ 247 PadRight ............................................... 247 PadRightChar ........................................... 247 ParallelPorts .......................................... 248 ParamsToArray .......................................... 248 ParamStr ............................................... 248 ParentEnvironment ...................................... 248 Password ............................................... 249 PathPart ............................................... 249 PauseAfterExecute ...................................... 249 PcType ................................................. 249 Pi ..................................................... 250 PickFile ............................................... 250 PickMany ............................................... 250 PickManyFlags .......................................... 251 PickManyPositions ...................................... 252 PickOne ................................................ 252 PickPosition ........................................... 252 Port ................................................... 252 PickRedisplay .......................................... 253 Pos .................................................... 253 PosInList .............................................. 253 PosInListLeft .......................................... 254 Computer Tyme * MarxMenu * Table of Contents Page #14 ----------------------------------------------------------------- PosInListPartial ....................................... 254 PosInSortedList ........................................ 255 Power .................................................. 255 Pred ................................................... 255 Print .................................................. 255 PrinterName ............................................ 256 PrintInstalled ......................................... 256 Println ................................................ 256 PrintScreen ............................................ 256 Procedure .............................................. 256 PullMenu ............................................... 258 Qualifier .............................................. 258 QualVal ................................................ 259 RamOverlays ............................................ 259 Random ................................................. 259 ReadAscTextFile ........................................ 259 ReadDirectory .......................................... 260 ReadEnv ................................................ 261 ReadEnvironment ........................................ 261 ReadFileBlock .......................................... 261 ReadKey ................................................ 262 Readln ................................................. 262 ReadlnAsc .............................................. 263 ReadlnTimeout .......................................... 263 ReadSqDirectory ........................................ 263 ReadTextFile ........................................... 264 Real ................................................... 265 Reboot ................................................. 265 ReleaseDate ............................................ 265 Repeat ................................................. 265 ResizeWindow ........................................... 266 ResultsInK ............................................. 266 Return ................................................. 267 ReturnCode ............................................. 267 Right .................................................. 267 RightOfEqual ........................................... 268 RmDir .................................................. 268 RollWindow ............................................. 268 Run .................................................... 269 SavePosition ........................................... 269 ScreenHeight ........................................... 270 ScreenWidth ............................................ 270 ScrollLock ............................................. 270 ScrollMove ............................................. 270 Second ................................................. 271 SecondOf ............................................... 271 Security ............................................... 271 Segment ................................................ 271 SelectPath ............................................. 271 SemAttachTo ............................................ 272 SerialNumber ........................................... 272 SerialPorts ............................................ 272 Set .................................................... 272 SetArraySize ........................................... 273 SetEnv ................................................. 273 Computer Tyme * MarxMenu * Table of Contents Page #15 ----------------------------------------------------------------- SetTimerTask ........................................... 273 SetTopWindow ........................................... 274 SetWindowUnder ......................................... 274 Shadow ................................................. 274 ShadowColor ............................................ 274 ShadowPosition ......................................... 275 Shared ................................................. 275 ShareInstalled ......................................... 275 ShellEnvironment ....................................... 275 Shl .................................................... 276 Shr .................................................... 276 Sin .................................................... 276 SingleLineBox .......................................... 276 SmallShadow ............................................ 276 SortArray .............................................. 277 SortArrayLinked ........................................ 277 Sound .................................................. 278 SplitPath .............................................. 278 SpxFreeConnections ..................................... 278 SpxLoaded .............................................. 278 SpxMaxConnections ...................................... 278 Sqr .................................................... 279 StandardIO ............................................. 279 StartsWith ............................................. 279 Str .................................................... 279 StuffAKey .............................................. 280 StuffKBD ............................................... 280 StuffKeyboardNow ....................................... 280 Stubstitute ............................................ 280 Succ ................................................... 281 Suggest ................................................ 281 Swapping ............................................... 281 TaskNumber ............................................. 281 TextBackground ......................................... 282 TextColor .............................................. 282 TextMode ............................................... 282 TextPos ................................................ 282 TextSeek ............................................... 283 Then ................................................... 283 TimeOf ................................................. 283 Timer .................................................. 283 TimeSeparator .......................................... 284 TimeString ............................................. 284 TMaxActiveTasks ........................................ 284 TMaxCreateTask ......................................... 284 TMaxCut ................................................ 285 TMaxDeleteTask ......................................... 285 TMaxDirectSwitching .................................... 285 TMaxEMSMemLim .......................................... 285 TMaxGetPasteBuffer ..................................... 285 TMaxInstalled .......................................... 286 TMaxMaxTasks ........................................... 286 TMaxNameTask ........................................... 286 TMaxPaste .............................................. 286 TMaxReadTaskInfo ....................................... 286 Computer Tyme * MarxMenu * Table of Contents Page #16 ----------------------------------------------------------------- TMaxResult ............................................. 287 TMaxReturnCount ........................................ 287 TMaxSetPasteBuffer ..................................... 287 TMaxSwitchTasks ........................................ 287 TMaxSwitchToManager .................................... 287 TMaxTakeOver ........................................... 288 TMaxTaskOpenFiles ...................................... 288 TMaxThisTask ........................................... 288 TMaxVersion ............................................ 288 Today .................................................. 288 Tomorrow ............................................... 289 Tone ................................................... 289 TotalDiskSpace ......................................... 289 TotalEms ............................................... 289 Trim ................................................... 290 TrimInputString ........................................ 290 TrimLead ............................................... 290 TrimTrail .............................................. 290 TrueName ............................................... 291 TSRs ................................................... 291 UnBlank ................................................ 291 Unique ................................................. 292 UniqueFileName ......................................... 292 Until .................................................. 292 UpperCase .............................................. 293 UpperCaseCompare ....................................... 293 UpperCaseOnly .......................................... 293 UseArrows .............................................. 294 UseCommand ............................................. 294 UsedDiskSpace .......................................... 294 UseNovPassword ......................................... 295 Value .................................................. 295 Var .................................................... 295 VarType ................................................ 296 VCPIInstalled .......................................... 296 VCPIVersion ............................................ 296 VideoMode .............................................. 296 VideoPage .............................................. 297 ViewArray .............................................. 297 ViewTextFile ........................................... 297 VinCheckService ........................................ 297 VinesInt ............................................... 298 VinesLoaded ............................................ 298 VinUserName ............................................ 298 VinSerialNumber ........................................ 298 VlmLoaded .............................................. 298 Volume ................................................. 299 VT100mode .............................................. 299 Wait ................................................... 299 WaitOrKbdReady ......................................... 299 WhereX ................................................. 300 WhereXAbs .............................................. 300 WhereY ................................................. 300 WhereYAbs .............................................. 300 While .................................................. 300 Computer Tyme * MarxMenu * Table of Contents Page #17 ----------------------------------------------------------------- WholeFileNames ......................................... 300 Window ................................................. 301 WindowHeight ........................................... 301 WindowWidth ............................................ 301 WindowsLoaded .......................................... 301 WinX ................................................... 301 WinY ................................................... 301 Within ................................................. 302 WordStarKeys ........................................... 302 WorkString ............................................. 302 Write .................................................. 302 WriteAscTextFile ....................................... 303 WriteCenter ............................................ 303 WriteError ............................................. 303 WriteFileBlock ......................................... 303 Writeln ................................................ 303 WritelnAsc ............................................. 304 WritelnError ........................................... 304 WriteTextFile .......................................... 305 WriteVertical .......................................... 305 XmsInstalled ........................................... 305 XmsOverlays ............................................ 305 XmsVersion ............................................. 306 Xor .................................................... 306 Year ................................................... 306 YearOf ................................................. 306 String Constants ....................................... 307 Time and Date Constants ................................ 308 Video Constants ........................................ 308 Color Constants ........................................ 308 Boolean Constants ...................................... 308 Computer Tyme * MarxMenu * Users Manual Page #1 ----------------------------------------------------------------- COPYRIGHT This manual is copyrighted material and all rights are reserved. MarxMenu is a programming language which describes to the computer what it is supposed to do. Even though some of the individual words in MarxMenu are used in other programming languages, I claim a copyright on the collection of words which make up the MarxMenu language. I therefore consider it an infringement of my Copyright to create a software product which uses the MarxMenu language, or translates MarxMenu source code, without purchasing a license to do so. The combinations of definitions of commands in this manual constitute a copyrighted work. Any publication which describes a computer language for which the MarxMenu command set is a subset is a violation of the copyright of this software and this written manual. You agree not to translate, modify, disassemble, decompile, or reverse engineer any of our programs. This program contains proprietary memory variable and array addressing algorithms which are considered to be trade secrets and our property. These algorithms include, but are not limited to, the MarxMenu variable addressing structures and concepts as well as those data structures MarxMenu uses in it's database features. Our claim of intellectual property and trade secrets is not limited to the actual implementation of code, but extends to the MarxMenu source language and the user interface language constructs that are unique to this software product. In addition to intellectual property rights protected by law, your use of this product constitutes your acceptance of these terms and conditions and your acknowledgement of the above rights. In other words, don't try to clone MarxMenu. LICENSE AGREEMENT You are licensed to use this program on a single CPU or workstation. If you are running on a network, you are required to license a separate copy for each workstation or a file server license for each file server. If you are running on a multiuser operating system such as Concurrent DOS, you are required to license a copy for each workstation. Everyone who uses this menu, must license a copy unless several people share the same workstation. This software is licensed and not sold. The license begins when Computer Tyme receives payment in full. You may not transfer, sublease or rent this software without the written consent of Computer Tyme. You are not allowed to distribute MarxMenu in runtime form with software you've developed unless it is in combination with a paid-for copy of MarxMenu, or you have made special arrangements in writing with Computer Tyme to do so. Computer Tyme * MarxMenu * Users Manual Page #2 ----------------------------------------------------------------- Network licenses include a license to use this software on a local hard disk in stand-alone mode provided that the computer is part of a computer network. Computers that are not connected to the network are not covered. The network license also includes a license for a single network supervisor to use the software at home for menu development and testing. Site licenses require the payment of an annual renewal and support fee. If the annual renewal fee is not paid within six months of the due date then the site license status is considered expired and terminated. The warranty is limited to the diskettes to be machine readable for a period of 180 days after purchase. Although we try hard to write perfect software that has no bugs, we do not guarantee that. This software is provided AS IS. We also do not guarantee that this product is fit for any particular purpose and we are not liable for any damages that might occur from use of this product. We reserve the right to make changes to any and all parts of this software at any time without obligation to notify any person or entity of such changes. This agreement is governed by the laws of the State of Missouri. Use of this product constitutes your acceptance of the terms and conditions of this license and of my copyright and your agreement to abide by these terms and conditions. We may terminate this license at any time if you are in breach of any of its terms or conditions. We reserve the right to conduct or have conducted audits to verify your compliance with this agreement. I would like to thank the following people for making this product possible: Joe Smith, and Kevin Moore for helping write this manual. The Computer Tyme staff for being the best employees in the world. Borland International for writing Borland Pascal and keeping it bug free and well supported. TurboPower Software for their very powerful extensions to Turbo Pascal and their well written, well supported product. All users who actually paid for this product so that we may continue to eat. Those of you who have pointed out bugs and made suggestions to improve our product. Computer Tyme * MarxMenu * Users Manual Page #3 ----------------------------------------------------------------- MARXMENU TRADEMARKS MarxMenu is a registered trademark of Computer Tyme. DOS ToolBox, Directory Master, MarxBase, MarxCom, anything that begins with the word Marx, and The Network Survival Kit are trademarks of Computer Tyme. Lotus is a registered trademark of Lotus Development. Wordstar is a registered trademark of MicroPro International. Smart Software is a trademark of Informix. MS-DOS and MS-Windows are trademarks of Microsoft. Turbo Pascal is a trademark of Borland International. OPRO and TPRO are trademarks of TurboPower Software. Netware, Novell and Btrieve are trademarks of Novell. Concurrent DOS and DR-DOS are trademarks of Novell. DesqView and QEMM are trademarks of Quarterdeck. IBM and OS/2 are trademarks of International Business Machines. Created using Turbo Pascal Copyright 1983-92 by Borland International When I first started writing this program my friends referred to it as Marc's Menu. That's where the name MarxMenu came from. It has nothing to do with either Carl or Groucho Marx. TECHNICAL SUPPORT Technical support for MarxMenu is provided in several ways. The first is by calling our voice line 1-417-866-1222. We would ask that you not call the 800 number as that is for orders and ordering information only. We have several support staff and will try to answer your questions as quickly and efficiently as possible. We at Computer Tyme look at technical support as an opportunity to improve our product. We also have a 24 hour 3 line BBS system. The BBS system is written in MarxMenu script and the source code to the BBS is available for download. Users with modems can leave messages about support issues. There are several user uploaded menus here and it serves as a forum for MarxMenu users to share ideas and techniques. Our BBS number is 1-417-866-1665. It supports 14400 baud but is 2400 baud compatible. Use 8 bits, no parity, 1 stop bit (8N1). You will also need to set your terminal emulation mode to ANSI or VT100. Do not try to call the BBS with 7 bits or even parity. It won't work. On our BBS are additional sample menu files that other MarxMenu users like yourself have uploaded. We encourage you to share your work with others so that more MarxMenu users can benefit. Computer Tyme * MarxMenu * Users Manual Page #4 ----------------------------------------------------------------- When uploading problem menus to our BBS, try to isolate the problem and send as small a sample as you can that demonstrates the problem. Be sure to add a comment block in your code describing the problem and include your name and phone number so that we can call you back when we are done with your menu. We are also available on Compuserve in the Novell vendors forum. From any Compuserve prompt type GO COMPTYME. We have section 3. We also have 3 fax servers on line. Our fax number is 417-866-0135. If you're having a problem with menu code please don't fax long menus to us. We prefer that you upload the code to our BBS so that we can run it. We also offer a Fast Update Service which includes regular upgrades sent to you automatically as we come out with them. This doesn't mean every version of MarxMenu, but every few months after making several improvements and the product is at a stable point. The Fast Update Service includes special access to our support BBS. This service is for the very fierce MarxMenu user who has to have the "Latest and Greatest" all the time. Computer Tyme provides technical support for users evaluating the software as well as registered users. You should know your MarxMenu version number before you call. If you type MARXMENU at the command line it will give you a version number and a release date. INSTALLATION The following installation instructions are for both MarxMenu single user version and MarxMenu network version. The network version is included in The Network Survival Kit. The single user version of MarxMenu is installed by copying the disks into a subdirectory called MARX to keep the files better organized. However, this is not necessary. Copy all the disks that come with MarxMenu into a directory on your hard disk or network. The Network Survival Kit is installed by copying the disk into a directory on your server. Typically you would make a directory called NSK under the PUBLIC directory. That way the NSK directory will inherit the rights of PUBLIC. It will unpack into about 3.5 megs of programs and documentation. Once the files are copied into the proper directory, for example, PUBLIC\NSK on the network or C:\MARX on a single hard drive, type INSTALL. Be sure to have your serial number and access code ready. When this is done, you can run some of the sample menus by typing MARX . Computer Tyme * MarxMenu * Users Manual Page #5 ----------------------------------------------------------------- Be sure to print out the DOC files on any programs you are interested in and print out the MARXREAD.ME file. MARXHELP is activated by typing MARXHELP at the command line. IMPORTANT: Make sure you do not run the install from the floppy disk. If you are running the Network Survival Kit on several file servers that are bridged together, and you have purchased several single server MarxMenus, be sure not to install the same serial number on more than one file server. MarxMenu is smart enough to detect this. If you have a multi-server version of MarxMenu, then you can install MarxMenu on several fileservers without getting a license violation error. On a Novell netowrk, MarxMenu stores it's serial number information in the Bindery as well as the MARXMENU.EXE file. Thus when you get a new version of MarxMenu it will serialize itself the first time you run it. This makes updates easier. -------- V E R Y * I M P O R T A N T -------- The MarxMenu subdirectory must be path accessible. That is, you must have a path statement in your AUTOEXEC.BAT file that includes the directory where the menu system resides. A typical path statement might look like this: PATH=C:\;C:\DOS;C:\MARX; MarxMenu requires up to 100 bytes of free environment space. It won't run without it. The way you get more environment space is to add a SHELL command to your CONFIG.SYS file. SHELL=COMMAND.COM /P /E:nnn Where NNN is the number of bytes for the environment to reserve. Note that if you are running DOS 3.1 then NNN is the number of 16 byte blocks to allocate for the environment. For DOS 3.2 or later: SHELL=COMMAND.COM /P /E:400 For DOS 3.1: SHELL=COMMAND.COM /P /E:25 If MarxMenu gives you an environment space error, this is where you go to fix it. After changing the CONFIG.SYS file, you will have to reboot the computer to make it take effect. Another situation that can cause an "Out of Environment Space" error is having more than one COMMAND.COM loaded. You can test for this by running RAMMAP or MAPMEM. These programs will show you what's in memory. If you need to load a second COMMAND.COM be sure to use the /E switch to expand the environment of the new COMMAND.COM. Computer Tyme * MarxMenu * Users Manual Page #6 ----------------------------------------------------------------- GETTING STARTED QUICK After installing the software the first thing to do is try it out. Type MARX QUICK (or MARX QUICKNOV for Novell networks) and a menu should come up. Then select the Utilities option. This will open up another window. You then choose DOS Menu and then Free Space. If everything goes right the menu will run FREE.EXE and then return to the menu. After returning to the menu press ESC a few times and exit back to the command line. If everything works right then MarxMenu is working. If you get errors then you'll need to fix them before going on. If you get an "Out of environment space" error then you'll have to increase the environment space before continuing. The MarxMenu disk contains many sample menus for you to start with. Which one to use depends on what your needs are. Typically on a single user system you might start with QUICK menu. To start with the QUICK menu, copy it to a different name such as MY.MNU as follows: COPY QUICK.MNU MY.MNU Then edit MY.MNU with your favorite editor. You will quickly see how this menu works and will be able to substitute your programs for the ones it is set up for. You can then test and run your menu by typing MARX MY. If you want more of a self-configuring menu you might try the LEVEL1 menu. This menu requires no programming and lets you set up menus interactively. On a Novell network you might start with the QUICKNOV menu or translate your existing Novell menus with NOVTRANS. The LOGIN menu requires a lot of customization for your system. I wouldn't start on this menu until your regular menus are written. In the QUICK and QUICKNOV examples we have defined AddChoice and Task procedures. These procedures are written in MarxMenu so you won't find them in the list of MarxMenu's internal commands. AddChoice commands are used with OnKey Task commands to create selections in the menu. AddChoice('Directory Master',1) AddChoice('Pick Directory',2) AddChoice('Memory Map',3) AddChoice('Free Space',4) CornerStretchBox ('DOS Menu',38,15) Computer Tyme * MarxMenu * Users Manual Page #7 ----------------------------------------------------------------- OnKey Task(1) DM OnKey Task(2) PD OnKey Task(3) RamMap Pause OnKey Task(4) Free Pause It's that simple! The AddChoice controls what you see on the screen and the OnKey Task controls what it does. Under the OnKey command it's just like writing a batch file. The numbers in the AddChoice statements correspond to the OnKey Task(n) statements so that Tasks are associated with choices. The CornerStretchBox creates a self-sizing box where the upper left corner position coordinates are specified. You won't find the commands AddChoice, CornerStretchBox, or Task in the manual. That's because they are procedures defined in Include files. The QUICK and QUICKNOV menus include CUSTOM.INC and WINSUP.INC which allow you to set up various features of the menus. CUSTOM.INC can include either NOVELL.INC, BLOCK.INC, or GRID.INC which change the look and feel of the menus. You might want to experiment with these to see which one you like the best. You'll have to go into these three Include files if you want to change the colors. PLEASE NOTE: If you revise an include file, you will need to recompile your .MNU file with the MARXCOMP compiler. Typing "MARX {menuname}" will not incorporate changes made to any Include files until after you type "MARXCOMP {menuname}". When you execute a menu after modifying include (INC) files, MarxMenu doesn't automatically recompile the menu the same way it does when you modify the menu file directly. After changing an Include file referenced within a menu, you need to force a recompile by typing MARXCOMP QUICK or you can delete the MRX file to force a recompile. These menus are designed to get you going quickly. If you want to do weird stuff MarxMenu can do weird stuff, but it takes a little more work. The reason we have so many commands in MarxMenu is to be able to do weird stuff so if you need to do something strange, we probably already have a command to do it. The example menus on disk (MNU files) show a variety of uses for MarxMenu. They can be used like libraries of routines to cut code from and paste into your current menu. A good way to learn MarxMenu is to print out the example menus and study the code. Computer Tyme * MarxMenu * Users Manual Page #8 ----------------------------------------------------------------- USE MARXHELP MarxHelp is a TSR pop-up help program for MarxMenu. It acts as an online reference guide to all of the MarxMenu commands. MarxHelp only takes 8k of RAM and is very useful while writing your MarxMenu menus. It gives you the complete manual on-line and is fully indexed electronically. It even has a keyword search to help you find the command you are looking for. I strongly encourage the use of MarxHelp. MarxHelp has everything this manual has in it and more and it is easier to read and find things than thumbing through pages. MarxHelp is updated with every release of MarxMenu and contains new features and program changes the paper manual doesn't. Once you get used to using it, you won't want to go back to paper documentation. Using MarxHelp is better than using the manual. To load MarxHelp type MarxHelp at the command line. This prepares MarxHelp to be available as a TSR while you're creating or editing a menu file. Then if you want to pop up an index press Shift-F3. The Shift-F2 key will repeat your last help topic and Shift-F1 will look up the word your cursor is on. To get more help on MarxMenu type MarxHelp /?. If you need to unload MarxHelp from memory, type MarxHelp /U. Once you bring up MarxHelp, read the Help on Help section for more detailed information on how to use MarxHelp. MarxHelp also contains the entire text of the DOS ToolBox and Network Survival Kit utilities. MarxHelp comes with the Computer Tyme Network Survival Kit. It can also be downloaded from our support BBS. It does not come bundled with the single user version. COMMON QUESTIONS AND MISTAKES There are some common mistakes people make that I get a lot of calls about. I'm going to attempt to point these out so that you don't waste a long distance call over something that's in the book. When running MarxMenu as a menu you type MARX menuname and not MARXMENU menuname. You must run the MARX.BAT file in order for MarxMenu to be able to execute other programs. MarxMenu MUST be in your search path. When you type PATH at the command line, make sure that the MarxMenu directory is in the path. If it isn't, put it in because MarxMenu will not work unless it is added to the path. If your menu is stuck in a loop and you can't get out, it is because MarxMenu is not in the path. Computer Tyme * MarxMenu * Users Manual Page #9 ----------------------------------------------------------------- When running MarxMenu on a network, MarxMenu will want to create it's temporary batch files in the same directory where MarxMenu is located. The user must have enough rights to create these files. If you don't want to give the user rights in this directory then set an environment variable TEMP to point to a directory where the user does have rights. If you notice that you (as supervisor) can run the menu just fine, but your users get errors, it's because they don't have enough rights. When using MarxMenu to logon to or logoff from the network, you need to follow all the rules in the sections on network usage. It is very tricky to do these functions and there are things you can do and things you can't. There are things that you think should work but don't. So, I strongly suggest that you follow the instructions. I have spent hundreds of hours fighting these issues and I have pretty much figured out what you can do and what you can't do. If you are getting "Bad Command or Filename" errors when running MarxMenu, edit the first line of MARX.BAT and turn ECHO ON. Then you can watch what is happening. You can also put PAUSE in so it won't go by too fast that you can't see it. Another common question is, "Do you have a command that does this?" The quickest way to hunt up commands is to use the MarxHelp TSR. Besides being highly cross-indexed, it also has word search capabilities. Several of the example files have Include files. I use the INC extension on these files. Commands like AddChoice and CornerStretchBox are procedures that are defined in these Include files and are not MarxMenu commands. This is also where the menu colors are defined. When using the Novell menu translator you may get a "Window Out Of Bounds" error. This means that the Novell menu has more choices than will fit on the screen. The solution is to break up the menu into submenus. Also, when running the translator you type MARXMENU NOVTRANS menu, not MARX NOVTRANS menu. Since the menu translator is being used as a translator instead of a menu you use MARXMENU instead of MARX. When upgrading MarxMenu from a previous version, you must chase everyone out of the menu before upgrading. Otherwise the MARXMENU.OVR file is locked and can't be overwritten. I suggest deleting the old MARXMENU.OVR file first. If you can delete it then everyone is out. I get calls about this where the supervisor swears everyone is out of the menu when they aren't. If you can't delete the file then someone has it open. When you upgrade MarxMenu the MRX files need to be recompiled. If the MNU files are available and the users have enough rights then this happens automatically. But, if the users don't have enough rights they won't be able to run the menus. You will have to go in and recompile them. IMPORTANT! Do not lose the MNU files. The MRX files cannot be uncompiled and if you don't have the MNU files, you have no way to alter your menus. Computer Tyme * MarxMenu * Users Manual Page #10 ----------------------------------------------------------------- You must have some free environment space for MarxMenu to use. If you get an "Out of Environment Space" error, it means that you are out of environment space. First check to see that you have SHELL= command in your CONFIG.SYS file. Then use RAMMAP to see it you are loading more than one COMMAND.COM. You can also use the FREE.EXE program to show you how much environment space you have. If FREE doesn't show that you have very much free space then you are going to have to figure out why. When Novell installs their utilities they flag files as "Sharable Read-Only". Don't do this with MarxMenu. This is a bad idea and is a left over from DOS 2.11. Even though Novell still does it, don't you do it. It can, and often does, cause problems. Not all programs are compatible. Sometimes you never know why. The solution often is to find a work around. MarxMenu supports many kinds of work around tricks. Sometimes the trick is to exit the menu with the keyboard buffer stuffed to run a program from the command line. Because of the power and flexibility of MarxMenu, many new users try to do complex things too fast. I recommend that you start with the basic menu examples and get familiar with the software. Once you are familiar with MarxMenu you aren't as likely to get in over your head with it's more complex features. Q.) This is a big manual. Will it be hard to learn? A.) No. MarxMenu is one of the easiest menus to learn and install. You don't have to learn hundreds of commands to make it work. Just start with the sample menus. But, if you want to do complicated tasks, the commands are there. But the more complicated the task the more effort it will take to make it work. Q.) I type MARXMENU QUICK and when I try to run something it dumps me back at the command line. A.) To run a menu you need to run the MarxMenu from MARX.BAT. You should type MARX QUICK instead of MARXMENU QUICK. Q.) I'm getting "Error accessing Overlays!" A.) MarxMenu requires the file MARXMENU.OVR file to be in the same directory as the MARXMENU.EXE file. In previous versions of MarxMenu the EXE and OVR files were combined. This causes file sharing problems on some networks and dumb multitaskers such as Windows. So we had to separate the overlay file. Q.) Everything was working fine and then I moved the files to another directory and now I'm getting "Bad command or File Name". Computer Tyme * MarxMenu * Users Manual Page #11 ----------------------------------------------------------------- A.) The MARX.BAT is generated for a specific directory. Use your editor or MARXEDIT to edit MARX.BAT to run in the new directory. If you are still having problems change the ECHO OFF to ECHO ON and watch the batch file execute. You can type MARXMENU INST to recreate the batch files. Q.) I get stuck in the menu and it won't exit. Just keeps looping. A.) The MXSTOP.BAT, BATEXIT.BAT and DROPTO.BAT files need to be in the same directory as MARX.BAT and MarxMenu. MarxMenu must be on your search path in order to work. Q.) I'm running LanTastic and when two people use the menu at the same time I get a "File Sharing Violation" error. A.) This is solved by setting the MARXMENU.OVR file to "Read Only". Q.) I tried changing the menu colors by editing the NOVELL.INC file but no colors changed. What am I doing wrong? A.) MarxMenu automatically recompiles when you change the menu file because it compares the date of the MNU file to the MRX file. Include files are not compared this way. What you need to do after changing an Include file is to force MarxMenu to recompile. This is done by typing MARXCOMP or by deleting the MRX file. Q.) When I run some programs, (MultiMate) and come back to the menu my colors are gone. It comes up in black and white. A.) Some programs change the video mode to BW80 and leave it that way. MarxMenu comes up black and white when this happens. Add the command MODE CO80 after the offending program and your colors will come back. Q.) Under an OnKey statement, I'm mixing batch file commands and MarxMenu commands (using the "|" (vertical bar)). It seems that all the MarxMenu commands execute first rather than in the order that I specified. A.) Yes, since MarxMenu is a zero "k" menu system, all batch files commands are written to a batch file and executed when MarxMenu exits. It is also important to remember that when you return to MarxMenu that you come back to the beginning of the menu and not the last line you left. Q.) On my Novell network, I get "Error creating BAT file" when users try to run programs from the menu. A.) This is caused when users don't have enough access rights for MarxMenu to create temporary batch files. Use the SET TEMP=directory to point to a directory where the user has full access rights. Computer Tyme * MarxMenu * Users Manual Page #12 ----------------------------------------------------------------- Q.) I'm trying to execute a program and read the DOS errorlevel code and it isn't working. What am I doing wrong? A.) To read a DOS errorlevel code into a ReturnCode you must use the MarxMenu Execute command. You must also set UseCommand to Off and you need to specify the COM or EXE extension. You also can't use the DOS piping or redirection commands. Q.) Can I run Windows with MarxMenu? A.) Yes, MarxMenu works just fine with Windows. It can start Windows and when you exit Windows it comes back to MarxMenu. Q.) When I try to log off a Novell network from the menu I get a "Missing Batch File" error. A.) The reason you get a "Missing Batch File" error is because MARX.BAT is on the network and is no longer accessible after LOGOUT runs. Under MarxMenu the correct way to log off is to create an OFF.BAT file in the SYS:LOGIN directory and run |Logoff under an OnKey command. MarxMenu will automatically find this batch file and run it. Example: OnKey 'L' |LogOff Q.) When I call your BBS I get a lot of arrow characters on my screen. What am I doing wrong? A.) My BBS uses ANSI sequences. Turn on your ANSI or VT100 emulation in your terminal program and it will work just fine. MARXMENU FEATURES The basic idea behind MarxMenu is to display choices to the user, let him select a command, run the program without taking any memory, and return to the menu when done. The way MarxMenu works is that you start it with a batch file which runs MarxMenu. When the user selects an option MarxMenu writes a batch file and quits. The first batch file (MARX.BAT) calls the batch file that MarxMenu created which runs your application. When your application finishes the MARX.BAT file reloads MarxMenu and waits for the user to make a new choice. MarxMenu uses a script language that is designed around being simple to use and to read. The script language is used to paint the screen, wait for the user to input a key, and then write a batch file based on that key. To help you get going, MarxMenu comes with several prewritten sample menus that you can use as templates to make your menus. These templates are somewhat feature rich so that you don't have to figure out very much to get your MarxMenu going. The sample menus are designed to meet the needs of most menu users and are designed to get you up and running quick with as little pain as possible. Computer Tyme * MarxMenu * Users Manual Page #13 ----------------------------------------------------------------- But, MarxMenu is feature rich and has plenty of commands for those of you who want to do something weird. With over 850 commands and growing we have attempted to deal with many problems that users and network supervisors need to solve. So if you want to do something that my menu templates aren't set up to do then you have the power to get in and make MarxMenu do what you want. But it takes a little more effort to make it happen. The stranger you want to get with MarxMenu the more learning and effort it will take. But, unlike all the other menu systems out there, MarxMenu will get as strange as you need it to get. MarxMenu is a programming language targeted at non-programmers and puts the power of a professional programmer into the hands of those who have never written a line of code before. Even though MarxMenu may not be a true compiler or have the execution speed of C or Pascal, MarxMenu supports a far richer command language and a more elaborate method of automatic memory management. With MarxMenu you can write programs that would normally require 30 points higher IQ and used to be limited to the realm of the serious computer nerd - like me! OVERVIEW OF THE MARXMENU SYSTEM MarxMenu is not just another fill-in-the-blank menu system. It is a menu programming language and job control language. It gives you total freedom to do whatever you want, but total freedom has a price. You will need to know and understand how to use a text editor. This isn't difficult if you are familiar with using a word processor. And you will need to have a basic understanding of DOS and how batch files work. With a text editor you can create a menu file which is a text file with an MNU extension. Or, you can copy and then modify the text file QUICK.MNU which displays the menus you see when MarxMenu is executed. This text file contains a set of instructions for MarxMenu to follow. MarxMenu will then read your menu file and run the instructions. A menu file might look as follows: DrawBox 31 5 18 4 UseArrows Writeln ' W - WordStar' Write ' L - Lotus' OnKey 'W' CD\WORDSTAR WS OnKey 'L' CD\LOTUS LOTUS Computer Tyme * MarxMenu * Users Manual Page #14 ----------------------------------------------------------------- The above example is a fully working MarxMenu program. Just because MarxMenu has over 850 commands doesn't mean you have to use them all. The reason there are so many commands is that people keep calling and asking if we can add such and such. Most of the time we do. That's why the manual gets behind sometimes. The instructions must be from the vocabulary of words that MarxMenu understands. These words make up the command list included in this manual. They must be used precisely as the instructions in this manual tell you to use them. This process is called programming. I know that for many of you the word programming is a scary word. Put your fears at ease, MarxMenu is one of the easiest programming languages there is. It is a little harder than writing batch files and a lot easier than Basic. It requires a working knowledge of DOS and an understanding of writing batch files as explained in your DOS manual. The point that we want to make is, do not let the fear of learning and the fear of programming prevent you from learning to write your own menus. If you have never touched a computer before and are sitting down with your first PC, read the manuals first. Become familiar with the MS-DOS operating system. Learn how to write batch files, make subdirectories, copy files, format floppies, etc. If you don't understand something, ask a friend. All of us had to learn sometime, and there is no such thing as a stupid question. After you have mastered some of the basic concepts of the operating system, then learn MarxEdit. This is the text editor included with your MarxMenu program. Use it to write your own batch files. Then attempt to write your own menus by modifying the sample menus (files with a MNU extension) which come with MarxMenu. Print these menus and study them, referring to this manual or MarxHelp for help on command definitions. You do not have to completely understand them to start making changes. Programming is a trial and error process. A computer, like a musical instrument, is only as good as the player. The more you learn about it the more you'll find it can do. In fact, a computer can help raise your effective IQ as you learn the disciplines of logic and reason. As a hammer is a tool of the hand, enhancing your physical strength, a computer is a tool of the mind, enhancing your mental strength. You will learn that as you develop a relationship with your computer, that you will be able to process information in ways you never dreamed. MarxMenu is an excellent learning tool. By the time you become proficient with the menu language, you will have learned the fundamental concepts behind the MS-DOS operating system. You will find yourself going back and forth between this manual and the DOS manual that came with your computer. When you master the language, you will have enough computing skills to be a real resource in your office environment. In this day and age, knowing how to "make the damn things work" is a key in moving up the corporate ladder. Computer Tyme * MarxMenu * Users Manual Page #15 ----------------------------------------------------------------- If you have sufficient excess income to afford a personal computer, or are in a job that provides you with a workstation, you are smart enough to learn this program. All it requires is that you take the time. You can do it. It is worth your time, and you will make up the time spent in the results you'll get. Good luck and enjoy. WHAT MARXMENU DOES So with hundreds of menus on the market, what makes this one so great. Well, let me tell you about it. MarxMenu is a menu language rather than a fill in the blank kind of menu. MarxMenu gives you total control of your computer system. It is also a job control language allowing you to program processes too difficult to do with batch files. MarxMenu can be used to do anything from overnight batch job processing to generating control scripts for mainframes. Because of it's simple syntax, MarxMenu makes an excellent teaching language putting more programming power in the hands of the student programmer than any other programming language. As a menu, MarxMenu can be as simple or as complex as you want. If you want simple, nothing is easier. If you want POWER, nothing is more powerful. If you want to get really weird, MarxMenu can do really weird. So if you want the menu to remind you to go vote, MarxMenu knows when the first Tuesday after the first Monday in November on even years is. If you are into Astrology, and you want certain menu items to appear only if Mars is in the right place in the sky, MarxMenu can calculate the orbit of Mars for you. MarxMenu can be used to program games, write running software demos and online tutorial programs. It can be used to write testing programs. It can be used to write custom software installation programs. It can be used to assist other applications to make other software more network friendly. MarxMenu has a compiler for high speed execution. Even very large menus come up in under 4 seconds on a 4.77mhz IBM XT on an ArcNet lan. The compiler also provides security in that you can keep your source files separate so no one can alter the menu files. Computer Tyme * MarxMenu * Users Manual Page #16 ----------------------------------------------------------------- THE MARX.BAT FILE In order for MarxMenu to work, a MARX.BAT file must be created. This is done by typing INSTALL. The first thing that INSTALL does is unpack the compressed menu files and documentation files. Then it will bring up the installation menu. The MARX.BAT file looks like this: @ECHO OFF C:\MARX\MARXMENU.EXE %1 %MXCMD% MARX %1 The first line of MARX.BAT turns the echo off. This may be changed to ECHO ON for debugging purposes. PAUSE commands can be inserted to debug a menu. This allows you to see what's going on. The second line of MARX.BAT runs MARXMENU.EXE. The second parameter %1 is the name of the menu file to run. A third parameter can be added to tell MarxMenu to use a specific directory for creating temporary batch files. Otherwise MarxMenu will create temporary batch files in the same directory as MARXMENU.EXE. When the user selects a program to run, MarxMenu writes a temporary batch file which contains within it the commands to run the program. Then MarxMenu writes a command to the environment variable MXCMD to execute the temporary batch file and exits. What it writes depends on the version of DOS you are running. If you are running DOS 3.3 or later, MXCMD is set to CALL . If you are running an earlier version of DOS then MXCMD is set to COMMAND /C . Whatever command is written to MXCMD is executed in line 3. This usually calls the temporary batch file that MarxMenu created. This executes your program and returns to MARX.BAT. Line four jumps back to the beginning of the batch file and starts all over. %0 is MARX.BAT and %1 is the name of the menu you are running. MARX.BAT -------- +--MarxMenu Creates--+ +----> @ECHO OFF | | | MARXMENU.EXE %1 | | %MXCMD% >--+ +-> $MX00000.BAT | +--> MARX %1 + | ------------ | | | +----------------------> CD\WORDSTAR +-|------<-----+ WS --+ | | +-------------------------------------------<-+ Computer Tyme * MarxMenu * Users Manual Page #17 ----------------------------------------------------------------- Note: MarxMenu sets MXCMD = CALL $MX00000.BAT You can also tell MarxMenu where to put it's temporary batch files by setting an environment variable TEMP to point to a temporary file directory. Example: SET TEMP=F:\TMPFILES This is compatible with the way DOS 5 and Windows uses temp files. When you exit the menu system. MarxMenu sets MXCMD to MXSTOP. This jumps to a batch file called MXSTOP which gets you out of MARX.BAT. MXSTOP.BAT can be modified to control what happens when MarxMenu is exited. The default MXSTOP.BAT file is as follows. SET MXCMD= SET KSV= REM You can control menu exiting with this file! Note that by adding your own commands to MXSTOP that you can control what happens when you exit. You could loop right back to the menu if you want. Or, you could force a controlled network logoff. I strongly recommend upgrading to DOS 3.3 or later whenever it is possible to do so. The name of the temporary batch file is as follows: $MX00000.BAT |||| Shells--------+|++--------Network Station (Hex) Task Number The five zeros are used for single user versions of MarxMenu. On a network they change as follows: The last two zeros is the station number on the network. This is either read directly from the shell, if you are using Novell, or from the environment variable STATION if you are on another network. The third zero is the task number if you are running DesqView, or from an environment variable TASK if you are running some other multitasker. The second zero is replaced by one less than the number of COMMAND.COM shells you are running. This way if you run COMMAND.COM under MarxMenu and then run MarxMenu again under that, it doesn't get lost when you exit. Computer Tyme * MarxMenu * Users Manual Page #18 ----------------------------------------------------------------- The first zero is for future expansion. In case something comes along that we haven't thought of. If you want to do custom tricks, MarxMenu has an internal variable called MxCmd. Setting this to your own command overrides the way MarxMenu would normally use it. But now you ask, does MarxMenu leave a trail of batch files that will clutter up my drive or network? Not at all. MarxMenu keeps using the same names over and over again. If a user crashed his system, it might leave a batch file but it would be overwritten the next time he used the menu. Not only that, all batch files can be kept in the same directory so cleaning up is as simple as typing DEL $MX*.BAT! By writing to the MXCMD variable you can run an EXE or COM file directly without having to create another batch file. Example: OnKey 'M' |MxCmd = 'RAMMAP' This runs RamMap directly from the MARX.BAT file. Another trick is to run another batch file without the CALL statement. This creates a one-way jump to another batch file. Another debugging feature. You can change the first line of the MARX.BAT file as follows: @ECHO %MXECHO% This allows you to turn the echo on for debugging purposes by typing: SET MXECHO=ON This way you don't have to change the MARX.BAT file to debug. If you use this, make sure that MXECHO is set to either ON or OFF. DROPTO.BAT If you are going to run a shell like COMMAND.COM under MarxMenu it is sometimes better to use DROPTO.BAT which is created during the install process. DropTo allows you to jump from the temporary batch file that MarxMenu creates to DropTo, which deletes the temporary batch file and executes the rest of the command line. Usage: DROPTO %0 COMMAND.COM Computer Tyme * MarxMenu * Users Manual Page #19 ----------------------------------------------------------------- If you are using DropTo inside a MarxMenu, the %0 is automatically added for you. Example: OnKey 'C' DropTo COMMAND.COM DROPTO.BAT ---------- DEL %1 SET KSV= SET MXCMD= %2 %3 %4 %5 %6 %7 %8 %9 Here's how it works: $MX00000.BAT <------deletes this file--------+ ------------ | DROPTO %0 COMMAND.COM ------------> DEL %1 >-+ SET KSV= SET MXCMD= %2 executes COMMAND.COM--> %2 %3 %4 %5 %6 %7 %8 %9 The advantages are that the temporary batch file is eliminated so if the user never returns to the menu, it leaves no temporary file to clutter up the drive. Also, DROPTO.BAT becomes the pending batch file that is running rather than the temporary file. SUPPORT FOR EARLY DOS VERSIONS There are two main differences between DOS versions earlier than 3.3 and versions 3.3 and above. One is the CALL command for batch files and the other is the way you specify environment space when using COMMAND.COM. I have enhanced the support for early DOS versions (3.1, 3.2). MarxMenu executes COMMAND /C /E:nn (batchfile) >NUL to have one batch file call another. The first two lines of the batch files created are as follows: ECHO OFF CTTY CON .... This eliminates the ECHO OFF from being seen. Also whenever possible, when MarxMenu loads a copy of COMMAND.COM, it adds the /E:nnn command to set the environment space to the same as that of the Master Environment. In version 3.1 it is translated to paragraphs instead of bytes. Computer Tyme * MarxMenu * Users Manual Page #20 ----------------------------------------------------------------- One thing to note in early versions of DOS. If you run a batch file under COMMAND /C and your batch file has SET commands to set environment variables, the changes you make will disappear as soon as you get back to MARX.BAT. Why? Because you loaded another COMMAND.COM and the SET commands set its environment. When this COMMAND.COM ends, it takes its environment with it. Under DOS 3.3 or later, which uses CALL instead of another shell, the SET commands live. (Yet another reason to upgrade). ABOUT ENVIRONMENT VARIABLES I've been talking a lot about environment variables. Some of you out there in novice land don't know what an environment variable is. Many others don't know the intricate secrets handed down from the Great DOS Masters who know all the intricate undocumented features of DOS. Your DOS shell, COMMAND.COM owns an area of memory called the Master Environment. It contains strings in the form Name=Value. Included among those strings are your COMSPEC and your PATH. Your COMSPEC tells DOS and other programs where to find COMMAND.COM. Your PATH tells DOS and other programs what directories to search when loading programs. Another common environment variable is your PROMPT. This controls what your DOS prompt will look like. Environment variables are commonly set using the SET command. This is done by typing SET NAME=VALUE. Example: SET COLOR=BLUE So what does this actually do? Nothing, unless you have a program that reads the environment variables that is looking for one called COLOR. This way, environment variables can be used to leave messages to other programs and control how they behave. Besides leaving messages, environment variables can be accessed by batch files. If you use %NAME% in a batch file, DOS will substitute the VALUE of the variable for the %NAME% expression. And this feature is important to MarxMenu's operation. MarxMenu uses an environment variable called MXCMD. In the MARX.BAT file the third line is %MXCMD%. So MarxMenu controls MARX.BAT by writing values to MXCMD. In order to do this, there must be enough room in the environment for the command to fit. That is why you need to make sure that you have a SHELL command in your CONFIG.SYS to set space for MarxMenu to use. Now so far I've only talked about the Master Environment. That's the one that the first COMMAND.COM owns. Each program that is loaded, including TSR's, gets a copy of the Master Environment in its own environment. This is called the CURRENT Environment. Computer Tyme * MarxMenu * Users Manual Page #21 ----------------------------------------------------------------- One interesting feature of the Current Environment is that it is smaller than the Master Environment. DOS only creates enough space to hold a copy of the space used in the Master Environment and a little more to store the name of the program that is running. If one program executes another program, the environment of the parent program is called the Parent Environment. You will probably never need to deal with the Parent Environment but MarxMenu can access it in case you do. Another environment is the SHELL ENVIRONMENT. This is the one that THEY never talk about. The one you'll never read about in any books. The one you'll never learn about in any DOS classes. This is the one your parents never mentioned. The Shell Environment is normally the same as the Master Environment. But, if you are running more than one level of COMMAND.COM, the Shell Environment is the environment of the last COMMAND.COM in memory. This environment is the most important environment to MarxMenu. So why load up two or more COMMAND.COM's? There are several cases where this could occur. One case is when you want to run COMMAND.COM as a program under MarxMenu. This way you can type EXIT to get back to the menu. If you do this and then run MarxMenu again, you have two levels of COMMAND.COM. In this case, the first COMMAND.COM is the Master Environment and the second COMMAND.COM is the Shell Environment. Another place where more than one COMMAND.COM is used is if you are running Microsoft Windows 3 or DesqView. Both of these programs are able to run a DOS shell. When you do, this is a second level of COMMAND.COM. What is important is that SET commands and %NAME% commands in batch files deal only with the Shell Environment and not the Master Environment. MarxMenu can treat environment variables as if they were MarxMenu variables. By writing to environment variables you can store information that stays there even if you leave MarxMenu and return. Example: Writeln %PATH% %PATH% = 'C:\;C:\DOS;' Computer Tyme * MarxMenu * Users Manual Page #22 ----------------------------------------------------------------- DEALING WITH MULTIPLE DOS SHELLS If you are running more than one level of COMMAND.COM (shelling from Windows, DesqView, Word Perfect Office) and having environment space problems here's a trick. Before you load up your fancy shells, put this in a batch file like your AUTOEXEC.BAT. SET MXCMD=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX This variable will be trashed by MarxMenu thus freeing up the environment space it occupied. This will not only allow MarxMenu to run but may solve problems with other programs you are running that need environment space as well. Another option is, if you can control how the second shell is run, add the /E switch to the command line of COMMAND.COM to force a larger default environment space. Example: COMMAND.COM /E:400 MARXMENU AND TSR CONTROL MarxMenu along with the TSR utilities that come with MarxMenu, can load and unload TSR's under menu control. This is handy when you want to run a big application and need to free up some memory to do it. Since MarxMenu is a zero k menu system, unloading TSR's is possible but it has it's tricks. The problem you run into is that when one batch file calls another batch file, the way MarxMenu normally runs, DOS creates a small batch file control block in memory. This control block stays in memory after the TSR is released creating a region of trapped memory. Although this memory is freed, it isn't usable. The way around it is to jump to the batch file that releases memory instead of calling it. This is done by setting MXCMD to the name of the batch file you want to run. The only problem is that when you jump to the other batch file, it won't automatically return to MARX.BAT. You must therefore end your batch file with a command bringing you back to MARX.BAT. MEMHOG.BAT ----------- Rem UnLoad SideKick RELEASE SK CD\MEMHOG MEMHOG MARK SK SK MARX MAIN Computer Tyme * MarxMenu * Users Manual Page #23 ----------------------------------------------------------------- In your MAIN menu: OnKey 'H' |MxCmd = MEMHOG See the documentation file on the TSR utilities disk for more information on how to use MARK and RELEASE. NETWORK USERS: The main thing you have to worry about on a network is to make sure that when MarxMenu creates a temporary batch file, that it is a different one for each user on the network. This is handled several ways. If you are on a Novell network, MarxMenu uses your station number as part of the name for the temporary batch file. If you are not using Novell, then you will need to set an environment variable STATION for each workstation on your net. Each one has to be a different number. Example: SET STATION=5 You must ensure that the user has enough access rights to create temporary batch files in the directory selected for temporary batch files. One solution is to create a batch file directory and give all the users full access rights to it. MarxMenu has been run on about every DOS based network that exists. If the network runs at all it will generally run MarxMenu. Among the networks that come to mind are Novell, Lantastic, Banyan, 3COM, Lan Manager, IBM, DECNET, ConCurrent DOS, PCMOS, and SCO VPIX. MarxMenu is running on networks as small as two users to as large as 20,000 users. In fact, the bigger your network, the more you need MarxMenu. If you are running Lantastic and get a "sharing violation" error when two people try running the menu at the same time, try setting MARXMENU.OVR to READ ONLY. NETWORK MENU STRATEGY One of the main features of MarxMenu is the ability to create "smart" menus. This allows you to have a single menu that everybody runs but each user sees different selections based on what their access rights are, what groups they are in, what kind of hardware is available, or what workstation they are on. The group access feature is a very good example of using the power of MarxMenu. The idea here is that for instance under Novell you would put users in groups and have menu selections appear based on group membership. Thus only the accounting department sees the payroll selection. Computer Tyme * MarxMenu * Users Manual Page #24 ----------------------------------------------------------------- On non-Novell networks you can group users by having them in a text file list of members. Then you can read the list and test if they are in the list. You can also read environment variables and control choices based upon the result. The rule with networks is to keep things as consistent and simple as possible. A simple well-documented network is a happy network, and it can make the difference whether you go home on the weekends or stay at the office. USING TRUENAME ON NETWORKS Besides using drive letters, networks use a file and directory naming convention called TrueName. The MarxMenu TrueName function returns the true name of a file. TrueName files are specified as follows: Microsoft Networks: \\SERVER\DIRECTORY\FILE Novell Netware: \\SERVER\VOLUME\DIRECTORY\FILE By using TrueNames you can specify files and directories on the network without having to map drive letters or make redirection list entries. If a TrueName of a string ends in a '\' then it is at the root directory. Example: C:\ ;root of C \\TYME\SYS\ ;root of server \\TYME\SYS\PUBLIC ;not root directory NOVELL USERS: Novell is the most popular network on the market. We have added many enhancements for Novell networks to support things like logging in and logging out, drive mapping, group support, software metering, and status information. Although Novell is a high quality solid product it has its own "personality" and many undocumented features otherwise known as bugs. Most people who are having trouble with MarxMenu under Novell are really having trouble with Novell. Quite frankly, we do more Novell support than we do MarxMenu support. Having said that, we have two Novell networks. One at the lab and one at home and we love networks. But, we have spent hundreds of hours learning all the tricks. And to save you a phone call, and a lot of time, we've decided to share these tricks here in the manual. Computer Tyme * MarxMenu * Users Manual Page #25 ----------------------------------------------------------------- Some of these tricks are from the Great Network Gurus themselves who are so advanced that they no longer exist in physical form. These people live in another dimension of total mental existence and can only be reached by modem. Some of them hang out on Compuserve. We therefore strongly recommend that if you are a serious Novell user that you join Compuserve and hang out in the Novell section. And just because not everyone on Compuserve is a real person doesn't mean that you should feel uncomfortable asking them any question about your network that you need to ask. Netware 4.x Issues Many people ask me if MarxMenu talks to Directory Services and the short answer is NO. It's not that I don't want to, but Novell does not have and assembler interface into directory services. I have bitterly and publicly complained to Novell about this issue, and their response is that DOS is dead and no one is using it anymore. My response to that is, if you're running DOS, don't buy Netware 4.X. However, MarxMenu does work with Netware 4.x using bindery emulation. In fact, using the marxmenu bindery services, MarxMenu can read and write many of the Netware 4.x objects. But it only works with some of them. For the brave and the foolish, try running the BindDump utility on Netware 4 and you'll get an idea what you can fool with. For those of you who are still unhappy, I urge you to complain loudly and bitterly about this issue. THE NOVELL MENU TRANSLATOR One nice bonus with Novell networks is that MarxMenu can translate your Novell menus to MarxMenu. This saves you the time of having to recode your system. What you do is type: MARXMENU NOVTRANS <- Right Way MARX NOVTRANS <- Wrong Way This translates your Novell MNU file to a MarxMenu file. Your MNU file is renamed with an NOV extension. Once the menu is translated you run it by typing MARX instead of MENU . MarxMenu can run Novell's menu better than Novell runs their own. Sometimes the translator isn't perfect and it takes a little tweaking of the original menu file for the translator to work properly. If you have problems translating a menu and can't make it fly, upload a copy to our BBS system and let us take a look at it. You might discover something that we should use to enhance the translator menu itself. Computer Tyme * MarxMenu * Users Manual Page #26 ----------------------------------------------------------------- One problem some users experience is translating Novell menus with greater than 20 menu options. The Novell menus scroll when there are more options than can be displayed on a single screen. NovTrans translated menus do not support this. When we get calls on this issue, we recommend users to break up their menus into logical groupings, putting applications in one window, utilities in another, etc. If you should experience this problem, use logical groupings to work around it. If you get a "Window Out Of Bounds" error it is probably because you have more choices than will fit on the screen. After you are satisfied with the translation you can then start enhancing your menus by editing the new translated menus. You might want to run QUICKNOV and look at it's features. If you like what you see you can use your editor to cut and paste code from QUICKNOV.MNU into your menus. You can also start adding InGroup commands to create conditional menus. Under MarxMenu you can have one single smart menu for everybody instead of a lot of individual menus. Example: if InGroup('ACCOUNTING') AddChoice('Payroll',10) endif The translated menu is set up with a lot of features that you can add that the original Novell menu wouldn't do. These features include software metering and usage logging (See METER.INC for details). You can also control screen blanking and add password security for unblanking the screen. MarxMenu can be set up to log you off the network after a period of inactivity (See CUSTOM.INC for details). The translated menu also allows you to select various look and feel options by selecting NOVELL.INC, BLOCK.INC or GRID.INC. These three files are similar and you can edit them to change the colors of your menu interface. One thing to remember is that when you change an Include file you need to force MarxMenu to recompile the menu. It doesn't automatically recompile like it does when you change the .MNU file. To force MarxMenu to recompile you just type MARXCOMP or delete the MRX file. (The MRX file is the compiled file that MarxMenu uses to actually run your menus.) Computer Tyme * MarxMenu * Users Manual Page #27 ----------------------------------------------------------------- LOGGING OUT UNDER MENU CONTROL Logging out under menu control is one of the trickiest things to do. The problem is that as soon as LOGOUT executes, you no longer have access to the network. This means that if you are in a batch file, you are going to get a "Missing Batch File" error, unless the batch file is in the \LOGIN directory. Another problem with logging out is making sure that your COMSPEC is pointing to a COMMAND.COM that is either on the local drive or in the \LOGIN directory. Otherwise you will get a "Cannot load COMMAND.COM" error. Yet another problem that you need to deal with is that your PATH command needs to be changed so that it doesn't refer to mapped drives that are no longer accessible. If you are logging off with a batch file, the batch file must be in the login directory or a local drive. If it is in the login directory your current drive must be the first network drive (usually F:) and this drive must not be map rooted to any directory. What you need to do is create a batch file in the \LOGIN directory called OFF.BAT. Example: F:\LOGIN\OFF.BAT SET COMSPEC=C:\COMMAND.COM LOGOUT C: PATH=C:\DOS To run this file the current directory must be F:\LOGIN. When using the MarxMenu command Logoff, MarxMenu changes to the \LOGIN directory of the first network drive, removes any map roots on this drive, and runs OFF.BAT. Setting up an OFF.BAT file is compatible with MarxMenu's automatic network logoff feature. This is where you can set the amount of time to wait at a menu before it automatically logs you off the network. Another way to logout under MarxMenu is to stuff the LOGOUT command into the keyboard buffer and exit MarxMenu. Example: OnKey ESC |StuffKBD 'LOGOUT' + CR |ExitMenu Computer Tyme * MarxMenu * Users Manual Page #28 ----------------------------------------------------------------- Another logout trick is to use the LOGOFF utility from the Computer Tyme Network Survival Kit. This program automatically fixes your PATH and COMSPEC after the logoff occurs. Logging out with VLM Shells When you log out with VLM shells, the OFF.BAT file which was in the F:\LOGIN directory could give you a BATCH FILE MISSING error. This is because the VLM shell will map root you to the LOGIN directory and dos is still looking for the file in a directory called F:\LOGIN. One trick to get around this is to create a LOGIN directory under the LOGIN directory and copy OFF.BAT there. Thus, after the map root the VLM shell does after server logout, DOS will find the batch file F:\LOGIN\LOGIN\OFF.BAT. LOGGING IN WITH MARXMENU If there is any one thing that's trickier than logging out of a Novell network, its logging in. We have spent MANY hours struggling with Novell trying to get it right and have finally figured it out. Much of this comes from the Novell gurus who hang out on Compuserve and know everything there is to know about Novell. The first thing you need to do is make up your mind that you are going to do it right. The technique here might seem somewhat cumbersome, but it works well and will keep you out of trouble. MarxMenu has the ability to log you into a network, map your drives, and set your environment strings without having to touch a Novell utility to do so. MarxMenu can completely eliminate the need for Novell login scripts. The advantage of using MarxMenu to login is that you have the power of over 1000 commands to work with instead of just 25 or so. Logging out with VLM Shells If you think that logging out with NetX was a pain, you haven't seen anything until you do it with VLM shells. The VLM shells have a very unfriendly feature. Before you log in your first network drive is Map Rooted to the LOGIN directory. That means that you are at an F:\ prompt. Most of the time login scripts remap drive F: to other directories and that's where the problems start. Suppose you are running a batch file from the LOGIN directory called STARTUP.BAT. DOS thinks the batch file name is F:\STARTUP.BAT. But now you move drive F: to a different directory. What happens when dos goes back to the F:\STARTUP.BAT file? It's gone! You're stuck at a BATCH FILE MISSING prompt. Computer Tyme * MarxMenu * Users Manual Page #29 ----------------------------------------------------------------- By the way, if this should ever happen to you, you can type ECHO ON and get your prompt back. This little known trick will save you hours of rebooting time. Anyhow, the reason you get a "missing batch file" is because of remapping drive F:, your F:\STARTUP.BAT file no longer exists in the root directory. One of the tricks to get around this is to copy your STARTUP.BAT file to the root directory of the server, and to give the group EVERYONE rights to that file. That way, when it goes looking for F:\STARTUP.BAT, it will still be there. USING NOVELL'S LOGIN For those of you who want to stay with Novell's login program here are some tips to keep you out of trouble, and our tech support lines open. The last command in your system login script needs to be EXIT "batch name". This batch file will be the continuation of your login logic and should end up jumping to the menu system. This is where TSR's can be loaded. Never load a TSR or run the menu from within a login script. Until the login script finishes, LOGIN.EXE is in memory and it uses over 100k. The first rule is don't use personal login scripts unless you have to. The simpler the login, the easier it is to maintain. Try to do as much as possible in the batch file you exit to. MarxMenu can be run from this batch file as a post login processor. In this case MarxMenu isn't being used as a menu but as a programming language that is capable of very powerful login logic. The batch file might look as follows: MARXMENU POST.MNU MARX MAIN In POST.MNU you can set environment variables, test for directories, write batch files, read user lists, map drives, or any number of things that are useful to the login process. Computer Tyme * MarxMenu * Users Manual Page #30 ----------------------------------------------------------------- THE CONFIG.SYS FILE The place to start is the place where DOS starts when DOS boots. You MUST create a CONFIG.SYS file on your boot disk. The CONFIG.SYS tells DOS how many files and buffers to create, what device drivers to load, and the size of the Master Environment. Unless you are using special drivers, BUFFERS=40 and FILES=40 is a good place to start. STACKS 0,0 will gain you an extra 3k of RAM. But the most important command is the shell statement. A CONFIG.SYS file might look like this: SHELL=COMMAND.COM /P /E:400 BUFFERS=40 FILES=40 DEVICE=ANSI.SYS This sets up enough environment space to allow MarxMenu and DOS SET commands to work properly. You will also want to load any other device drivers like QEMM386.SYS or 386MAX.SYS to take advantage of other features of your computer. If you don't know about CONFIG.SYS files, read the DOS manual. Network Note: If you don't have a local hard disk and are booting from a floppy drive, set BUFFERS=4. If you are booting from a diskless workstation, set BUFFERS=1. BUFFERS are used for local drives only and have no effect on network drives. You save 1k of memory for every 2 buffers you don't use. THE AUTOEXEC.BAT FILE After the CONFIG.SYS is loaded the AUTOEXEC.BAT runs next. Here you load up your TSR's and network drivers. There are some important tricks to be used here as well. First of all, never load your network shell from your AUTOEXEC.BAT file. Always have it branch to another batch file called LOADNET to load the network shell. Use the AUTOEXEC.BAT only to load special TSR's and the IPX. An AUTOEXEC.BAT might look like this: @Echo Off Cls IPX SET NET=NETX.COM SET COMSPEC=O:COMMAND.COM LOADNET The two SET commands are very important. The first sets a variable called NET to NETX.COM. This will be used later in LOADNET.BAT. By using this variable, you can have users running many different versions of DOS and still use the same LOADNET.BAT file. You could also use a command SET NET=LOADHI EMSNETX.EXE to take advantage of advanced memory manager software. Computer Tyme * MarxMenu * Users Manual Page #31 ----------------------------------------------------------------- Another trick is to run BESTNET from the Network Survival Kit. BestNet will automatically pick the best network shell and set the NET environment variable for you. You would use the command BESTNET instead of SET NET=NETX.COM in the AUTOEXEC.BAT file. The SET COMSPEC=O:COMMAND.COM is important if you are booting off of either a floppy drive or a diskless workstation. This assumes that O: will eventually be mapped to a directory on the network that has a valid COMMAND.COM in it. It is important to set the comspec BEFORE loading your NET shell. This prevents a problem where Netware wants to go back to the boot disk even after you change the COMSPEC. We don't know why this works but it does. Trust Me. If you are going to use COMMAND.COM on drive C:, ignore this paragraph. Now we go to the LOADNET.BAT file. @Echo Off %NET% SET NET= F: STARTUP The big concept behind LOADNET is that this file is NEVER CHANGED. You put it on all your workstations and in the LOGIN directory and it is EXACTLY THE SAME for every computer in your network. Any changes to individual computers are made in the AUTOEXEC.BAT file. So why is this important? Because if you are running diskless workstations what happens is that while you are booting you have a mythical drive A:. As soon as your NET shell loads this drive disappears out from under you and you end up in F:\LOGIN. If you are running LOADNET.BAT when this happens you drop out of A:LOADNET.BAT and land in the middle of F:\LOADNET.BAT. And if your LOADNET.BAT is exactly the same file as the LOADNET.BAT in the \LOGIN directory, you take off running like the transition never occurred. Even if you are not running on diskless workstations now, you might go to it someday. It also creates good programming habits and helps you boot up cleanly. Let's see what LOADNET does. The first line is @ECHO OFF, that's easy. The second line %NET% executes the network shell that you specified with the SET NET=NETX command. This actually loads the network shell. The third line clears the NET variable freeing up space for other environment variables. F: switches you to drive F if you aren't there already. And finally STARTUP is the name of yet another batch file you jump to. Computer Tyme * MarxMenu * Users Manual Page #32 ----------------------------------------------------------------- The STARTUP.BAT file controls what happens after LOADNET runs. This file can be freely changed so that LOADNET.BAT can stay the same. This lets you modify what happens AFTER the network shell is loaded. If you are using Novell's login program STARTUP.BAT might look like this: @Echo Off LOGIN USING A MENU FILE TO LOG IN If you are going to use MarxMenu to log in instead of Novell's utilities, you will want to print out the sample file LOGIN.MNU on your MarxMenu disk and study it. Your STARTUP.BAT file might look like this: @Echo Off SET MXCMD=LOGIN MarxMenu Login %MXCMD% If MarxMenu works correctly, it will change the environment variable named %MXCMD% to point to a file that it creates. If for some reason it fails (you make a mistake in the login), it will execute Novell's login and let you get in and fix it. You will have to modify the LOGIN.MNU for your system. The one that I supply will not work on your system. It is to be used as a sample only and provide ideas for your login menu. One word of caution. After modifying this menu, always run MARXCOMP LOGIN to compile it. Otherwise, if you boot up into it you won't have enough access rights to recompile automatically. NOVELL SEARCH DRIVES MarxMenu and Network Survival Kit files need to be in the search path. You can copy the files into a directory that is already in the search path or create a new directory and add it to the search path. Here is a suggested setup. ---+--- SYSTEM | +--- MAIL | +--- LOGIN | +--- HOME -----+--- FRED | | | +--- BARNEY | +--- PUBLIC ---+--- DOS | +--- UTIL | Computer Tyme * MarxMenu * Users Manual Page #33 ----------------------------------------------------------------- +--- NSK I would use MAP ROOT and set up the following mapped drives: MAP ROOT H: = \HOME\BARNEY MAP ROOT U: = \PUBLIC\UTIL MAP ROOT N: = \PUBLIC\NSK ;Network Survival Kit MAP ROOT O: = \PUBLIC\DOS MAP ROOT P: = \PUBLIC Set PATH=H:\;U:\;N:\;O:\;P:\; The idea here is that the user's home directory is searched first, then the UTIL directory where various network goodies and batch files are kept. Then the NSK directory where only NSK and menu files are. Then the DOS directory where only your original DOS files are. And finally PUBLIC which contains only Novell utilities. Traditionally, with Novell networks, searches have been set up using the current directories of paths such as: Set PATH=H:.;U:.;N:.;O:.;P:.; I have found that since the addition of the MAP ROOT enhancement that this traditional method is not as flexible. NOVELL DRIVE MAPPING TRICKS Many applications require a search drive mapped to the applications directory. Instead of mapping every letter in the alphabet we have discovered a trick. The idea is to create a floating drive letter that you move into the application that needs it. I map a drive W that I call my work drive. I initially set it to the same directory as my home directory. But when I need an extra search path I set it to point to the application as follows: NovMapRoot('W','P:\WINDOWS') Using this method it isn't necessary to modify your search path. You always search through drive W but where W is moves with your applications. If you need more than one extra search drive you can have several floating drives. You might want to include some drive mapping commands at the beginning of your main menu to put the floating drives back to default directories. This way you don't run into problems where a menu choice doesn't work right after running another menu choice. Computer Tyme * MarxMenu * Users Manual Page #34 ----------------------------------------------------------------- SETTING FILE ATTRIBUTES Historically Novell has recommended setting file attributes to Shareable and Read Only. This was to deal with DOS 3.0 and earlier and network dumb programs. This is now an obsolete process and if you are in the habit of doing this it's time to quit (unless you are still running DOS version 2 on your workstations). I personally flag all my network files Normal as a way of catching network dumb programs. MarxMenu is a network smart product. It therefore isn't recommended that any file flagging be done on Computer Tyme software. NOVELL SEMAPHORES For a detailed explanation of Novell Semaphores, read the Novell manuals. What we've done is to export these functions to MarxMenu. We have implemented them slightly different than Novell did and have hidden all the nasties from you such as semaphore handles. All semaphores are accessed by name only. Here's a brief overview of semaphores. Semaphores are names of shared resources that the server keeps track of. Semaphores have three properties. They have a name, value and number of users. The name can be anything up to 48 characters long. The value is a number from -128 to 127. If the value is less than 0, the resource the semaphore represents is considered used up. By opening a semaphore, you increase the number of users by one. By closing it, you decrease the number by one. If a single user opens a semaphore many times, it is only counted as one. When you log out, your semaphores are closed. This is also true if you turn your computer off, but it takes 15 minutes for the server to give up on you. The first user to open a semaphore creates it. The last user to close a semaphore deletes it. When a semaphore is created, a value can be assigned. If a semaphore is opened that already exists, the initial value is ignored. When NovWaitOnSemaphore is called by any user, the value is decremented. If the value is not below zero, NovWaitOnSemaphore returns true. Otherwise it returns false and the value is unchanged. The amount of time that NovWaitOnSemaphore will wait is controlled by the variable NovSemaphoreTimeOut. When NovSignalSemaphore is called by any user, the value is incremented. This allows other users to call NovWaitOnSemaphore and get a True value. Computer Tyme * MarxMenu * Users Manual Page #35 ----------------------------------------------------------------- NovSemaphoreUsers and NovSemaphoreValue are used to read the status of a semaphore without changing it's value. One of the major differences between how MarxMenu uses semaphores and the way Novell uses them is that normally a semaphore dies when the application finishes. This would normally prevent a zero k menu system from being able to use them. MarxMenu uses an interesting trick where it fools Netware into thinking that the semaphore belongs to a TSR in memory. This allows the semaphore to live. Semaphores can be used for software metering. I've changed the semaphores to work with TSRs in upper memory. You no longer need a TSR in low memory for semaphores to live. This improves software metering. USING SEMAPHORES FOR SOFTWARE METERING An example of menu code that uses semaphores for software metering can be found in the file METER.INC. This metering ability is limited to Novell networks only. This software metering module counts how many users are using an application and limits it to a fixed number of users. Thus, you can save money on other software by limiting the number of people who can run an application to the number of copies you own. This can also be used to limit an application to 1 user where the application only works on a network for one user at a time. To use this module, add the line INCLUDE 'METER.INC' to your menu. Then under the OnKey you want to meter: OnKey 'W' |if Limit('WP',6) then Return ;limit to 6 users WP In the above example, a Word Perfect choice is limited to 6 users. Thus you may have 20 users total but only 6 can run Word Perfect at the same time. The way it works is, MarxMenu creates a semaphore when it runs an application and stores the semaphore name in an environment variable named METER. When the user returns to the menu the semaphore is cleared. If the user turns off their computer in the middle of an application, netware will clear the semaphore within 15 minutes. USAGE LOGGING: OnKey 'W' |LogIt('WordPerfect') WP Computer Tyme * MarxMenu * Users Manual Page #36 ----------------------------------------------------------------- This will send a log line to the log file that is a comma delimited ascii line with fields as follows: "UserName","Program","Start Time","End Time" NETWARE MHS & MARXMENU MarxMenu has the ability to interface to NetWare MHS which allows MarxMenu to send and receive messages. You need to have a copy of NetWare MHS to use this feature which can be purchased from your friendly neighborhood NetWare dealer. MHS stands for Message Handling System and the way it works is that you have a dedicated mail transport computer on the network. This computer is like a mailman and it goes around and looks for outgoing mail every little bit. If it finds mail it reads the address and delivers it. Any application program, such as MarxMenu, need only leave a text file in a special outgoing directory and put an address header on the file. Here's an example of how this is done: Example: var Message {MHS Header} AppendArray(Message,'SMF-70') AppendArray(Message,'FROM:MARC @ CTYME') AppendArray(Message,'TO:VICKI @ CTYME') AppendArray(Message,'SUBJECT:The Princess Called!') {Blank line separates header from message} AppendArray(Message,'') AppendArray(Message,'The Princess needs a ride home from dance') AppendArray(Message,'class and wants to get some money to go') AppendArray(Message,'skating. She wants to know if you can pick') AppendArray(Message,'them up at midnight and if 5 little girls') AppendArray(Message,'can stay over night.') WriteTextFile(MhsSendDirectory + '\' + UniqueFileName,Message) When MarxMenu creates a file in this format, MHS will pick up the file and deliver it. When it's delivered it will be like any other message and will appear in your favorite MHS Mail system. You can also use this feature to notify you when your fax server receives a fax. Computer Tyme * MarxMenu * Users Manual Page #37 ----------------------------------------------------------------- To receive a message, see the example under MhsReadFile. All MHS commands start with Mhs. By using these MHS features, MarxMenu can be used as a network job server that is triggered by messages sent to it and reports it's results by sending messages. UPGRADING MARXMENU When installing an upgraded version of MarxMenu be sure to copy the MARXMENU.EXE, MARXMENU.OVR and MARXCOMP.EXE files into your MarxMenu directory. A very common mistake is not copying the MARXMENU.OVR file. If you forget this file MarxMenu will lock up when you try to run it. If you are on a network and anyone on the network is using the menu you won't be able to copy over MARXMENU.OVR. You will have to wait until after hours or chase everyone out of the menu to install the upgrade. A common mistake occurs when you copy the MarxMenu file into a working directory and someone else has the MARXMENU.OVR file open and you fail to notice that it failed to copy. If MarxMenu starts locking up after an upgrade this is probably why. Make sure the file dates on MARXMENU.EXE and MARXMENU.OVR are the same. After installing the new MarxMenu, all your menu files will have to be recompiled. This should happen automatically, but if you are on a network and the users don't have enough access rights the compile will fail. You can recompile all your network menus as follows: WHEREIS *.MNU|DOLIST MARXCOMP @L If you are using MarxMenu to log into the network then be sure to copy the new MarxMenu files into your LOGIN directory and recompile your LOGIN menu. If you install MarxMenu in one directory and then move it to another you will have to run MARXMENU INST to recreate the batch files for that directory. Make sure that the MarxMenu files are on your PATH. Any time you upgrade, MarxMenu should work as well or better than the previous version. Occasionally we make a mistak so you might want to copy your present NSK directory to another temporary directory until the upgrade is complete and tested. This gives you the ability to go back to the old one should the need arise. This procedure should be followed on software upgrades from other vendors as well. Computer Tyme * MarxMenu * Users Manual Page #38 ----------------------------------------------------------------- CUSTOMIZING MARXMENU SAMPLE FILES Included in the MarxMenu package are menu files which you can easily modify to execute your programs and perform other functions you desire. Using MarxEdit, the text editor included in this package, you can modify and customize these menu files. Also included to demonstrate the power and versatility of the menu system is a game menu NIM.MNU. This is a game written in the menu system that demonstrates some of the logic functions and programmability of the system. Here's a simple example of a menu file: =================================== ClearScreen DrawBox 30 9 25 8 Writeln ' 1) Lotus' Writeln ' 2) dBase' Writeln ' 3) Wordstar' Writeln Write 'Select: ' OnKey '1' cd\lotus 123 OnKey '2' cd\db3 db3 OnKey '3' cd\wordstar ws ==================================== Notice in looking at the "OnKey" statements that all you have to do is tell MarxMenu how to get to the program. Although, MarxMenu takes care of reloading itself after exiting a selected program, its does not return to its own subdirectory as many other menu programs do. That means that if you execute a program in another subdirectory, when you come back to the menu, you remain in that subdirectory. If you normally run your applications with a batch file, consider having MarxMenu change directories and execute the program for you. This will eliminate debugging problems caused by the actions of your batch files. Computer Tyme * MarxMenu * Users Manual Page #39 ----------------------------------------------------------------- MENU ANALYSIS Let's start a simple analysis of the example menu file shown above. The ClearScreen statement simply clears the screen to give us a fresh workspace for the menu. DrawBox is the command to draw a box on the screen. The Writeln command writes a line of text to the screen within the box, then positions the cursor on the next line. The menu text shows the available selection keys that the user has access to. ONKEY STATEMENTS The OnKey statements control what is actually executed. OnKey statements also allow you to execute hidden commands when you do not want them to appear on the menu screen. One trick we use is to have an OnKey statement define a key that runs MarxEdit on each users personal menu file. We don't show this key on the menu to keep others from poking around in the file. For additional security a password can also be set up on this key. Normally you enter a line of text as if you were creating a BAT file to run your application. Like batch files, if one of your commands is a batch file, all the statements after it will not execute. To prevent this you can use the CALL command to call a batch file in DOS 3.3 or later, or COMMAND /C in DOS 3.1 and 3.2. Normally, text displayed under an OnKey statement is the same text as the batch file created by MarxMenu. There are some exceptions: If a line starts with a "|" (vertical bar), the line will be interpreted by MarxMenu instead of being written to a batch file. This allows commands such as "PASSWORD" to be used. String variables can be passed as part of a batch command if the name of the string variable starts with a "%" symbol. The spaces preceding the commands under the OnKey statement are for clarity only. They are not necessary for MarxMenu to function properly. Sometimes you need more control over what commands actually go into the batch file that MarxMenu executes. You might want to input test from the user or have the user make a choice from a list that will become part of the batch file that is executed. The BAT command is used to do this. Let's say you want the user to enter the name of a directory to back up to a floppy. Here's how this might be done: Example: OnKey 'B' |DrawBox 15 10 55 3 |Write 'Enter Directory: ' |BackupDir = Readln |if (LastKey = Esc) or (not ExistDir(BackupDir)) | Return |endif |Bat 'XCOPY ' + BackupDir + ' A: /S' DIR A: Computer Tyme * MarxMenu * Users Manual Page #40 ----------------------------------------------------------------- PAUSE Notice that the commands under the OnKey statement start with a vertical bar. This is because they are MarxMenu commands rather than batch file commands. Remember you are dealing with two languages here. MarxMenu understands MarxMenu commands and DOS understands batch commands. When you are under an OnKey statement all commands are written to a memory buffer which are written to a batch file when MarxMenu exits. DOS then runs this batch file. If you start a command with a vertical bar under an OnKey command then MarxMenu will see the command. The BAT command is a MarxMenu command that allows you to write lines to the batch file that is being created. It allows you more specific control of execution by allowing you to include MarxMenu variables in the DOS command. POPUP MENUS If you want to create a popup menu within a menu you can do so by using a "label". A label is a keyword preceded by a colon. To call the popup menu, place the keyword on a line by itself preceded by a carat (Shift 6). The label will precede the popup menu definition. For example if you have a popup menu to load Smart Software, you could name the PopUpMenu Smart. To bring up the Smart PopUpMenu, define a key in your main menu for Smart like this: OnKey 'S' ^Smart The Smart menu itself might look something like this: :Smart BoxHeaderColor ForeColor BackColor BoxBorderColor Yellow Green BoxInsideColor LCyan Green InverseColor Yellow Red BoxHeader = ' Smart Menu ' DrawBox 45 16 20 6 UseArrows 2 2 16 3 ClearLine 205 Writeln Writeln ' Data Base' Writeln ' Spread Sheet' Write ' Word Processor' OnKey 'D' SM D Computer Tyme * MarxMenu * Users Manual Page #41 ----------------------------------------------------------------- OnKey 'S' |BoxHeaderColor ForeColor BackColor |BoxBorderColor Yellow Green |BoxInsideColor White Green |%1 = PickFile('C:\SMART\SPREAD\*.WS',4,5,17) SM S -ALOAD %1 OnKey 'W' |BoxHeaderColor ForeColor BackColor |BoxBorderColor Yellow Green |BoxInsideColor White Green |%1 = PickFile('C:\SMART\WORD\*.DOC',4,5,17) SM W -ALOAD %1 While developing the menu, program one of the keys to run your favorite editor on the menu file that you are creating. This way, as soon as the change is made, the results will show when you exit your editor. Since MarxMenu allows versatility in creating the look of your menus, a little trial and error will be required to make things look right. THE CONSOLE +---| Console Functions |---+ | 1 - Blank Screen | | 2 - Set Blank Message | | 3 - Lock Keyboard | | 4 - Set Blank Time | +---------------------------+ The Console is a popup menu of built-in functions. To activate the console, press the TAB key. A menu will popup in the upper left-hand-corner of the screen. You can change the position of this popup menu with the ConsolePos function. The first command on the Console screen is Blank Screen. Enter 1 and the screen will blank immediately. It will remain blanked until a key is pressed. Enter 2 on the Console menu and you can change the message displayed on the Blank Screen display. Enter 3 and you will be prompted for a word to lock the keyboard. After you enter the lock word the screen will blank and the keyboard will be locked until the exact lock word is typed. Enter 4 to set the number of minutes to wait before blanking the screen. The lock word feature is handy for times when you must leave the keyboard but don't want menu commands displayed for all to see. It also effectively locks the keyboard so someone can't escape to DOS and test the format command on your hard disk. We run this menu on a Novell Network and don't want to let everyone have access to the Supervisors' power at the touch of the escape key should we leave the keyboard. Computer Tyme * MarxMenu * Users Manual Page #42 ----------------------------------------------------------------- REPOSITIONING THE TOP WINDOW One nice feature you can use to play with the positioning of a window is to turn on the scroll lock. This lets you move the top window around the screen using the arrow keys so you can see how it looks. Then you can go into your menu code and set it permanently. Set Scroll Lock to "on". On most keyboards, a scroll lock LED will light up. Now use the arrow keys to move the top window to any position on the screen. Neat huh? If you want to prevent users from moving the menus around using this feature, add the command, "ScrollMove Off" to your menu. MOUSE SUPPORT If you have a standard mouse driver, MarxMenu will detect it and use it automatically. The left button on the mouse is the same as pressing return. The right button on the mouse is the same as pressing escape. Pressing both buttons on the mouse is the same as pressing the tab key. As of yet, the center button on the mouse is not used for anything. The sensitivity of the mouse can be controlled using the MouseHorizontal and MouseVertical commands or by setting environment variables MOUSEX and MOUSEY. STARTING OFF THE EASY WAY For those of you who want to just get a menu going and don't want anything complicated we have included a menu called the LEVEL1 menu. This menu is a fill-in-the-blank type of menu that will get you going quickly and easily. This menu requires no programming and explains itself. You run it by typing the command: MARX LEVEL1 The first thing it does is scan your drive to find the directories. Then you just answer the questions and fill in the menu. This isn't as powerful as programming your own menu, but if you want something quick and dirty, this may be the answer for you. Although the LEVEL1 menu example will work on networks, it is mostly intended for single user use. Computer Tyme * MarxMenu * Users Manual Page #43 ----------------------------------------------------------------- ABOUT VARIABLES One of the most unusual things about MarxMenu is its variables. MarxMenu handles variables differently than any other programming language. For the experienced programmer, this may require some adjustment since it's like getting used to driving a Cadillac after driving a VW Beetle. All variables in MarxMenu are like an empty box that can contain anything. A variable can be a number, boolean, string, file, array, etc. The type of variable is controlled internally and the user need not declare variable types. Variables are created with the VAR command: Var X Y Z If the word VAR is on a line by itself, the following lines, up to a blank line, are considered variable names. Var MyAge YourAge HisAge HerAge Variables are initialized to null values; 0 for Numbers, False for Booleans, and '' for strings. Initial values can be set when the variable is created. Var X = 6 MyName = 'Marc' Programmer = True Variables can change variable types. If you write a number to a string variable, the variable changes to a number. X = '234' X = Value(X) This is valid in MarxMenu. X now is a number and contains the value 234. When choosing variable names, it is good programming practice to choose long meaningful names. This allows yourself and others to be able to read menus and follow the logic more easily. Computer Tyme * MarxMenu * Users Manual Page #44 ----------------------------------------------------------------- NUMERIC VARIABLES MarxMenu supports two kinds of numbers, 32 bit integers and real (floating point) numbers. Integers are whole numbers in the range of plus or minus 2,147,483,647. This gives you a wide range of numbers but no fractions. With integers the answers to division are always rounded down thus: 7 / 3 = 2 Numbers beginning with a '$' indicate base 16 or hex numbers. Example: $20 is the same as 32 BOOLEAN VARIABLES Boolean variables are True or False. For example: var Adult Adult = True if not Adult then Write 'You must be 21 to enter.' Boolean values can be set by computation: Example: Adult = Age >= 21 In this example the result of Age >= 21 is stored in the variable Adult. If you use a boolean variable by itself, MarxMenu assumes you are setting it to on. Thus: ClearScreenOnExit is the same as: ClearScreenOnExit On STRING VARIABLES String variables are limited to 255 characters. In MarxMenu, string literals are delimited by either single or double quotes. "This can't be yogurt!" 'Lincoln said "Four score and seven years ago ..." ' Computer Tyme * MarxMenu * Users Manual Page #45 ----------------------------------------------------------------- REAL NUMBERS So what's the difference between ordinary numbers and real numbers? Ordinary numbers in MarxMenu are 32 bit integers. These are numbers whose range is about plus or minus two billion. Integers are whole numbers and do not include any fractions. This is why MarxMenu has included REAL numbers (also known as Floating Point numbers). Real numbers in MarxMenu use BCD (Binary Coded Decimal) with 18 digits of accuracy. They have a range of 10 to the plus or minus 63rd power, which means up to 63 zeros either side of the decimal point. This lets you work with very big and very small numbers. MarxMenu has smart rounding algorithms so that 1.0 / 3 * 3 = 1.0 and not 0.999999999999999999 like in most languages. Real numbers are specified by using a decimal point. Thus 5.0 specifies a real number. Most normal MarxMenu functions still require the standard 32 bit integers. If you get the error: 'REAL found where INTEGER expected.' You need to use an integer. If an integer is passed where a real is expected, the integer is automatically converted to a real. Thus: 6.0 * 3 = 18.0 The Value function returns real numbers if a decimal point is used in the string. All the relevant math functions will work with reals as well as comparison operators. MarxMenu supports a variety of functions for real numbers. It has trig functions, log functions, and exponential functions. So why do you need real numbers in a menu program? We don't know. The author had a library and threw them in. We figure someone will need them someday. With real numbers you can do trigonometry calculations like those discovered by the ancient Indian chief Pythagoras who discovered what is now known as Pythagoras's triangle. Now we know that a lot of you were taught in Math class that Pythagoras was Greek. Well, it's just not so. Here is the real story: Pythagoras was an Indian chief who had three wives. Two of the wives were twins and weighed 120 pounds each. And they sat next to Pythagoras on a pair of twin deer hides. But Pythagoras also had a third wife who was a large fat woman who sat across from Pythagoras on a hippopotamus hide. This wife weighed 240 pounds. What Pythagoras discovered was that the squaw on the hypopotamus was equal to the sum of the squaws on the other two hides! Computer Tyme * MarxMenu * Users Manual Page #46 ----------------------------------------------------------------- LOCAL VARIABLES MarxMenu also supports local variables. Variables declared within procedures become local variables. Local variables are just like global variables in that you can use them as multidimensional arrays. When the procedure finishes, all local variables are disposed. If a local variable has the same name as a global variable, the local variable will be used. DATES Dates in MarxMenu are stored as the number of seconds since January 1, 1980. This gives MarxMenu a date range of 68 years. By subtracting two dates, you get the number of seconds between two periods of time. MarxMenu has several commands that convert text strings to dates. Here are some examples of how MarxMenu sees text dates. Examples: '4-7-91' ;04-07-1991 00:00:00 'April 7th, 1991 4:35pm' ;04-07-1991 16:35:00 '12:35:23a' ;04-07-1991 00:35:23 '3:15' ;04-07-1991 03:15:00 If the string can't be converted, then the variable BadDate is set to true. MarxMenu can also convert dates to strings by using the DateString and TimeString commands. PASSING PARAMETERS TO PROCEDURES Procedures can accept parameters by declaring variable names on the same line as the name of the procedure. Procedures can return variables by using the Return command. Return exits the procedure returning the parameters on the same line as the Return statement. Example: Procedure Factorial (X) var Y Z Y = 1 Z = 1 while Y <= X Z = Y * Z Y = Y + 1 endwhile Writeln X ' factorial is ' Z EndProc Computer Tyme * MarxMenu * Users Manual Page #47 ----------------------------------------------------------------- In this example, if you were to use Factorial (5) you would get: 5 factorial is 120 Another example: Procedure AskYesNo (Question) var YesNo DrawBox (34 - (Length(Question) / 2)) 21 Length(Question) + 14 3 TextColor LCyan Blue UseArrows Off Write ' ',Question,' (Y/N) ' YesNo = UpperCase(ReadKey) YesNo = YesNo = 'Y' if YesNo Write 'Yes' else Write 'No' endif Wait 50 EraseTopWindow Return (YesNo) EndProc if AskYesNo 'Do you want to continue? ' then Continue In this example, MarxMenu draws a box and asks a question and waits for a "Yes" or "No" answer. Arrays can be passed as parameters. Parameters are passed by value not by reference. This means that any changes to the passed parameter do not affect the original value. You can copy an array by assigning it equal to another array. Example: Array1 = Array2 This creates Array1 with a copy of all the elements of Array2. The previous contents of Array1 are overwritten. ABOUT CONSTANTS Constants are used to give values meaningful names. By using constants a value can be assigned once and the constant name used throughout the menu program. This way, if you change the value of the constant, all the places where that constant is used automatically change. Computer Tyme * MarxMenu * Users Manual Page #48 ----------------------------------------------------------------- This is good programming practice. Examples: Const States = 50 CPU = '80386 SX' WeekEnd = True or Const States = 50 CPU = '80386 SX' WeekEnd = True Using the word STATES is just like using 50. Using CPU is just like using '80386 SX'. But if throughout my menu you use CPU, and then you get a new computer with a 80486, you can just change one line: Const CPU = '80486' And all the places you used CPU changes to '80486'. This is the correct way to program. ABOUT ARRAYS MarxMenu supports multidimensional arrays up to 31 dimensions. Unlike other programming languages, arrays need not be declared. MarxMenu creates arrays "on the fly" and automatically takes care of the array size and number of dimensions. Another unusual feature of MarxMenu arrays is that they are an array of MarxMenu variables. This means that elements of MarxMenu arrays need not be of the same type. Element 1 can be a number, element 2 can be a string and element 3 can be another array. This type of variable management leads to the easy creation of very powerful data structures as you will see. Var X X[1] = 'Element 1' X[2] = 3 X[3] = True X[4,6] = 9 X[4,7] = 'Ten' These are all valid statements. MarxMenu creates a two dimensional array here. If we now execute the following statement: Computer Tyme * MarxMenu * Users Manual Page #49 ----------------------------------------------------------------- X[4] = X[4,6] + X[2] X[4] becomes equal to 12 but variables X[4,6] and X[4,7] are lost. This is because we have changed an array into a number. MarxMenu automatically handles the deallocation of memory used by this array and its elements and returns the space the used to the memory pool. ABOUT QUALIFIERS Qualifiers are named indexes into arrays. They are used to make the source menu file more readable and more organized. Suppose we are creating a data structure to deal with places in the United States. First we will need an array for States. Var States We want to store some facts about the states. Qualifier Population Bird Motto County State[3].Population = 10000000 State[3].Bird = 'Chicken' State[3].Motto = 'Best politicians money can buy!' Now states have counties and counties have county seats, sheriffs, and cities. Qualifer Sheriff Seat City State[3].County[7].Sheriff = 'Buck InBred' State[3].County[7].Seat = 'Possum Trot' Now counties have cities and cities have schools, mayors, churches, and taxes. Qualifier Schools Mayor Churches Taxes Computer Tyme * MarxMenu * Users Manual Page #50 ----------------------------------------------------------------- State[3].County[7].City[9].Schools = 8 State[3].County[7].City[9].Mayor = 'Virgil Collins' State[3].County[7].City[9].Churches = 120 State[3].County[7].City[9].Taxes = '$100,000,000' The above line is the same as: State[3,4,7,3,9,4] = '$100,000,000' As you can see with qualifiers, it is easy to create multidimensional arrays in a way that is organized and readable. In this example, the qualifier Population became equal to 1. Bird became equal to 2. The variable references, State[3].Bird and State[3,2] are the same. It's just that one is more readable than the other. Qualifiers normally begin by assigning 1 to the first name and 2 to the second, etc. This can be modified. Qualifier Color = 7 Size Shape In this case Color becomes the number 7; Size becomes the number 8; and Shape becomes the number 9. POINTER VARIABLES In MarxMenu, variables can point to other variables allowing parameters to be passed to procedures by reference as well as by value. A pointer variable stores the location of another variable. Any time a pointer variable is accessed, MarxMenu acts upon the variable that the pointer variable is pointing to. Pointer variables are set using the Loc (location) command. Example: Var A B C A = Loc B MarxMenu supports complex location pointers and pointers to other pointers. MarxMenu will resolve all references until real data is found. Example: B = Loc A C = Loc B C[5] = 20 Writeln A[5] ;returns 20 Computer Tyme * MarxMenu * Users Manual Page #51 ----------------------------------------------------------------- Pointers can also be passed as parameters to procedures. Thus if A is an array of strings we can sort A as follows: Procedure SortTest (TestArray) SortArray(TestArray) EndProc SortTest (Loc A) ;sorts array A COMMENTS IN MENU FILES MarxMenu has three ways to add comments to a menu file. The first way is with the Comment command. Comment ======================== This is a comment block. ======================== EndComment All lines up to EndComment are ignored. The second way is with a ';'. All text to the right of the ';' (semicolon) is ignored. BlankTime = 20 ;this is where we set the blank time. The third way is using {} or curly braces. Anything inside the curly braces is ignored. Curly braces can be nested. {All of {this} is a comment.} Comments are ignored by the compiler and cost you nothing in execution speed. Comments can save you a lot of time if you have to come back later and work on your menu, or if someone else has to work on it. Therefore, we encourage you to use comments as much as possible. THE MARXMENU COMPILER MarxMenu reads your MNU files and creates MRX files. These MRX files are a highly digested form of the MNU file that you created. MRX files are the compiled files. When you run MarxMenu, the interpreter MARXMENU.EXE looks for the menu file with the MRX extension. If it doesn't find it, MARXMENU.EXE will automatically load MARXCOMP.EXE and compile the menu. MARXMENU.EXE also compares the file dates of the MNU and the MRX files. If the MNU file is newer than the MRX file, the compiler will be loaded. Computer Tyme * MarxMenu * Users Manual Page #52 ----------------------------------------------------------------- MarxMenu will also force a compile if the MRX file was not compiled by the same version and release date of the MarxMenu you are using. MRX files are not compatible from one version of MarxMenu to the next. You can also force a compile from the command line by typing MARXCOMP . If you are on a network and using MarxMenu to log you in, make sure you run the compiler if you change your login menu file. Once your menus are written, you can remove the MNU file and MARXCOMP.EXE from the system. This prevents anyone from modifying your menus. The MRX files are scrambled for security. This prevents probing eyes from reading strings in the MRX files. One important thing to remember. Don't lose your original MNU files. The MRX files CANNOT be decompiled. If you lose your original menu files you can't change your menus and the MRX files you have will not be compatible with future releases of MarxMenu. MARXMENU LANGUAGE RULES MarxMenu interpretation is left to right and doesn't have any operator precedence. You can control the order of evaluation by using parentheses. Examples: 2 + 3 * 4 ;returns 20 2 + (3 * 4) ;returns 14 if A > 4 or B < 6 then ... ;error if (A > 4) or (B < 6) then ... ;correct Statements are limited to one line and lines are limited to 200 characters. COMPILER COMPATIBILITY The MarxMenu compiler is fully compatible with earlier versions of MarxMenu with a few exceptions. The new compiler does a lot more error checking than earlier versions of MarxMenu and will catch errors that you could previously get away with. Other than that, the only difference you should notice will be a speed increase. Earlier versions of MarxMenu had separate names for variable types. The names $VAR, BVAR, #VAR, and FILEVAR act the same as typing VAR. Very early versions of MarxMenu had a different form of the USEARROWS command that required 4 to 5 numbers after it. If you run into this error, just get rid of the numbers after USEARROWS and it will work fine. Computer Tyme * MarxMenu * Users Manual Page #53 ----------------------------------------------------------------- A WORD ABOUT DOS VERSIONS ..... Versions of DOS below 3.3 will cause MarxMenu to use 3.5k of RAM where 3.3 DOS and above use no memory. 3.2 DOS is very buggy and should be replaced. 3.1 DOS isn't too bad for bugs but if you're using the BACKUP and RESTORE programs that came with it, you're in trouble. They don't work on large files. You'll find that out if you try to restore one of them. MS-DOS 4.01 seems to be pretty clean provided you have the April '89 release or later. To determine if you do, check the file date on COMMAND.COM. Earlier versions of DOS 4.01 have SERIOUS BUGS. If you are running any DOS 4 earlier than April '89 you should upgrade immediately. We are happy to announce that MarxMenu runs under DOS 5.0 with no problems or modifications. One feature implemented is the Idle Loop call which allows MarxMenu to conserve CPU power when it's not doing anything. This makes it work better under DesqView and Windows. Speaking of Windows, MarxMenu is not a Windows program. It can however be used to start Windows programs and can be run under Windows. Windows however is an extremely unstable environment. If for some reason you're having trouble with MarxMenu and Windows, it's Windows fault. In spite of glowing reviews that magazine writers seem compelled to write, I recommend avoiding Windows unless you have a program that requires Windows to run. DR-DOS or EZ-DOS are pretty good also. It is very compatible as long as you don't get too strange with it. We recommend version 3.4 or later. DR-DOS has a nasty COMSPEC bug in versions 5 and 6 when running a second COMMAND.COM shell started from a network drive. 4DOS is also pretty good but sometimes some of the advanced features in this product can cause it to behave differently than DOS. This requires extra care when writing your menus. MarxMenu should work correctly on 386 multiuser operating systems such as Digital Research's Concurrent DOS 386 or SCO VPIX DOS emulators and PCMOS. Under these systems you will have to set the TASK environment variable if you are running MarxMenu in multiple tasks. MarxMenu will not run correctly under DesqView 2.26. It will run under 2.25 or 3.21. So if you are running 2.26, it needs to be upgraded. MarxMenu contains several support functions for DesqView including DesqView API calls to control the DesqView environment. Although we haven't tested MarxMenu in the OS/2 1.3 compatibility box, we have had good success with MarxMenu under OS/2 2.0. We have been able not only to run DOS programs but OS/2 programs as well. If set up right MarxMenu can spawn multiple tasks of both DOS and OS/2 applications. Computer Tyme * MarxMenu * Users Manual Page #54 ----------------------------------------------------------------- If you are running under some weird DOS and are having problems, try it under "regular" DOS and see if it goes away. If it does, try to find out what it is about your weird DOS that makes it not work right. We are interested in being compatible with as many systems as possible. Let us know if you are having problems. But also, try to get your weird DOS vendors to clean up their act. A WORD ABOUT BUGS ..... Although we try to create perfect bug-free software, every now and then we make a mistak. If you find one, let us know and we'll fix it. Our standard is to not only have all the functions of MarxMenu work correctly, but for it to be as intuitive and full featured as possible. TIPS FROM THE MASTER Since MarxMenu is a programming language, I want to talk about what programming is and how it is accomplished. I want to dispel some myths and fears relating to it and introduce you to techniques that will help you write code neatly, quickly, and efficiently. From the outside, programming looks like magic; but once you know a few of the tricks, it's really not too hard. Many of us who were raised on 50's and 60's science fiction television learned that it is the brainy types who deal with computers. It almost gives you the impression that the computer is smart and you are dumb. As you use the computer, it is evaluating you, and if it figures out that its smarter than you, it can get your job and replace you. COMPUTERS DO SIMPLE TASKS A computer is a simple device. It does simple tasks. It just does them very fast and accurately. Computers don't even know basic things like how to write letters on the screen or how to read the keyboard. These are programs that the computer runs. Someone had to program your computer to do even the simplest of tasks. As you learn to use MarxMenu start with the simple menus. The SAMPLE.MNU is a very easy program. Study it and understand how it works. Make a copy of it and begin by changing a single selection to run one of your programs. Once you have changed one selection, change several more. Now MarxMenu is running your programs, and you have made it work. Then try something new. Add more selections. Change the size and position of the box to fit your needs. Take the time to play with it. Try new commands. Build up your menu. Be artistic. The more you work with it, the more you will learn. Computer Tyme * MarxMenu * Users Manual Page #55 ----------------------------------------------------------------- COMPLEX TASKS ARE MADE OF SIMPLE TASKS As you learn more about MarxMenu, move on to QUICK.MNU. Here we use more of the power of the MarxMenu language. As you study this menu, you will notice something. Even though it looks complex, it is really a collection of simple tasks. Understand how the moving windows work. Understand that the pop-up menus are just like the main menu. You will see that it is really not a complex menu at all. It is a lot of simple processes hooked together. That is one of the main concepts behind programming. Complex tasks are built out of simple tasks. As you learn the simple tasks, you will quickly understand how to connect them to accomplish complex tasks. When one sees a castle, one can't help but to be impressed. But castles are made of stones. And you can't build castles until you understand how stones work. Then you realize that a castle is just a bunch of stones hooked together. Programming is just like that. To successfully understand MarxMenu, start at the bottom and work your way up. Each little trick you learn becomes another building block for the next trick. What you start with becomes the foundation for the work that you will eventually produce. LEARNING GOOD PROGRAMMING HABITS Programming has its pitfalls, here we hope to give you some tips that will help you avoid common mistakes. This, we hope will give you a head start on the road to MarxMenu being done right. The first concept is patience. Rome wasn't built in a day. You may not be able to write grand and glorious menus the first try. In fact, you may have trouble getting the damn thing to work at all. As you have probably already noticed, no program is perfect. Sometimes there are errors in the manual. Sometimes it just doesn't work like you expected, or does not work the same way as other programs that are familiar to you. But, once you complete the installation, give it some time and realize that there is a lot of potential here. Approach all challenges with a good attitude. USE LONG NAMES I learned computers the hard way. Out on the streets. Hanging around with other computer nerds in the late 70s who never went to college either. I was known as a Bit Wit. My first real computer was an IMSAI kit. Actually, it wasn't all IMSAI, it was a combination of several kits where no two boards came from the same supplier. It was in an IMSAI box, so I called it an IMSAI. Computer Tyme * MarxMenu * Users Manual Page #56 ----------------------------------------------------------------- It was all supposed to work together the salesman told me the day before they went out of business. And it all did after some redesigning. I was tired of fixing CB radios for a living and decided that computers were here to stay and that I was going to learn about them. With that in mind, everything that went wrong became an opportunity for growth. Not that I looked forward to things not working. I programmed the thing from scratch, loading binary codes into memory from an array of switches on the front panel. The first program I developed ran the EPROM burner, which was the only storage device I had. After I saved this program on a chip, I used it to load the second program onto the chip. Eventually I wrote enough software to talk to the screen and keyboard. Now I could type hex codes on the screen and save them to a chip. Eventually I wrote a tape driver and could save stuff on tape. Later, I traded for a North Star disk drive and had a disk system. One 90k floppy. I thought I was in heaven. I was intimately familiar with my computer. All my programs were in object code with no documentation whatsoever. At that point, a friend of mine, Rufus, turned me on to a language called FORTH. Being an interesting language and very powerful, I typed in the whole compiler in hex and adapted it to work on my system. Once I got Forth up, I wrote a line editor in it. Then I used the line editor to write a screen editor. With the screen editor, I rewrote Forth in Forth. The language compiled itself. From working with Forth (which is as much a religion as a programming language) I learned both good and bad habits. Forth is a write-only language and is almost impossible to read even with the best of documentation. On the other hand, it is as close to the machine as you can get in a high level language. After opening up a computer store in 1984, it became time to make the jump from CP/M to the DOS world. Turbo Pascal offered an interesting solution. They had both a CP/M and DOS compiler. This meant that programs I wrote would run on both machines. The thing that struck me about Pascal was that I could read it better than Forth, and didn't even know the language. Not only that, but I could follow the programs that other people wrote and incorporate their code into my code. The more programs I wrote, the more I came to appreciate a language that was reader friendly. I could manage my programs much easier without having to remember so much. Other people could follow what I was doing easier. Computer Tyme * MarxMenu * Users Manual Page #57 ----------------------------------------------------------------- The important thing I learned was that readability is very important in a program. The more complex the program, the more important readability becomes. One of the main design factors in the MarxMenu language is readability. I could have used short names for the commands and it's not like I like to type. I'm still on just two fingers here. It's just that descriptive names are so much more meaningful when putting simple processes together to create complex processes. The point (finally) is, when creating variable names, or procedure names, use long meaningful names. It may take more typing, but it takes a lot less thinking and remembering later on. Consider the following example in choosing variable names. Var KlingonsDestroyedInBattle Var K In the above example, it is obvious which one tells you more about what information is stored in the variable. USE COMMENTS LIBERALLY Even though MarxMenu is easy to read, it still should be commented. The examples that come with this disk do not have as many comments as they should. Don't do as I do, do as I say. I'm lazy and a bad example. Comments are not compiled in your MRX files and cost you nothing at execution time. In order to make commenting easy, we have provided three separate comment commands. Learn these commands first. Every menu should include a title comment. This should include the name and phone number of the person who wrote it. If you have a problem with a menu and you send it to us, we expect a title comment. That way we can call you about it. Comment ==================================================================== This comment was created by Marc Perkel 1-417-866-1222 Last Updated: 01-28-90 This form of comment block is better than using ';' because not using ; allows you to turn your word wrap feature on and do some professional looking editing in the comment block. This kind of comment block should be at the beginning of each and every menu you create. Computer Tyme * MarxMenu * Users Manual Page #58 ----------------------------------------------------------------- The top and bottom bars are for looks only and are not necessary to the comment. I strongly encourage you to use bars and do things for looks in source code. Looks are very important and you should put as much care into your comments as you do in writing a business letter. If you learn MarxMenu well, your source code may be part of your next job interview as you move up the corporate ladder. So you want it to look good. By the way, if you upload your menus to my bulletin board, I expect a comment block at the top of your menu with your phone number so I can get back to you. ==================================================================== EndComment INDENT YOUR CODE As programs get more complex, it gets harder to match the IFs with the ELSEs and the ENDIFs. This is where indenting comes in. It creates a logical grouping of statements and you can easily see what goes with what. Procedure IfDemo IF ELSEIF ELSEIF ELSE WHILE ENDWHILE ENDIF EndProc You can easily see how this helps you follow what you are writing. Now here's a new trick. If you are using an IF, and plan to use an ELSE and an ENDIF, on the line under the IF statement, type in your ELSE and ENDIF lines. Then go back and insert your statements in between these lines. This will help you avoid forgetting the ENDIF or getting mixed up as to which IF matches which ELSE. Computer Tyme * MarxMenu * Users Manual Page #59 ----------------------------------------------------------------- A similar trick can be done with parens and brackets. When typing a left paren, type the matching right paren with it. Then fill in the code you want to put inside the parens or brackets. FOR DUPLICATE TASKS, USE PROCEDURES As menus become longer and more complex, many times you are duplicating a process that you have already written. Although it is easy to copy a block of code, it is better to create a procedure. With procedures, the process is put in one place and is given a name. Preferably a long meaningful name. Once this procedure is defined and named, it can be used as if it were part of the MarxMenu language. This makes menus smaller and easier to read. It is also a way for you to combine small processes into large processes. Procedures can be built using other procedures. Once you have a process figured out and working in a procedure, the whole process becomes a black box with a name that you can use elsewhere. The whole process is reduced down to a name that just works! Another advantage of procedures is that if circumstances change and the procedure needs to be modified, you only make a change one place in your menus, and everything that uses that procedure is automatically changed. This makes menu maintenance easier. DON'T PROGRAM YOURSELF INTO A CORNER Using the above techniques will allow you to write very complex menu systems. Failing to use these techniques can limit what you can accomplish. There is a term called "programming yourself into a corner" which refers to a program that is so poorly written, that it can't be modified to accommodate changes and improvements. The height of your programming abilities depends on the foundation on which they are built. You must avoid rushing to the top without first creating a firm foundation on which to build. Good technique is the foundation for good programming. You will have to learn it eventually, it is more efficient to do it right than it is to do it over. Adopting good programming habits reminds me of my favorite light bulb joke: Q. How many psychologists does it take to change a light bulb? A. Only one, but the light bulb has to want to change. Computer Tyme * MarxMenu * Users Manual Page #60 ----------------------------------------------------------------- FOR THE POWER USER: I originally wrote MarxMenu on a dare. I said that in one afternoon I could write a better menu system than one of the most popular menu systems. I met the challenge and then found that there is a lot of demand for power in a menu system. Friends started asking for this and that feature and this program has gone far beyond what I ever intended. The demand for more features has outpaced my ability to keep up with the documentation standards that I expect from other software packages that I buy. Please bear with me; If you find any errors in the manual, or bugs in the program, please let me know and we'll try to correct any problems. I also appreciate your suggestions for improvements. Many of the features included are a result of requests you have made. Many of you are using this program in ways I never dreamed. The main design philosophy behind this product is POWER and Flexibility. I am also committed to keeping the source code as readable as possible. I am loyal to the concept of using NO RAM. None of MarxMenu stays resident. Because of this I can claim that if you are having some kind of problem, it's not the fault of MarxMenu being resident, because MarxMenu is not resident. Also, using NO RAM allows loading of TSR's (memory resident programs) from the menu. For computer consultants, MarxMenu is an excellent way to make money. You can provide your clients with professional looking menu systems customized (by you) to fit their needs. You can provide complex menu structures not possible with any other menu system. And, because MarxMenu uses NO RAM, you don't have to worry about conflicts between MarxMenu and any other software product. Although MarxMenu is copyrighted, the program is not copy protected. There is nothing to prevent you from making hot copies and giving them away to all your clients. I would like to point out that when you give away something you should be selling you lose respect from your clients and attract those who expect you to work for free. You will make more money if you play by the rules. My best and most profitable clients use no hot software whatsoever. Think about it. WHERE MARXMENU IS HEADING MarxMenu will continue to grow and develop. Because MarxMenu is an overlaid program I have the ability to add as many features as I want without slowing down load or processing speed. In fact MarxMenu is 10 times as fast today as it was in 1989 and its vocabulary of commands has grown 20 times as well. Computer Tyme * MarxMenu * Users Manual Page #61 ----------------------------------------------------------------- Most of the new features I add to MarxMenu are a result of your requests. Feel free to call me and make suggestions as to what you want to see in MarxMenu. Often my biggest problem in adding new features is getting companies to release information. Thus, if you want something new and I have to go to IBM, Novell, or Microsoft to get information sometimes it takes a while. So if you have any pull with some of these vendors and will help me put the squeeze on them, I'd appreciate it. I'm often asked the question, what other operating systems will I support? Will there be a Windows version? An OS/2 version? Unix? Let me say first that my primary commitment is to the OS that most people actually use, and that is DOS. I am not moved by the industry politics. I focus on the systems that make computers and networks actually work. So for those of you who are asking the question "Will there be a Windows version of MarxMenu?" The answer is no. The reason is, in my view, windows is too unstable a platform in which to develop code for. As I see it, Windows is a programmer angry environment and is fatally flawed by design. I consider this path a mistake and a mistake that I am not going to make. Will there be an OS/2 version? No. IBM made a lot of promises that they didn't keep. I lobbied hard to get IBM to add some features to OS/2 to allow DOS programs to control the OS/2 environment and talk to the OS/2 kernal. This would have allowed MarxMenu, as a DOS program to control OS/2 programs. The response was that IBM wants people to move away from DOS and refused to add the necessary features. The Borland compilers that were supposed to be ready when OS/2 was released don't exist. Will there be a Univell version? Maybe. If Novell doesn't make the same mistakes as IBM and Microsoft have and provide a migration path then maybe there will. A WORD TO WRITERS AND REVIEWERS MarxMenu is a multi-level product fulfilling the needs of a large variety of computer users. It is difficult to compare this product on a feature-to-feature basis. This is because MarxMenu has about 10 times as many features as any other menu system. These features allow this product to target a very broad variety of computer users, from the novice user, who will only use the LEVEL1 or QUICK menus, to large companies with hundreds of file servers controlled through the MarxMenu language. One common mistake that writers make when evaluating MarxMenu, is in the area of ease of use. If you are looking for ease of use, stick with the simple menus and the self-configuring menus such as the LEVEL1, QUICK and QUICKNOV examples. By looking at it this way, MarxMenu will be as easy to use as any other menu system out there and can be compared for similar features. Even though MarxMenu supports complex commands, it is not necessary to use them in simple menus. Computer Tyme * MarxMenu * Users Manual Page #62 ----------------------------------------------------------------- If you are doing a comparative review, please let us know on what basis you are making comparisons. This way we can assist you by providing you accurate information in the area of your interest. If you are looking for simple, we can show you simple; if you are looking for power, we can show you power. On the other hand, if you are reviewing power tools and network utilities, you might want to look at the Network Survival Kit and not just MarxMenu. So if you only have a copy of MarxMenu, give us a call and we will get you the latest and greatest. In addition to our software, we also have color prints and color slides available as well as product literature and sample reviews. These are available to make your job easier and help you make those deadlines. MarxMenu tends to be best reviewed as a long article rather than a short one. It is very good if you have a lot of space to fill. With a long article, you can get really in depth with what MarxMenu is able to do. Any publication which reviews any of my products gets a site license to that product whether we like the review or not. Our position is that if you are using MarxMenu yourself, you will get to know it better. Any questions you have about any of my products, feel free to call. The main thing we ask is that you get the product name, price, our address, and our phone number right. SECURITY ISSUES Different users have different security needs that range from none to extreme. If you are in the none category, then you can skip this chapter. But if you need all the security you can get, then read on. First of all, DOS is not a secure operating system. There are various third party programs out there but what I'm going to cover here is how to make DOS secure as possible working with what you get with DOS. The first thing to do is add the command BREAK=OFF to your CONFIG.SYS file. This prevents programs from breaking out of batch files. Avoid using commands that are internal DOS commands like DIR from inside a menu or inside batch files. Use the D.EXE program instead. Use the LockWord option in the screen blanker so that if a menu is left unattended, it will not be accessible to just anyone walking up to a machine. The LockWord command requires the user type a password to release the screen blanker. If you are on a Novell network, you can use the UseNovPassword command. This forces the user to type their Novell password to unblank the screen. Computer Tyme * MarxMenu * Users Manual Page #63 ----------------------------------------------------------------- If a menu choice accesses sensitive materials, then put a password on it. Also, make sure the SUPERVISOR user has a password. There are many times I've walked up to a server and logged in as supervisor and got right in. Make sure that intruder detection is set on. If you don't know what intruder detection is, read the Novell manuals. You can also use the LogoffTime command to log users off the network after a given amount of inactivity. This also helps kick people off so that you can upgrade MarxMenu from time-to-time. (MARXMENU.OVR can't be updated on a network unless all users are out of the menu.) If you have applications that allow you to shell to DOS, you can prevent them from getting to DOS by changing your COMSPEC to point to something other than COMMAND.COM. You could also rename COMMAND.COM in case a program is looking for this file by name. If this doesn't work for you then you can use the COMSP.EXE program to do the same thing. Another defense is to lock the door to the computer room at night and teach employees security policies and make sure they use them. Security policies include such rules as not having your password written on a stick-em note stuck on the side of your monitor. If you are on a network, buy diskless workstations. People can't copy files on or off a workstation that doesn't have a disk drive. It helps keep viruses off your server and lets the network administrators control what is and isn't on the network. KEEPING USERS IN THE MENU Some people need to keep users in the menu and prevent them from escaping to a command line no matter what. There are several things you need to do to accomplish this. The first thing is to use BREAK.SYS to prevent breaking out of batch files. Then you use a shell statement to load COMMAND.COM temporary instead of permanent. Then you use COMSP.EXE to prevent programs from shelling out to DOS. USING BREAK.SYS MarxMenu comes with a device driver called BREAK.SYS. This program enhances the BREAK ON and BREAK OFF functions of DOS to prevent users from using CTRL-C to get out of batch files. Unlike all the other similar programs this one is smart. It only kills CTRL-C if you are in COMMAND.COM but allows your applications to see CTRL-C. And, it only uses about 400 bytes of RAM. All you have to do is add a line to your CONFIG.SYS file: Computer Tyme * MarxMenu * Users Manual Page #64 ----------------------------------------------------------------- DEVICE=BREAK.SYS If you are using BREAK.SYS with QEMM or other memory manager, load the memory manager first. BREAK.SYS can be enabled or disabled by using the BREAK ON and BREAK OFF commands either from the command line or from batch files. Although BREAK.SYS is better than DOS, it isn't perfect. There are still situations where you can break out of batch files. If it is important not to break out then you can use it as follows: DEVICE=BREAK.SYS /C Using it this way the CTRL-C key is completely disabled. Your application software will not get any CTRL-C. BREAK.SYS has another switch /T that works like /C except that once you execute BREAK ON then it returns to smart CTRL-C handling. The idea here is that more often you need bullet proof protection while the system is booting up, but after going to the main menu you can switch to smart protection. At the end of your bootup batch files add the lines: BREAK ON BREAK OFF This will switch BREAK.SYS into smart mode checking. BREAK.SYS has another feature that makes BREAK ON work better. If you use it like this: DEVICE=BREAK.SYS /B Then when you run BREAK ON and the users presses CTRL-\ it will break you out of programs you might otherwise be stuck in. This feature is great for software developers to use when testing code. USING THE SHELL= COMMAND If you really want to make it impossible to break out to DOS then change the SHELL= statement in your CONFIG.SYS file to read: SHELL=COMMAND.COM /E:400 /C AUTOEXEC.BAT With this command, if they get out of the batch file it locks the system up. In some cases this is better than letting the user get access to the command line. Computer Tyme * MarxMenu * Users Manual Page #65 ----------------------------------------------------------------- To use this feature you need to stay in a steady stream of batch files all the way to the menu. If you ever exit or break out of the batch files the system locks up. Without the /P switch, COMMAND.COM is never loaded permanent. So if AUTOEXEC and the batch file that they jump to ever finishes the computer locks up. You can't break out to COMMAND.COM because there is no COMMAND.COM to break out to. If you try to use this with Novell's LOGIN.EXE then you won't be able to use the 'EXIT ' command in your login script. This is because EXIT will exit to DOS and lock up. You will need to create a LOG.BAT file as follows: LOG.BAT ======= :Start LOGIN REM ** Stay in loop till LOGIN succeeds ** if ErrorLevel 1 goto Start ... ... Marx MainMenu To get to a command line using this system you will need to run COMMAND.COM or DOLIST.EXE from the menu. In the case of COMMAND.COM you will run: COMMAND.COM /E:400 This ensures that this second COMMAND.COM has enough environment space to allow for SET commands. CONDITIONAL STATEMENTS MarxMenu has a full complement of conditional statements. They are as follows: IF->ELSE->ENDIF IF [condition] statement statement ELSE statement statement ENDIF IF->THEN Computer Tyme * MarxMenu * Users Manual Page #66 ----------------------------------------------------------------- IF [condition] THEN statement IF->THEN->ELSE IF [condition] THEN statement ELSE statement IF->ELSEIF->ENDIF IF [condition] statement statement ELSEIF [condition] statement statement ELSEIF [condition] statement statement ELSE statement statement ENDIF REPEAT->UNTIL REPEAT statement statement UNTIL [condition] REPEAT statement UNTIL [condition] REPEAT statement UNTIL [condition] WHILE->ENDWHILE WHILE [condition] statement statement ENDWHILE PROCEDURE->ENDPROC PROCEDURE (name) statement statement ENDPROC Computer Tyme * MarxMenu * Users Manual Page #67 ----------------------------------------------------------------- LOOP->ENDLOOP LOOP (number) statement statement ENDLOOP ENVIRONMENT VARIABLES USED BY MARXMENU MarxMenu uses a variety of environment variables to control various MarxMenu functions. Many of these variables are optional. Set MouseX=(Number) Sets the horizontal sensitivity of the mouse. Default is 15. Set MouseY=(Number) Sets the vertical sensitivity of the mouse. Default is 25. Set MxEcho=(On/Off) If you set the first line of MARX.BAT to @ECHO %MXECHO% then by setting the environment variable MxEcho to ON or OFF, you can control the echo in the MARX.BAT file without having to edit it. This allows you to do diagnostics on a network without messing up other users. Set Temp=(Directory) Normally, MarxMenu creates temporary batch files in the same directory as MARXMENU.EXE. If you set TEMP to a directory, MarxMenu will use this directory instead. This complies with Windows / DOS 5.0 standards. Set MxCmd=(Command) MarxMenu uses MXCMD to control what the MARX.BAT file executes. You must have enough environment space available for MarxMenu to use. Set KSV= MarxMenu stores a series of keystrokes in the KSV variable when SavePosition is On. Set STATION=(Number) If you are on a network that is not Novell, then you should set this variable to a unique number for each station between 0 and 255. Computer Tyme * MarxMenu * Users Manual Page #68 ----------------------------------------------------------------- Set TASK=(Number) If you are running a multi-tasking operating system other than DesqView, and MarxMenu is running more than one task, then set an environment variable TASK to a unique number for each task. MarxMenu also accesses your COMSPEC variable and your PATH variable when executing programs. MARXMENU DATABASE FUNCTIONS Well, after talking about it for years, MarxMenu now includes a strong set of database tools. The database is based on Novell's Btrieve interface. Thus it has the reliability of proven database technology. We are pushing Btrieve to the limit and then some in order to get the requirements needed from a database engine. Btrieve is primarily a fixed length database engine with the ability to add a single variable-length field on the end of a record. When using MarxMenu with Btrieve, we typically store MarxMenu-style variables in the variable-length section and reserve the fixed-length section for key fields only. While we recommend you consider this approach you are free to develop and use any data models you prefer. You will notice several unusual things about MarxMenu as a database. We decided that the square model or relationally-linked square model is to limiting. You can do square model databases if you want to, but the experience of getting rid of the square model is like an animal being let out of a cage for the first time. It's a little scary at first. When you create a MarxMenu Btrieve database you may define all your fields, if you want, but you are only required to define the fields that will be used as key fields. You will need to define the fields type, and for key fields the key properties. When data is written to a file the data is passed as a MarxMenu array. The first elements of the array have to match the fixed portion of your structure, normally your key fields. Any elements after the key fields are written in MarxMenu format to the variable-length section of the record. Thus, after the key fields you can do whatever you want. Here is a list of some of the flexible features. 1) Records do not have to contain the same fields or the same number of fields. You can have 20 fields in one record and 5 fields in the next one. There are no rules that the data in one field of a record has to be of the same data type as the same field of the previous record. Computer Tyme * MarxMenu * Users Manual Page #69 ----------------------------------------------------------------- 2) Records can contain MarxMenu-style arrays. Thus if you are using a phone field as an array of phone numbers you can store as many phone numbers in that field as you want. MarxMenu can support arrays within arrays of up to 30 levels within a single record. 3) Since MarxMenu supports writing MarxMenu-style variable structures to database records, you need not have to specify the type of data, the data size, or the structure of the data before you access the file. If you want to write data you just do it. Use of the Btreive commands require that you have Btrieve 5.10 or later. You will need to have the Btrieve NLM running on the server and BRREQUEST.EXE running on the workstation to use this database in client-server mode, or BTRIEVE.EXE running on the workstation if you are not running in client-server mode. All the Btreive database commands start with the BTRV prefix. To use BTRIEVE.EXE load it with the /E switch as follows: BTRIEVE /E Only network versions of MarxMenu contain the BTRV database commands, the single user version is not equiped with this feature. At the time of printing of this manual the Btrieve database commands are new. For more details, new commands, and examples look in the MARXREAD.ME file and the MarxHelp program. ADDITIONAL INFORMATION MarxMenu is a growing product with additional features and enhancements being added all the time. Therefore, the manual will never be completely current. Whenever new features are added, the MARXREAD.ME file is updated to show you the new additions since the manual was printed. These changes are also added to the MarxHelp program so that the online help is always kept current with the released software. COMPUTER TYME ON COMPUSERVE The Computer Tyme Section of the Novell Vendor Forum is your window to the body of additional services available on Compuserve. Many services complement specific applications. Others add a new dimension to business endeavors. Still others cater to personal interests, from aviation to Zinfandel wines. Some of these services include: INVEST WISELY - Speed stock purchases and sales with convenient electronic brokerage services. View stock trends online, research investment possibilities, or transfer data from Compuserve for use in your favorite spreadsheet package. Computer Tyme * MarxMenu * Users Manual Page #70 ----------------------------------------------------------------- TAKE A TRIP - Compare airline schedules and fares on Compuserve. Find the least expensive flight or best time to fly. Book your tickets online, or pass information on to your travel agent. DO YOUR HOMEWORK - Turn hours of research into minutes online, with hundreds of national and international databases representing diverse specializations. Avoid lengthy library searches by pulling up abstracts and full articles directly online. BE INFORMED - Turn to Compuserve's online news service for daily news from the associated Press' national and international wires, United Press International's national and regional wires, The Washington Post, Reuters, and other reputable sources. The Executive News Service scans these wires for articles on topics you select, then clips and saves them for reading at your leisure. DON'T PASS THIS UP - As a Computer Tyme customer, you're entitled to a free Introductory Membership to Compuserve, including: 1) A FREE on month membership to access all of Compuserve's Basic Services. 2) A $15 introductory usage credit to explore the Computer Tyme Section of the Novell Vendor Forum and Compuserve's other Extended and Premium Service offerings. 3) A complimentary subscription to Compuserve Magazine, Compuserve's monthly computing magazine. For those of you who are using Novell networks, the best place to get Novell technical support is in the many forums that Novell provides on Compuserve. In fact, it has been my experience that the support on Compuserve is significantly better than what Novell provides directly. If you are a serious Novell user, you definitely need to be on Compuserve. That's where the real Novell support is. To start connecting with Computer Tyme, Novell, and other Compuserve members call 800-524-3388 and ask for representative #419. If you are already a Compuserve member, enter GO COMPTYME at any ! prompt. MARXMENU COMMANDS MarxMenu contains a rich set of commands. They are listed here alphabetically and by command category. You don't have to learn them all so don't let the size of the list scare you. In the following command list, words contained within ( ) are command parameters that must be included after the menu command. The numeric range for the parameter is 1 - 80 decimal, and for the parameter the range is 1 - 25, 43, or 50 decimal depending on how many lines your monitor displays. Computer Tyme * MarxMenu * Users Manual Page #71 ----------------------------------------------------------------- #Define (Name) MarxMenu supports conditional compilation. This allows you to hide or unhide sections of code from MarxComp based on defining key control words using the #Define command. Defining a name sets it to true and this lets you control what code the MarxMenu compiler sees when it is compiling your menu. Multiple names can be defined on one line. By using #If, #Else, and #Endif, MarxMenu lets you control the code the compiler produces. Unlike If, Else, and Endif, these new commands are evaluated at compile time rather than run time. Thus, it allows you to produce smaller and faster runtime code. Example: #Define A B #If A #Define C #If B Writeln 1 #Else Writeln 2 #Endif #Else #If B Writeln 3 #Else Writeln 4 #Endif #Endif #If C Writeln 'C' #Endif The #Define command supports referrences to environment variables. This allows you to control what is compiled based on the environment variables you have set. That way you can, for example, compile different code based on what fileserver you are on. This allows you to compile smaller and faster menus. Suppose you have and environment variable set for the file server name SERVER=BOSTON: Example: #Define %Server% #If Boston ... #Endif Computer Tyme * MarxMenu * Users Manual Page #72 ----------------------------------------------------------------- If the environment variable is set to a value that contains multiple words separated by spaces, then all the words will be defined. Example: SET USERS=TOM DICK HARRY Your menu contains: #Define %Users% This causes TOM, DICK, and HARRY to be defined. See Also: #If Category: Conditional #If (Define) If the name is defined, all code between #If and #Else is compiled. Otherwise, all code between #Else and #Endif is compiled. If there is no #Else, then all code between #If and #Endif is compiled if the name is defined. Otherwise, no code is compiled. #If can be used with multiple names. Example: #If Marx Tyme #If Marx or Tyme #If Marx and Tyme #If Marx and not Tyme If more that one name is used, the result is true if either name is defined. In other words, OR is assumed. MarxMenu supports AND, OR and NOT in #If statements. See Also: #Define Category: Conditional #Else See Also: #Define #If Category: Conditional #Endif See Also: #Define #If Category: Conditional Computer Tyme * MarxMenu * Users Manual Page #73 ----------------------------------------------------------------- | (Vertical Bar) Forces MarxMenu interpretation under an OnKey Command. If not for the | (Vertical Bar), the command under an OnKey would be written to a batch file. The | is only used under OnKey commands. Example: OnKey 'S' |password 'hello' 3 4 ECHO Type EXIT to return to menu COMMAND.COM OnKey 'X' |if UpperCase(ReadEnv('USERNAME')) = 'SUPERVISOR' SYSCON |else | SecurityBreach('You do not have access to this function!') |endIf Category: Misc ( : Operator Starts logical interpreter grouping. Used to force evaluation of an expression other than the normal left to right order. Example: 2 * 3 + 2 evaluates to 8 2 * ( 3 + 2 ) evaluates to 10 See Also: ) Category: Misc ) : Operator Ends logical interpreter grouping. See Also: ( Category: Misc Computer Tyme * MarxMenu * Users Manual Page #74 ----------------------------------------------------------------- * : Operator Multiplies two numbers. Example: 4 * 6 ;returns 24 Category: Math Float + : Operator Adds two numbers or two strings. Example: "Hello" + " " + "World" ;returns "Hello World" 2 + 2 ;returns 4 The plus operator can also used to concatinate arrays or concatinate values to arrays. Example: X[1] = 1 X[2] = 2 Y[1] = 3 Y[2] = 4 Z = X + Y ;returns an array containing [1,2,3,4] Z = X + "A" ;returns an array containing [1,2,'A'] Z = "A" + X ;returns an array containing ['A',1,2] Category: Math String Float Array - : Operator Subtracts two numbers. Example: 7 - 4 ;returns 3 Category: Math Float / : Operator Divides two numbers. Example: 6 / 3 ;returns 2 Computer Tyme * MarxMenu * Users Manual Page #75 ----------------------------------------------------------------- Category: Math Float < : Operator Less Than - Compares two numbers or strings. Example: 3 < 4 = True 'AB' < 'CD' ;returns True Category: Math String Float <= : Operator Less Than or Equal - Compares two numbers or strings. Example: 3 <= 4 = True 'AB' <= 'CD' ;returns True Category: Math String Float <> : Operator Not Equal - Compares two numbers or strings. Example: 3 <> 4 = True 'AB' <> 'CD' ;returns True Category: Math String Float = : Operator Equal - Compares two numbers or strings. Example: 3 = 4 = False 'AB' - 'CD' ;returns False Category: Math String Float > : Operator Greater Than - Compares two numbers or strings. Example: 3 > 4 = False 'AB' > 'CD' ;returns False Computer Tyme * MarxMenu * Users Manual Page #76 ----------------------------------------------------------------- Category: Math String Float >= : Operator Greater Than or Equal - Compares two numbers or strings. Example: 3 >= 4 = False 'AB' >= 'CD' ;returns False Category: Math String Float Abs : Number Returns the absolute value of a number. The absolute value is the value of the number without the sign. Example: Abs(-6) ;returns 6 Category: Math Float Actual If you want to read or write to a variable directly that is referencing another variable I have provided the command Actual. Actual overrides any pointers set by the command Loc. Example: Dispose Actual B Actual B = 5 See Also: Loc Category: Variable AllowAbort (On/Off) MarxMenu was written to allow processes to be aborted and in a very smooth way eliminating the need for the user to deal with complicated error logic. In some cases this has gotten in the way of specific control when the user presses the escape key or other error occurs. If AllowAbort is set to Off, MarxMenu will continue on to the next command. You can then test LastKey to see if the escape key was pressed. If the user presses escape a nul string is returned. See Also: AllowEsc Computer Tyme * MarxMenu * Users Manual Page #77 ----------------------------------------------------------------- Category: Misc AllowEsc (On/Off) Several MarxMenu commands such as PickOne, PickMany and PickFile allow you to press escape to abort. If you turn AllowEsc Off then the escape key is ignored. This forces the user to make a choice. See Also: AllowAbort Category: Misc AmPm : Boolean When AmPm is set true the TimeString function returns AmPm time format. Example: AmPm On Writeln TimeString(Now) ; returns 10:13:34 am Category: Time String And : Operator Returns logical And if operators are boolean; or bitwise And if operators are numeric. Example: if (Month = Dec) and (Day = 25) then Writeln 'Merry Christmas!' 7 and 3 = 3 ;0111 and 0011 Note: The parentheses are necessary because MarxMenu interprets from right to left. See Also: Or Xor Not Category: Math Boolean AnsiInstalled : Boolean AnsiInstalled returns True if the ANSI device driver is installed. Category: System Computer Tyme * MarxMenu * Users Manual Page #78 ----------------------------------------------------------------- AnsiWindows (On,Off) If AnsiWindow is set to On, MarxMenu interprets Ansi escape codes in a window. See Also : VT100mode Category : Display, Modem AppendArray (Array,Value) AppendArray appends Value to the end of an array. The number of elements is increased by one. It is not used to append two arrays "end to end". Example: var X X[1] = 'TEST1' AppendArray(X,'TEST2') Loop X Writeln LoopVal EndLoop This Prints: TEST1 TEST2 Category: Array AppendInstalled : Boolean AppendInstalled returns True if the dos program APPEND is installed. Category: System ApplicationMemory : Number Returns the number of bytes of memory available to an application when MarxMenu exits out to the MARX.BAT file. This is the actual amount of RAM available to your application. See Also: FreeMemory Category: Memory Computer Tyme * MarxMenu * Users Manual Page #79 ----------------------------------------------------------------- ArcTan (Radians) : Real Returns the ArcTangent of a real. Category: Math Float ArrayInsert (Array,Position,Count) ArrayInsert inserts space in Array at location Position for Count locations. Example: var A Loop 5 A[LoopIndex] = LoopIndex EndLoop ArrayInsert(A,3,1) A[3] = 10 Array A will be [1 2 10 3 4 5] Category: Array AssignInstalled : Boolean AssignInstalled returns True if the dos program ASSIGN is installed. Category: System AssignList (2D Array) AssignList reads the network assign list table and return a 2 dimensional array containing the local names and the network names. Example: var X AssignList (X) Loop X Writeln LoopVal[1] '=' LoopVal[2] EndLoop See Also: CancelListEntry MakeListEntry Category: Novell MSNet Vines Computer Tyme * MarxMenu * Users Manual Page #80 ----------------------------------------------------------------- BadDate : Boolean Set to true if you try to convert a string to a date and the date is invalid. Example: TimeOf('02-30-92') ;Sets BadDate to True See Also: TimeOf Category: Time Bat (String) Bat is used to write a line to the batch file the same way that lines under OnKey commands do. All the same rules apply. The batch file is created and executed when the menu exits. Thus if Bat commands are intermixed with other MarxMenu commands the other MarxMenu command are executed first. The Bat command actually only puts the command in a buffer for later execution. Bat statements give you more control over what MarxMenu executes and allow you to include the contents of MarxMenu variables in your batch files or use complex formulas to create batch file lines. When using Bat under an OnKey statement, be sure to use the vertical bar in front of it. Bat gives you more control over what is sent to the batch file that MARX.BAT executes. Example: OnKey 'D' CLS |BAT "DIR " HomeDirectory '\' UserName PAUSE See Also: OnKey Category: Execution BatFileName : String Returns the name of the batch file that MarxMenu would create if MarxMenu were to create a batch file automatically. Category: String Computer Tyme * MarxMenu * Users Manual Page #81 ----------------------------------------------------------------- BigShadow Selects big shadow type. This is the default shadow. See Also: SmallShadow ShadowPosition ShadowColor Category: Display BinString (Number, Length) : String BinString converts a number into a base 2 binary string. If Length > 0 then the number will have enough leading zeros to make it Length long. If Length = 0 then leading zeros are removed. Length must be 32 or less. Example: Writeln BinString(45,8) ;returns 00101101 Writeln BinString(45,0) ;returns 101101 See Also: HexString Category: String BiosDate : String Returns the date of the rom Bios. Category: System Blanked : Boolean Returns true if the screen blanker has kicked it. This lets you alter your idle program based on whether the screen blanker is active. See Also: IdleProgram Category: Display BlankMessage (String) When the screen blanks out, this one line message is displayed. If BlankMessage is not set, the date and time will be displayed. Example: BlankMessage = 'Out to Lunch!' See Also: ConsolePos Category: String Computer Tyme * MarxMenu * Users Manual Page #82 ----------------------------------------------------------------- BlankScreenProgram : Procedure This allows you to specify a custom procedure to have executed in place of the MarxMenu internal screen blanker. It also overrides the IdleProgram so if you are running something in your idle program that you want to continue to run when the screen goes blank, call your idle procedure from the screen blanker procedure. If you exit your screen blanker and MarxMenu thinks the screen should still be blank it will call it again. You can set UnBlank to True in your screen blanking program to override this and unblank the screen. When MarxMenu determines it's time to activate the screen blanker, it first blanks the screen then calls the BlankScreenProgram. When MarxMenu decides it's ready to unblank the screen it sets UnBlank to true. When your BlankScreenProgram procedure is finished, MarxMenu will restore your screen to it's original condition upon exit. Commands like UseNovPassword, LockWord, and BlankTime will work with your screen blanker. To set up a blank screen program: BlankScreenProgram = Loc Procedure Example: BlankScreenProgram = Loc RunWorm To switch back to normal screen blanking run: Dispose(ScreenBlankProgram) For an example of a blank screen look at WORM.INC. The BlankScreenProgram can be used to run an external program to blank the screen. So if you have some slick fractal program that you like MarxMenu will run it. Here's how you would set it up. BlankScreenProgram = Loc BlankProg Procedure BlankProg Execute 'FRACTAL.EXE' UnBlank = True EndProc See Also: IdleProgram UnBlank Category: Display Computer Tyme * MarxMenu * Users Manual Page #83 ----------------------------------------------------------------- BlankTime (Minutes) Sets the number of minutes before the screen blanks out to prevent screen burn. Since this is not a resident program, screen blanking is only active while the menu system is active. Setting BlankTime to 0 prevents screen blanking. Example: BlankTime = 10 ;set to 10 minutes BlankTime = 0 ;disables screen blanking Writeln BlankTime " Minutes of inactivity will cause screen blanking." Category: Display Blink : Boolean Blink is a boolean variable that when set to true allows you to specify colors that will blink. To make a color that blinks, set the background color to a bright color. A bright color is a color from 8 to 15. Normally, when Blink is off, MarxMenu strips the high bit of the colors. When Blink is on, high bit stripping is disabled. Example: Blink TextColor Green LRed Because the background color is light red, the text will blink. Warning: Blinking characters can cause headaches and eye strain. I resisted adding this feature for a long time because I personally hate excessive blinking characters on the screen. I now recognize that blinking can be very effective when used correctly. Please use blinking sparingly. Category: Color BlockBox Selects menu borders to have a block type edge. See Also: SingleLineBox DoubleLineBox CustomBox NoBoxBorder Example: BoxBordercolor yellow black BoxInsideColor White Black BlockBox ;<- Set Border Type to Block Style DrawBox 10 10 60 10 Computer Tyme * MarxMenu * Users Manual Page #84 ----------------------------------------------------------------- Category: Display BootDrive : String Returns the drive letter of the boot drive. This command only works with DOS 4+, on all other versions of DOS it returns a null string. On diskless workstations the BootDrive will be A. Category: File BoxBorderColor (Foreground,Background) Sets colors for box border. Example: BoxBordercolor LRed black ;<- Set Border Colors to LRed/Black BoxInsideColor White Black BlockBox DrawBox 10 10 60 10 Category: Color BoxFooter (String) There are three possible box footer strings. This command sets the center footer message for the next box displayed. This command must be used before the DrawBox command. Example: BoxHeader ' Center Box Header String ' BoxFooter ' Box Footer String ' ;<-- Set Center Footer String BoxBordercolor LRed Black BoxInsideColor White Black BoxHeaderColor Ye9llow Black DrawBox 5,6,70,9 See Also: BoxHeader BoxHeaderLeft BoxHeaderRight See Also: BoxFooterLeft BoxFooterRight Category: Display BoxFooterLeft (String) There are three possible box footer strings. This command sets the Left Footer message for the next box displayed. This command must be used before the DrawBox command. Example: BoxFooter ' Center Footer String ' BoxFooterLeft ' Left Footer String ' ;<-- Set Left Footer String BoxFooterRight ' Right Footer String ' BoxBordercolor LRed Black BoxInsideColor White Black BoxHeaderColor Yellow Black DrawBox 5,6,70,9 Computer Tyme * MarxMenu * Users Manual Page #85 ----------------------------------------------------------------- See Also: BoxHeader BoxHeaderLeft BoxHeaderRight See Also: BoxFooter BoxFooterRight Category: Display BoxFooterRight (String) There are three possible box footer strings. This command sets the Right Footer message for the next box displayed. This command must be used before the DrawBox command. Example: BoxFooter ' Center Footer String ' BoxFooterLeft ' Left Footer String ' BoxFooterRight ' Right Footer String ' ;<-- Set Right Footer String BoxHeaderColor Yellow Black BoxBordercolor LRed Black BoxInsideColor White Black DrawBox 5,6,70,9 See Also: BoxHeader BoxHeaderLeft BoxHeaderRight See Also: BoxFooter BoxFooterLeft Category: Display BoxHeader (String) There are three possible box header strings. This command sets the center header message for the next box displayed. This command must be used before the DrawBox command. Example: BoxHeader ' Center BoxHeader String ' ;<- Sets the Box Header String BoxBordercolor LRed Black BoxInsideColor White Black BlockBox DrawBox 5,6,70,9 See Also: BoxHeaderLeft BoxHeaderRight See Also: BoxFooter BoxFooterLeft BoxFooterRight Category: Display Computer Tyme * MarxMenu * Users Manual Page #86 ----------------------------------------------------------------- BoxHeaderColor (Foreground,Background) There are three possible box header strings. This command sets colors for all the box headers and box footers strings. Example: BoxHeader ' Center Box Header String ' BoxFooter ' Box Footer String ' BoxBordercolor LRed Black BoxInsideColor White Black BoxHeaderColor Yellow Black ;<-- Set Box Header/Footer Colors DrawBox 5,6,70,9 Category: Color BoxHeaderLeft (String) There are three possible box header strings. This command sets the left header message for the next box displayed. This command must be used before the DrawBox command. Example: BoxHeaderLeft ' Left Header String ' ;<- Set Left Header String BoxBordercolor LRed Black BoxInsideColor White Black BoxHeaderColor Yellow Black DrawBox 5,6,70,9 See Also: BoxHeader BoxHeaderRight See Also: BoxFooter BoxFooterLeft BoxFooterRight Category: Display BoxHeaderRight (String) There are three possible box header strings. This command sets the right header message for the next box displayed. This command must be used before the DrawBox command. Example: BoxHeaderRight 'Right Header String ';<- Set Right Header String BoxBordercolor LRed Black BoxInsideColor White Black BoxHeaderColor Yellow Black DrawBox 5,6,70,9 See Also: BoxHeader BoxHeaderLeft See Also: BoxFooter BoxFooterLeft BoxFooterRight Computer Tyme * MarxMenu * Users Manual Page #87 ----------------------------------------------------------------- Category: Display BoxInsideColor (Foreground,Background) This command sets the colors for the interior of a box. Example: BoxBordercolor LRed Black BoxInsideColor White Black ;<- Set Inside Colors to White on Black DrawBox 5,6,70,9 Category: Color Break (On/Off) Turns DOS break checking On and Off the same way that it does from batch files. Category: System BrightBackground (On/Off) This command switches between bright background modes and blink modes. This doubles the number of colors that MarxMenu can produce. This command affects the video controller directly. Thus, it may not work on all computers especially if you are running something weird. Once this is set in MarxMenu it stays set. So if you run another program that has blink in it, it will use 16 background colors instead. The solution is to set BrightBackground Off right before you run a program that requires blinking. Example: OnKey 'X' |BrightBackground Off PROCOMM Warning! This program uses a trick that may not be compatible with some TSR programs. If you can get away with it, fine. But, if you have problems where TSR's cause your screen to blink, then don't use this command. Category: Video Computer Tyme * MarxMenu * Users Manual Page #88 ----------------------------------------------------------------- BtrvAbortTransaction BtrvAbortTransaction is used to abort all changes to the file that have occurred since the BtrvBeginTransaction was executed. See Also: BtrvBeginTransaction BtrvEndTransaction Category: Btrieve BtrvBeginTransaction Betrieve supports a concept called transaction tracking. With transaction tracking you can use the BtrvBeginTransaction command to set a file condition flag marking the start of a file process. Should the file process be interrupted before the end of the process the files will be restored to the original condition they were in prior to the BtrvBeginTransaction. Result Codes: 37 - Transaction is Active See Also: BtrvAbortTransaction BtrvEndTransaction Category: Btrieve BtrvClearOwner (Handle) BtrvClearOwner clears the owner and allows normal access to the file. Example: BtrvClearOwner (Handle) See Also: BtrvSetOwner Category: Btrieve BtrvClose (Handle) BtrvClose closes the file. The parameter `Handle' is the file handle returned from BtrvOpen. Example: BtrvClose (Handle) See Also: BtrvOpen Category: Btrieve Computer Tyme * MarxMenu * Users Manual Page #89 ----------------------------------------------------------------- BtrvCreate (FileName,Fields) BtrvCreate is the most complicated Btrieve call. It defines the creation of the Btrieve database. The fields parameter is a two dimensional MarxMenu array that describes the fields in the file. It is designed to support either standard Btrieve fixed-length fields or MarxMenu key fields. Using MarxMenu fields is the easiest because you only have to define the key fields. Non-key fields do not have to be predefined. The easiest way to define these fields is to create a comma delimited text file and use ReadAscTextFile('FIELDS.TXT',Fields). This will create the array needed by BtrvCreate. The text file might look as follows: Name,String,35,Key,DUP,MOD,UPPER,DEC CustomerNumber,Auto,Key From,String,35 Password,String,15 Access,Num Flags,String,10 FirstDate,Date LastDate,Date Calls,Num CallTime,Time Phone,String,15 Example: Var Fields, FieldHandle ReadAscTextFile('FIELDS.TXT',Fields) BtrvCreate('BBSUSER.BTD',Fields) FileHandle = BtrvOpen('BBSUSER.BTD',Fields) The above example creates a conventional fixed-length database with one key field, the "name" field. Each line in the definition file defines a new field. Each line has at least two parameters. The first parameter is the field name. It is followed by the field type. There are five legal field types. They are: String - Contains alphanumeric strings. String fields have a required third parameter, the maximum length of the string. In the above example the "Name" and "From" fields both have max lengths of 35 characters. Num - Integer numeric fields. This field type supports storing integer numbers. Date - Dates fields. The DOS country code is automatically supported to establish date format. If not specified, the default format is "MM/DD/YY". Computer Tyme * MarxMenu * Users Manual Page #90 ----------------------------------------------------------------- Time - Time fields. This command also reads the DOS country code to establish the proper format. Otherwise default is "HH:MM:SS". Auto - Auto increment field. This field is a numeric field that is filled in by Btrieve. If you pass a zero value, Btrieve will fill it in automatically with sequential unique numbers. The first record being one, the second record being two, etc. If records are deleted the numbers are not reused. If you pass a non-zero value that does not match any other record, Btrieve will accept that value. This feature can be used to provide unique record numbers. USING KEY FIELDS Key fields are fields that are have internal lookup indexs automatically defined and maintained by the Btrieve system. If you want to use the indexed lookup `BtrvGet_____' series of commands then the field you reference must be a key field. You define a key field by adding the parameter "KEY" as the third parameter on the field definition line. When specifying a field as a key field you have four optional configuration parameters as seen in the previous example. They are: DUP - {Duplicates} This permits the field to have duplicate values in multiple records. If this parameter is not specified then no two records may have the same value in the affected field. In reality, you will almost always specify this parameter when defining a key field. MOD - {Modifiable} This allows existing existing field records to be modified. If this parameter is not specified then once a record is written, the affected field is set in stone and changes are not permitted. UPPER- {UpperCase Only} Used in cunjunction with string fields only, this will force all text information to be sorted as UPPERCASE. This feature requires Btrieve 6.0 or later. DEC - {Descending Order} This caused the key stored in the affected field to be maintained in reverse order. USING MARXMENU STYLE DATABASE If you wanted to use a MarxMenu-style database then only the first two lines of the above example need be in the file. This would create a file with two fixed-length key fields and put the rest of the fields in the variable-length section. Using the MarxMenu style you can pass anything you want for the rest of the fields. Computer Tyme * MarxMenu * Users Manual Page #91 ----------------------------------------------------------------- Name,String,35,Key,DUP,MOD,UPPER,DEC CustomerNumber,Auto,Key -------------------------------------- |Name|CustomerNumber|All Other Fields| -------------------------------------- ^ ^ ^ | | | Fixed Length --+----+ +--- Variable Length In a MarxMenu-style database, you pass data to and from the file using MarxMenu-style array variables. The first fields of the array must match the key fields. But the rest of the fields can be anything you want. They can be multidimensional arrays. The fields do not have to be the same from one record to the next. Record number one can have five fields, where record number two can have twenty. After the key fields you can do anything you want. Result Codes: 18 - Disk Full Category: Btrieve BtrvDelete (Handle) BtrvDelete deletes a record from a data file at the location of the last data read from the file. Example: BtrvGetEqual(DataVar,'MARC PERKEL',1,Handle) BtrvDelete(Handle) See Also: BtrvInsert Category: Btrieve BtrvEndTransaction BtrvEndTransaction is used at the end of a transaction tracking process. This command updates the files with all the data to be written. Refer to the BtrvBeginTransaction command for additional information. See Also: BtrvAbortTransaction BtrvBeginTransaction Category: Btrieve Computer Tyme * MarxMenu * Users Manual Page #92 ----------------------------------------------------------------- BtrvGetEqual (DataVar,Value,Key,Handle) BtrvGetEqual goes to the previous record of the file based on the key number that you pass and reads the record matching Value into DataVar. The type of value passed has to match the type of data for which the key is defined. If the key is a string then Value is a string. If BtrvResult is zero, the data was found. If BtrvGetNext is called after this, the next sequential record based on the key is read. Example: BtrvGetEqual(DataVar,'MARC PERKEL',1,Handle) Result Codes: 4 - Key Value not Found 6 - Invalid Key Number See Also: BtrvGetLess BtrvGetLessOrEqu BtrvGetGreater See Also: BtrvGetGreaterOrEqu Category: Btrieve BtrvGetFirst (DataVar,Key,Handle) BtrvGetFirst goes to the first record of the file based on the key number that you pass and reads the record into DataVar. This allows you to access that database in the sorted order of the key. DataVar is a MarxMenu variable and the data read creates an array of the fields stored on disk. Example: Var Fields, Handle, DataVar ReadAscTextFile('FIELDS.TXT',Fields) Handle = BtrvOpen('BBSUSER.BTD',Fields) BtrvGetFirst(DataVar,1,Handle) while BrtvResult = 0 loop DataVar Write LoopVal ' ' endloop Writeln BtrvGetNext(DataVar,1,Handle) EndWhile This example dumps the contents of a file to the screen. Result Codes: 6 - Invalid Key Number Computer Tyme * MarxMenu * Users Manual Page #93 ----------------------------------------------------------------- See Also: BtrvGetLast BtrvGetNext BtrvGetPrev Category: Btrieve BtrvGetGreater (DataVar,Value,Key,Handle) BtrvGetGreater goes to the next larger record of the file based on the key number that you pass and reads the record greater than Value into DataVar. The type of Value passed has to match the type of data for which the key is defined. If the key is a string then Value is a string. If BtrvResult is zero, the data was found. If BtrvGetPrev is called after this, the next sequential record based on the key is read. Example: BtrvGetLess(DataVar,'MARC PERKEL',1,Handle) Result Codes: 6 - Invalid Key Number See Also: BtrvGetEqual BtrvGetLess BtrvGetLessOrEqu See Also: BtrvGetGreaterOrEqu Category: Btrieve BtrvGetGreaterOrEqu (DataVar,Value,Key,Handle) BtrvGetGreaterOrEqu goes to the next larger or equal record of the file based on the key number that you pass and reads the record greater than or equal to Value into DataVar. The type of Value passed has to match the type of data for which the key is defined. If the key is a string then Value is a string. If BtrvResult is zero, the data was found. If BtrvGetPrev is called after this, the next sequential record based on the key is read. Example: BtrvGetLessOrEqu(DataVar,'MARC PERKEL',1,Handle) Result Codes: 6 - Invalid Key Number See Also: BtrvGetEqual BtrvGetLess BtrvGetLessOrEqu BtrvGetGreater Category: Btrieve Computer Tyme * MarxMenu * Users Manual Page #94 ----------------------------------------------------------------- BtrvGetLast (DataVar,Key,Handle) BtrvGetLast goes to the last record of the file based on the key number that you pass and reads the record into DataVar. This allows you to access that database in the sorted order of the key. DataVar is a MarxMenu variable and the data read creates an array of the fields stored on disk. Example: Var Fields, Handle, DataVar ReadAscTextFile('FIELDS.TXT',Fields) Handle = BtrvOpen('BBSUSER.BTD',Fields) BtrvGetLast(DataVar,1,Handle) while BrtvResult = 0 loop DataVar Write LoopVal ' ' endloop Writeln BtrvGetPrev(DataVar,1,Handle) EndWhile This example dumps the contents of a file to the screen backwards. Result Codes: 6 - Invalid Key Number See Also: BtrvGetFirst BtrvGetNext BtrvGetPrev Category: Btrieve BtrvGetLess (DataVar,Value,Key,Handle) BtrvGetLess goes to the next smaller record of the file based on the key number that you pass and reads the record less than Value into DataVar. The type of Value passed has to match the type of data for which the key is defined. If the key is a string then Value is a string. If BtrvResult is zero, the data was found. If BtrvGetPrev is called after this, the next sequential record based on the key is read. Example: BtrvGetLess(DataVar,'MARC PERKEL',1,Handle) Result Codes: 6 - Invalid Key Number See Also: BtrvGetEqual BtrvGetLessOrEqu BtrvGetGreater See Also: BtrvGetGreaterOrEqu Computer Tyme * MarxMenu * Users Manual Page #95 ----------------------------------------------------------------- Category: Btrieve BtrvGetLessOrEqu (DataVar,Value,Key,Handle) BtrvGetLessOrEqu goes to the next smaller or equal record of the file based on the key number that you pass and reads the record less than or equal to Value into DataVar. The type of Value passed has to match the type of data for which the key is defined. If the key is a string then Value is a string. If BtrvResult is zero, the data was found. If BtrvGetPrev is called after this, the next sequential record based on the key is read. Example: BtrvGetLessOrEqu(DataVar,'MARC PERKEL',1,Handle) Result Codes: 6 - Invalid Key Number See Also: BtrvGetEqual BtrvGetLess BtrvGetGreater BtrvGetGreaterOrEqu Category: Btrieve BtrvGetNext (DataVar,Key,Handle) BtrvGetNext goes to the next record of the file based on the key number that you pass and reads the record into DataVar. This allows you to access that database in the sorted order of the key. DataVar is a MarxMenu variable and the data read creates an array of the fields stored on disk. Result Codes: 6 - Invalid Key Number 7 - Different Key Number 9 - End of File See Also: BtrvGetFirst BtrvGetLast BtrvGetPrev Category: Btrieve BtrvGetPrev (DataVar,Key,Handle) BtrvGetPrev goes to the previous record of the file based on the key number that you pass and reads the record into DataVar. This allows you to access that database in the sorted order of the key. DataVar is a MarxMenu variable and the data read creates an array of the fields stored on disk. Result Codes: 6 - Invalid Key Number 7 - Different Key Number 9 - End of File Computer Tyme * MarxMenu * Users Manual Page #96 ----------------------------------------------------------------- See Also: BtrvGetFirst BtrvGetLast BtrvGetNext Category: Btrieve BtrvIndexes (Handle) : Number BtrvIndexes returns the number of key fields in a file. You must open the file and get a file handle first. Example: Writeln BtrvIndexes (Handle) Category: Btrieve BtrvInsert (DataVar,Handle) BtrvInsert adds a new record to the data file. The data is passed in the array DataVar. If key fields are used, or if you are using traditional style fixed-length fields, then the first elements of the array must match the data structure of the file you defined with BtrvCreate. All elements of the array after these fields are written to the variable-length part of the file. The variable-length part can contain MarxMenu multi-dimensional data structures. Example: BtrvInsert(DataVar,Handle) Result Codes: 5 - Duplicate Key 18 - Disk Full See Also: BtrvDelete Category: Btrieve BtrvOpen (FileName,Fields) : Handle BtrvOpen is used to open the file for access. Since Btrieve files do not store a list of fields you have to pass the same data structure you did when you created the file. If successful, BtrvOpen will return a file handle. This handle will be referenced by all other commands that access this file. Example: Var Fields, Handle ReadAscTextFile('FIELDS.TXT',Fields) Handle = BtrvOpen('BBSUSER.BTD',Fields) If BtrvResult<>0 WriteLn "Btrieve Error: " BtrvResult " While Opening File." EndIf Computer Tyme * MarxMenu * Users Manual Page #97 ----------------------------------------------------------------- Result Codes: 46 - Access Denied 85 - File Locked 86 - File Table Full 87 - Handle Table Full See Also: BtrvClose BtrvCreate Category: Btrieve BtrvPageSize (Handle) : Number BtrvPageSize returns the page size of in a file. You must open the file and get a file handle first. The page size is the amount of disk space allocated when a file is extended. Example: Writeln BtrvPageSize (Handle) Category: Btrieve BtrvRecLen (Handle) : Number BtrvRecLen returns the size of the fixed length part of in a file. You must open the file and get a file handle first. Example: Writeln BtrvRecLen (Handle) Category: Btrieve BtrvRecords (Handle) : Number BtrvRecords returns the number of records in a file. You must open the file and get a file handle first. Example: Var Fields, Handle ReadAscTextFile('FIELDS.TXT',Fields) Handle = BtrvOpen('CLIENTS.BTR',Fields) Writeln BtrvRecords (Handle) ;# of Records in CLIENTS.BTR Category: Btrieve Computer Tyme * MarxMenu * Users Manual Page #98 ----------------------------------------------------------------- BtrvReset BtrvReset is used to clear all transactions and close all files. It's a good idea to start your programs with this command to clear any locks that might be left out there from other programs that might have aborted. Example: var fields btrvreset ;Start with a clean slate! readasctextfile('db.txt',fields) ;Get field Definitions btrvcreate('phone.mb',fields) ;Create Btrieve File writeln btrvresult ;Check for ok Category: Btrieve BtrvResult : Number BtrvResult returns the result code from the last Btrieve call. A zero is considered a success. Example: Procedure BtrieveError If BtrvResult <> 0 Writeln 'Btrieve Error #',BtrvResult Writeln 'Exiting Program...' ExitMenu EndIf EndProc Result Codes: 4 - Key Value not Found 5 - Duplicate Key Value 6 - Invalid Key Number 7 - Different Key Number 9 - End of File 10 - Modifiable Key Value Error 11 - Invalid File Name 12 - File not Found 18 - Disk Full 20 - Btrieve not Loaded 28 - Record too Long 29 - Key too Long 30 - Not a Btrieve File 41 - Operation not Allowed 46 - File Access Denied 78 - Deadlock Detected 86 - File Table Full 87 - Handle Table Full 92 - Transaction Table Full Computer Tyme * MarxMenu * Users Manual Page #99 ----------------------------------------------------------------- For other codes use BtrvResultMessage to display the error. See Also: BtrvResultMessage Category: Btrieve BtrvResultMessage : String BtrvResultMessage automatically returns a string containing an error message based on the value BtrvResult. Example: Writeln BtrvResultMessage ;write Btreive Error Message See Also: BtrvResult Category: Btrieve BtrvSetOwner (Owner,Mode,Handle) BtrvSetOwner is really a set password function. It restricts access to the file unless you pass the owners name by setting BtrvOwner. The mode controls access and data encryption as follows: 0 : No Btreive access - File Not Encrypted 1 : Read Only access - File Not Encrypted 2 : No Btreive access - File Encrypted 3 : Read Only access - File Encrypted Example: BtrvSetOwner('NERD',3,Handle) Result Codes: 50 - Owner Already Set See Also: BtrvClearOwner Category: Btrieve BtrvStepFirst (DataVar,Handle) BtrvStepFirst goes to the first physical record of the file and reads the record into DataVar. DataVar is a MarxMenu variable and the data read creates an array of the fields stored on disk. Example: Var Fields, Handle, DataVar ReadAscTextFile('FIELDS.TXT',Fields) Handle = BtrvOpen('BBSUSER.BTD',Fields) Computer Tyme * MarxMenu * Users Manual Page #100 ----------------------------------------------------------------- BtrvStepFirst(DataVar,Handle) while BrtvResult = 0 loop DataVar Write LoopVal ' ' endloop Writeln BtrvStepNext(DataVar,Handle) EndWhile This example dumps the contents of a file to the screen. See Also: BtrvStepLast BtrvStepNext BtrvStepPrev Category: Btrieve BtrvStepLast (DataVar,Handle) BtrvStepLast goes to the last physical record of the file and reads the record into DataVar. DataVar is a MarxMenu variable and the data read creates an array of the fields stored on disk. Example: Var Fields, Handle, DataVar ReadAscTextFile('FIELDS.TXT',Fields) Handle = BtrvOpen('BBSUSER.BTD',Fields) BtrvStepLast(DataVar,Handle) while BrtvResult = 0 loop DataVar Write LoopVal ' ' endloop Writeln BtrvStepPrev(DataVar,Handle) EndWhile This example dumps the contents of a file to the screen backwards. See Also: BtrvStepFirst BtrvStepNext BtrvStepPrev Category: Btrieve BtrvStepNext (DataVar,Handle) BtrvStepNext goes to the next physical record of the file and reads the record into DataVar. DataVar is a MarxMenu variable and the data read creates an array of the fields stored on disk. This is normally used to work through a file when the search field in not a key field. Computer Tyme * MarxMenu * Users Manual Page #101 ----------------------------------------------------------------- Example: var fields,temp,handle,vararray readasctextfile('data.txt',fields) handle=btrvopen('phone.mxb',fields) while btrvresult=0 btrvstepnext(vararray,handle) ;<- Step to next file record writeln vararray[1] " " vararray[2] endwhile btrvclose(handle) Result Codes: 9 - End of File See Also: BtrvStepFirst BtrvStepLast BtrvStepPrev Category: Btrieve BtrvStepPrev (DataVar,Handle) BtrvStepPrev goes to the previous physical record of the file and reads the record into the variable DataVar. DataVar is a MarxMenu variable and the data read creates an array of the fields stored on disk. Result Codes: 9 - End of File See Also: BtrvStepFirst BtrvStepLast BtrvStepNext Category: Btrieve BtrvStop BtrvStop is used to unload BTRIEVE.EXE or BREQUEST.EXE from memory. You can load the requestor before running MarxMenu as a database and unload the requestor when you are finished. This reclaims the memory the requestor was using. Category: Btrieve BtrvUnusedPages (Handle) : Number BtrvUnusedPages returns the number of unused pages in a file. You must open the file and get a file handle first. Unused pages are created when data is deleted from a file. Example: Writeln BtrvPageSize (Handle) Computer Tyme * MarxMenu * Users Manual Page #102 ----------------------------------------------------------------- Category: Btrieve BtrvUpdate (DataVar,Handle) BtrvUpdate changes a record in the data file at the last location accessed with any command that reads a record. The data is passed in the array DataVar. If key fields are used, or if you are using traditional style fixed-length fields, then the first elements of the array must match the data structure of the file you defined with BtrvCreate. All elements of the array after these fields are written to the variable-length part of the file. The variable length part can contain MarxMenu multi-dimensional data structures. Example: BtrvGetEqual(DataVar,'MARC PERKEL',1,Handle) if BtrvResult = 0 DataVar[3] = 37 BtrvUpdate(DataVar,Handle) endif Result Codes: 5 - Duplicate Key 7 - Different Key 10 - Modifiable Key Value Error 80 - Conflict Category: Btrieve BtrvVersion : Number BtrvVersion returns a number representing the version number of Btrieve that you are using. A zero indicates that Btrieve is not installed. If Btrieve is installed then it returns 100 times the version number plus the minor version number. Version 6.0 becomes 600. Version 5.10 becomes 510. Example: if BtrieveVersion = 0 Writeln "Sorry, but Btrieve must be loaded first!" else Writeln "You are running Btrieve Version #: " BtrvVersion endif Category: Btrieve Computer Tyme * MarxMenu * Users Manual Page #103 ----------------------------------------------------------------- BuildPath (Array) The command BuildPath will build a PATH environment variable based upon the contents of a specified Array variable. The first element in the array becomes the first search path. Example: Var PathList Pathlist[1] = 'F:\PUBLIC' Pathlist[2] = 'F:\DOS' Pathlist[3] = 'F:\UTIL' BuildPath (PathList) ;sets PATH=F:\PUBLIC;F:\DOS;F:\UTIL See Also: SplitPath FixPath Category: String Array Environment CancelListEntry (Local Name) This will take an entry out of the network redirection list for either a print redirection or disk drive redirection. Example: CancelListEntry 'P:' ;cancels network drive mapping CancelListEntry 'LPT1' ;cancels printer redirection See Also: AssignList MakeListEntry Category: Novell MSNet Vines CapFirstChar (On/Off) When CapFirstChar is set to On the first character and all characters following a space are automatically capitalized during a Readln command. See Also: Readln Category: StringInput CapsColor (Foreground,Background) Setting CapsColor allows capital letters and numbers to be a different color than the rest of the text. This is used with the UseArrows command to show which character is the one that selects the options in the window. CapsColor is reset after any TextColor command, so be sure to use CapsColor AFTER TextColor commands. For this option the numbers 0 - 9 and some punctuation characters are considered capitals. Computer Tyme * MarxMenu * Users Manual Page #104 ----------------------------------------------------------------- Example: CapsColor White Blue See Also: DrawBox Category: Color CapsLock : Boolean This variable can be used to read the status of the KeyBoard Caps Lock indicator and to set the current caps lock mode. Example: if CapsLock then Write 'CapsLock is On' CapsLock On ;Turns CapsLock On CapsLock Off ;Turns CapsLock Off CapsLock ; (by itself) turns CapsLock On. ;To test for CapsLock: if CapsLock ;do something endif See Also: ScrollLock NumLock Category: System CarouselLoaded : Boolean Returns True if the task swapper, Software Carousel is loaded. The Carousel task number can be read in the TaskNumber variable. See Also: TaskNumber Category: System Chain (MenuName) This command will load a new menu. Unlike Jump, MarxMenu stays in memory. The screen is not cleared. If the new menu has exactly the same global variables, the contents of all global variables is retained. Chain allows for a very quick transfer from one menu to another. Example: OnKey 'P' |Chain ('USER') ;Chains to USER.MNU Computer Tyme * MarxMenu * Users Manual Page #105 ----------------------------------------------------------------- Category: Execution Char (Number) : String Converts a number into a one character string. Example: Write (Char(65)) ;This will display 'A' See Also: Ord Category: String CharString (Char,Length) CharString returns a string Length long made of of Char. Example: Writeln CharString ('*',4) ;returns '****' Category: String ChDir (String) Changes directories. The variable FileResult can be tested to see if it was successful. ChDir can also be used to change drives. Example: ChDir( 'C:\HOME\MARXMENU' ) ChDir( 'B:' ) ; Will make drive B: the current drive Category: Directory CleanFileName (String) : String Returns the full path name or directory name of a string. It also removes occurrences of a '\\' in the string if they aren't at the beginning of the string. Thus the command: CleanFileName('a:\\main.mnu') returns 'A:\MAIN.MNU'. CleanFileName also removes extra ending '\' and capitalizes the path. See Also: TrueName Category: String Computer Tyme * MarxMenu * Users Manual Page #106 ----------------------------------------------------------------- ClearIfNewInput (On/Off) If ClearIfNewInput is set to True, then the string set by InputString will only be the start of the new input if the first character typed is an arrow key. Otherwise the InputString is cleared to blank. Example: InputString = '1234' ClearIfNewInput On St = Readln See Also: Readln Category: StringInput ClearKbdBuffer ClearKbdBuffer clears the characters out of the keyboard buffer. See Also: OldKbdBuffer Category: Keyboard ClearKeyEvents ClearKeyEvents wipes out all key events for the current window. Since child window inherit the key events of it's parent window, this command allows you to wipe out these events when you want to open a new window for another purpose where the existing key events wouldn't be appropiate. This command only affects the current window. Example: DrawBox 2 2 78 20 ClearKeyEvents ViewTextFile 'HELP.TXT' See Also: KeyEvent Category: Event ClearLine (Char) Clears the current line in the current window. The optional parameter is for the decimal number of the IBM graphics character. If (Char) is present, the line will be filled with the character. Examples: ClearLine ;Clears screen with blanks ClearLine 205 ;Clears screen with char 205 Computer Tyme * MarxMenu * Users Manual Page #107 ----------------------------------------------------------------- Category: Display Ansi ClearScreen (Char) Clears the screen. The optional parameter is the decimal number equivalent for an IBM graphics character. If (Char) is present, the screen will be filled with (Char). Examples: ClearScreen ;Clears screen with blanks ClearScreen 177 ;Clears screen with char 177 Category: Display Ansi ClearScreenFirst (On/Off) Used in conjunction with Execute. If on, will clear the screen before running the program. Example: OnKey 'D' |ClearScreenFirst On |Execute 'C:\DM.COM' The default is ON. See Also: Execute Category: Execution ClearScreenOnExit (On/Off) Controls whether or not the screen is cleared on menu exit. Default on. See Also: Execute Category: Display ClockColor (Foreground,Background) Sets colors for the on screen clock. Example: ClockColor Yellow Brown Category: Color Computer Tyme * MarxMenu * Users Manual Page #108 ----------------------------------------------------------------- ClockMode ClockMode is a variable whose bits control the format of the on screen clock when it is used. ClockMode Bits: --------------- 0 24 hour mode 1 AmPm On 2 Show Seconds 3 UpperCase 4 3 char month 5 3 char Day of Week 6 Show Day of Week 7 Dash = 0 Slash = 1 MM-DD-YY or MM/DD/YY 8 Long Date Bit 0 on sets hours display to 24 hour mode. Bit 1 turns on the Am/Pm display. Bit 2 on controls if time is shown as HH:MM:SS or just HH:MM. Bit 3 shows date in only upper case. Bit 4 on shows month in 3 characters. Bit 5 shows Day of week as 3 characters. Bit 6 controls if Day of week is displayed. Bit 7 controls if date is shown as MM-DD-YY or MM/DD/YY. Bit 8 shows date in text. (October 3, 1990). The default ClockMode is 326. Example: ClockMode 120 ClockColor White Red ClockPos 1,1 Category: Display ClockPos (Column,Row) Puts a clock on the screen at location (column,row). The command ClockPos 0 0 turns the clock off. Example: ClockPos 7 2 Category: Display Computer Tyme * MarxMenu * Users Manual Page #109 ----------------------------------------------------------------- ClosePrinter In MarxMenu the printer is just another text file. Closing the printer is not required for ordinary printing. If you are changing printers you need to run ClosePrinter before changing the printer name. The printer is automatically opened by MarxMenu anytime you print anything. If you are running Windows or DesqView, closing the printer allows other programs to access the printer. So if you are running under any multitasking shell, be sure to close the printer when you are done with it. If you are using a network like Novell, ClosePrinter will end the print job and send it to the print queue. This avoids the need to wait for print capture timeouts to take effect. Closing the printer is good programming practice and will help you stay out of trouble. It's like what your mother taught you. "When you're done with something, put it away." See Also: OpenPrinter PrinterName Category: Printer ClusterSize (Drive) : Number Returns cluster size in bytes. Example: Writeln (ClusterSize 'C') ClusterSize only looks at the first character of the string for the drive letter. Example: ClusterSize (Path) ;returns clustersize of current drive. Category: System CmdLine : String A System string variable that returns the rest of the command line after the menu name. If you execute MARXMENU GOFILE *.BAT the CmdLine command would return "*.BAT". Example: writeln cmdline ;returns the command line after the menu name. Computer Tyme * MarxMenu * Users Manual Page #110 ----------------------------------------------------------------- Category: String CMOS (Number) : Number CMOS allows reads from and write to the CMOS RAM on the clock chip. Example: Writeln CMOS(16) CMOS(16) = $42 Category: System ColdBoot Causes a cold reboot of the computer. This differs from a warm boot in that it is a complete system reset that forces the computer to go through the (POST, Power On Self Test) process. A warm boot does not force a complete reset. See Also: Reboot Category: Execution ColorScreen : Boolean Returns true if screen is a color screen and in a color mode. Note: Running MODE BW80 will cause ColorScreen to return false. Example: If ColorScreen ;Color TextColor( White, Blue ) Else ;Monochrome TextColor( White, Black ) EndIf Category: Video ComAcceptFileProgram ComAcceptFileProgram is a variable that contains a procedure that you use when receiving a file to determine if the file name being sent is acceptable. You procedure needs to return a True to accept the name or a False to reject the name. Example: ComAcceptFileProgram = Loc MyAcceptName Computer Tyme * MarxMenu * Users Manual Page #111 ----------------------------------------------------------------- ;- Always overwrite file Procedure MyAcceptName if ExistFile ComFullFileName DelFile ComFullFileName endif Return True EndProc ;----- Ask to overwrite existing file Procedure MyAcceptName var Ch if ExistFile ComFullFileName DoubleLineBox BoxBorderColor LCyan Mag BoxInsideColor Yellow Mag InverseColor Yellow Red DrawBox 31 7 47 3 UseArrows Off Write ' File ' ComFileName ' exists. Replace it? (Y/n) ' Ch = UpperCase(ReadKey) EraseTopWindow if Ch = 'N' Return False else DelFile ComFullFileName Return True endif endif Return True EndProc See Also: ComFileName ComFullFileName Category: Modem ComAutoDownload (On/Off) If ComAutoDownload is set to True then when the characters that start a Zmodem download are received a Zmodem download is automatically started. Category: Modem Computer Tyme * MarxMenu * Users Manual Page #112 ----------------------------------------------------------------- ComBasePort (ComPort) : Number ComBasePort returns the base port address for the specified com port. It can also me used to set the base port address to a non-standard base port. The base port address must be set before using ComInitPort. Example: Writeln ComBasePort (Com3) ; displays the base port ComBasePort (Com3) = $4F8 ; set Com3 base port ComInitPort(38400,8,'N',1) ; Initialize the port See Also: ComIRQ ComInitPort Category: Modem ComBaud : Number Reads or sets the baud rate of the serial port indicated by the ComPort command. Range from 110 to 115,000 baud. Example: ComBaud = 9600 Writeln ComBaud See Also: ComDataBits ComStopBits ComParity Category: Modem ComBlockErrors : Number During an upload or download ComBlockErrors returns the number of errors that occurred during the current block. See Also: ComXmitStatusProgram Category: Modem ComBlockNumber : Number During an upload or download ComBlockNumber returns the current block number. See Also: ComXmitStatusProgram Category: Modem Computer Tyme * MarxMenu * Users Manual Page #113 ----------------------------------------------------------------- ComBlockSize : Number During an upload or download ComBlockSize returns the number of bytes in the block that's being transferred. See Also: ComXmitStatusProgram Category: Modem ComBreakReceived : Boolean Returns True if a break signal has been received at the serial port. Example: if ComBreakReceived then Writeln 'Break Received' See Also: ComSendBreak Category: Modem ComBytesRemaining : Number During an upload or download ComBytesRemaining returns the number of bytes that is yet to be transferred. See Also: ComXmitStatusProgram Category: Modem ComBytesTransferred : Number During an upload or download ComBytesTransferred returns the number of bytes that has been transferred. See Also: ComXmitStatusProgram Category: Modem ComCD : Boolean Returns the status of the carrier detect line on serial port indicated by the ComPort Command. Example: if ComCD=True then Writeln 'Carrier Detected' if ComCD then Writeln 'Carrier Detected' Category: Modem Computer Tyme * MarxMenu * Users Manual Page #114 ----------------------------------------------------------------- ComCDAbort : Boolean ComCDAbort is set to True if ComWatchCD is on and the carrier is lost. This is used as a signal to indicate that the modem has lost connection and the host program should reset and prepare for the next call. See Also: ComWatchCD Category: Modem ComCharReady : Boolean Tests to see if a character has been received in the input buffer. Example: if ComCharReady then Ch = ComReadChar See Also: ComReadChar Category: Modem ComCheckActivity ComCheckActivity will check the serial ports and keyboard and route characters if anything needs to be routed. It is typically used in the main process loop of communication programs to make it run fast. MarxMenu uses commands like ComEchoRecChar, ComEchoSendChar and ComLocalInput on host programs and ComWriteRecChar and ComSendKbdChar on terminal programs to route characters comming in from various places to other places. This creates a character piping arangement within MarxMenu communication programs. Calling ComCheckActivity allows MarxMenu to move any characters pending from input devices to their output devices. If a character is received at the serial port then ComLastChar is set. If a character wasn't received then ComLastChar is empty. If a character is typed at the keyboard then LastKey is set. If a character wasn't typed then LastKey is empty. See Also: ComSendKbdChar ComWriteRecChar ComEchoRecChar See Also: ComEchoSendChar ComLocalInput Category: Modem Computer Tyme * MarxMenu * Users Manual Page #115 ----------------------------------------------------------------- ComDataBits : Number Reads or sets the number of data bits. Range 5 - 8 bits. Example: ComDataBits = 8 Writeln ComDataBits See Also: ComBaud ComStopBits ComParity Category: Modem ComDone Uninitializes the port. Deallocates memory used by ComInitPort and restores interrupt vectors. See Also: ComInitPort Category: Modem ComDrainSendBuffer ComDrainSendBuffer waits until all the characters in the send buffer go to the modem. This allows the other end to get the last of the goodbye message without being cut off by a hangup. With buffered modems you should wait a few seconds after this command before hanging up the modem to ensure that all the data has been transferred. Category: Modem ComDTR (On/Off) Turns DTR (Data Terminal Ready) On or Off. Setting DTR to Off can be used to hang up a modem. Example: ComDTR Off Category: Modem ComEchoRecChar : Boolean When ComEchoRecChar is set to true then characters received are echoed back to the sender. This option is useful when writing a host communication program. The echoed character is intelligently processed. See Also: ComReadChar ComEchoSendChar ComCheckActivity Computer Tyme * MarxMenu * Users Manual Page #116 ----------------------------------------------------------------- Category: Modem ComEchoSendChar : Boolean When ComEchoSendChar is set to true then characters sent are echoed to the local screen. This option is useful when writing a host communication program. The echoed character is intelligently processed. When set to true, the following commands will also be processed for correct com port output: TextColor, GotoXY, ClearScreen, ClearLine. See Also: ComReadChar ComEchoRecChar ComCheckActivity Category: Modem ComEmptyRecBuffer ComEmptyRecBuffer trashes the data in the receive buffer. This allows you to get rid of incoming trash data. See Also: ComEmptySendBuffer Category: Modem ComEmptySendBuffer ComEmptySendBuffer trashes all the data in the send buffer that hasn't been transferred. This allows you to create a hot key effect and makes host programs act more responsive. See Also: ComEmptyRecBuffer Category: Modem ComErrorLimit : Number ComErrorLimit is the maximum number of errors that a file transfer can have before an automatic transfer abort occurs. If set to 0 then it will keep trying forever. The default limit is 100. Category: Modem ComFileName : String During an upload or download ComFileName returns the name of the file being transferred. See Also: ComXmitStatusProgram ComFullFileName Computer Tyme * MarxMenu * Users Manual Page #117 ----------------------------------------------------------------- Category: Modem ComFileSize : Number During an upload or download ComFileSize returns the size of the file being transferred. See Also: ComXmitStatusProgram Category: Modem ComFullFileName : String During an upload or download ComFullFileName returns the full name of the file being transferred. See Also: ComXmitStatusProgram ComFileName Category: Modem ComInitPort (Baud,DataBits,Parity,StopBits) Initializes the ComPort. After selecting which com port you want to initialize with the ComPort command, this must be run before other com commands are executed. Example: ComPort = Com1 ComInitPort(38400,8,'N',1) See Also: ComDone Category: Modem ComHangupOnExit (On/Off) If ComHangupOnExit is set to On, MarxMenu will hang up the modem connection when exiting. If set to Off, MarxMenu will leave the modem online when exiting. The default is On. Category: Modem ComIRQ (ComPort) : Number ComIRQ returns the interrupt number for the specified com port. It can also me used to set the interrupt number to a non-standard interrupt. The interrupt must be set before using ComInitPort. Computer Tyme * MarxMenu * Users Manual Page #118 ----------------------------------------------------------------- Example: Writeln ComIRQ (Com3) ; displays the interrupt ComIRQ (Com3) = 5 ; set Com3 to use interrupt 5 ComInitPort(38400,8,'N',1) ; Initialize the port See Also: ComBasePort ComInitPort Category: Modem ComLastChar : String ComLastChar returns the last character that was received with ComReadChar. See Also: ComReadChar ComCharReady ComReadTimeout ComReadln Category: Modem ComLastLine : String ComLastLine returns the last line that was received that is not a blank line. BackSpace characters are handled correctly. Category: Modem ComLocalInput (On/Off) If ComLocalInput is set to On then keys typed at the keyboard will be treated as if they came in over the serial port. This allows a host program like a BBS to be run from the local console as if the user were typing in characters. See Also: ComCheckActivity ComEchoRecChar ComEchoSendChar Category: Modem CommaString (String) : String CommaString takes a string that represents a number and adds commas every three characters. If you pass it a number it will convert it to a string and then add the commas. Example: Writeln CommaString ('12345') ; returns 12,345 Writeln CommaString (45 * 75) ; returns 3,375 Category: String Computer Tyme * MarxMenu * Users Manual Page #119 ----------------------------------------------------------------- Comment Starts a Comment Block. All text is ignored until EndComment is encountered. Example: Comment ======================================= Everything between Comment and EndComment is ignored. ======================================= EndComment See Also: EndComment Category: Misc ComNewLineProgram : Procedure ComNewLineProgram is a procedure variable that if set to point to a procedure is executed every time a new line is received at the modem. Example: ComNewLineProgram = Loc ExamineLastLine Procedure ExamineLastLine var St P P = pos('Time Sync:',ComLastLine) if P = 0 then Return St = mid(ComLastLine,P + 11,17) ;read Date and Time NovServerTime = TimeOf(St) EndProc In this example, ExamineLastLine is executed once each new line and is scaned for the word "Time Sync:". If the word is found it sets the server time to the value following that word. Category: Modem ComParity : String Reads or sets the parity. N - None E - Even O - Odd M - Mark S - Space Computer Tyme * MarxMenu * Users Manual Page #120 ----------------------------------------------------------------- Example: ComParity = 'E' Writeln ComParity See Also: ComBaud ComDataBits ComStopBits Category: Modem ComPort : Number Sets or reads the port that communication commands will effect. The ComPost command must be executed first before any of the other communication parameters can be set. Example: ComPort = Com1 Writeln ComPort Category: Modem ComProtocol : String During an upload or download ComProtocol returns the name of the transfer protocol being used. See Also: ComXmitStatusProgram Category: Modem ComReadChar : String Reads one character from the com port or input buffer. It will wait up to ComReadTimeout ticks for the character. If no character is received then ComTimeOut is set to True. If the ComStripHighBit command it set then this command will automatically remove the high-order bit when reading a character. Example: var Ch Ch = ComReadChar See Also: ComCharReady ComReadTimeout ComReadln Category: Modem Computer Tyme * MarxMenu * Users Manual Page #121 ----------------------------------------------------------------- ComReadln : String Reads a line from the com port or input buffer. It will wait up to ComReadTimeout ticks for the character. If no character is received then ComTimeOut is set to True. Example: if ComReadln = 'OK' then See Also: ComReadChar ComCharReady ComReadTimeout Category: Modem ComReadTimeout : Number This variable controls the number of timer ticks (18.2 ticks per second) that a read command will wait to receive data. Example: ComReadTimeout = 36 ;2 seconds Category: Modem ComRec1kXmodem (FileName) Receive a file using the 1k-Xmodem (XModem1k) transfer protocol. Example: ComRec1kXmodem 'MXMENU.ZIP' See Also: ComSend1kXmodem Category: Modem ComRecKermit Receive a file, or group of files, using the Kermit transfer protocol. Example: ComRecKermit See Also: ComSendKermit Category: Modem Computer Tyme * MarxMenu * Users Manual Page #122 ----------------------------------------------------------------- ComRecXmodem (FileName) Receive a file using the Xmodem transfer protocol. There are two versions of Xmodem (Checksum and CRC), the ComRecXmodem command is compatible with both versions. Example: ComRecXmodem 'MXMENU.ZIP' See Also: ComSendXmodem Category: Modem ComRecYmodem Receive a file, or group of files, using the Ymodem transfer protocol. Example: ComRecYmodem See Also: ComSendYmodem Category: Modem ComRecYmodemG Receive a file, or group of files, using the YmodemG transfer protocol. This protocol does not do any error checking and is therefore only advisable for use with Error correcting modems. Example: ComRecYmodemG See Also: ComSendYmodemG Category: Modem ComRecZmodem Receive a file, or group of files, using the Zmodem transfer protocol. Example: ComRecZmodem See Also: ComSendZmodem Category: Modem Computer Tyme * MarxMenu * Users Manual Page #123 ----------------------------------------------------------------- ComResult : Number ComResult is a variable like FileResult that returns the success status of com port activity. A result code or zero generally indicates success. Example: ComRecXmodem if ComResult <> 0 then Writeln 'Xfer Not Successful!' Category: Modem ComRI : Boolean Returns the status of the ring indicator line on serial ports. Example: if ComRI then Writeln 'Ringing' Category: Modem ComRTS (On/Off) Activates and deactivates RTS/CTS handshaking. Example: ComRTS On Category: Modem ComSendBreak Sends a break signal out the modem. See Also: ComBreakReceived Category: Modem ComSend1kXmodem (FileName) Send a file using the 1k-Xmodem (Xmodem1k) transfer protocol. Example: ComSend1kXmodem 'MXMENU.ZIP' See Also: ComRec1kXmodem Category: Modem Computer Tyme * MarxMenu * Users Manual Page #124 ----------------------------------------------------------------- ComSendKermit (FileName or Array) Send a file, or group of files, using the Kermit transfer protocol. If you pass a filename it sends the file. If you pass an arrayname then send all the files in the array list. Example: ComSendKermit 'MXMENU.ZIP' ;Send MXMENU.ZIP via Kermit Example: Var FileList AppendArray(FileList,'FILE1') AppendArray(FileList,'FILE2') ComSendKermit FileList ;Send FILE1 & FILE2 via kermit See Also: ComRecKermit Category: Modem ComSendKbdChar (On/Off) If ComSendKbdChar is set to On then any characters typed at the keyboard will be sent out the serial port. In a terminal program you would typically turn ComWriteRecChar and ComSendKbdChar both on. See Also: ComCheckActivity ComWriteRecChar Category: Modem ComSendXmodem (FileName) Send a file using the Xmodem transfer protocol. There are two versions of Xmodem (Checksum and CRC), the ComRecXmodem command is compatible with both versions. Example: ComSendXmodem 'MXMENU.ZIP' See Also: ComRecXmodem Category: Modem ComSendYmodem (FileName or Array) Send a file, or a group of files, using the Ymodem transfer protocol. If you pass a file name then it sends the file. If you pass it an array then it will send all the files in the array list. Computer Tyme * MarxMenu * Users Manual Page #125 ----------------------------------------------------------------- Example: ComSendYmodem 'MXMENU.ZIP' Example: Var FileList AppendArray(FileList,'FILE1') AppendArray(FileList,'FILE2') ComSendYmodem FileList See Also: ComRecYmodem Category: Modem ComSendYmodemG (FileName or Array) Send a file, or group of files, using the YmodemG transfer protocol. If you pass a file name then it sends that file. If you pass an array then it will send all the files in the array list. This protocol does not do any error checking and is therefore only advisable for use with Error correcting modems. Example: ComSendYmodemG 'MXMENU.ZIP' Example: Var FileList AppendArray(FileList,'FILE1') AppendArray(FileList,'FILE2') ComSendYmodemG FileList See Also: ComRecYmodemG Category: Modem ComSendZmodem (FileName or Array) Send a file, or group of files, using the Zmodem protocol. If you pass a file name then it sends that file. If you pass an array then it will send all the files in that array list. Example: ComSendZmodem 'MXMENU.ZIP' Example: Var FileList AppendArray(FileList,'FILE1') AppendArray(FileList,'FILE2') ComSendZmodem FileList Computer Tyme * MarxMenu * Users Manual Page #126 ----------------------------------------------------------------- See Also: ComRecZmodem Category: Modem ComStopBits : Number Reads or sets the number of stop bits. Range 1 - 2 bits. Example: ComStopBits = 1 Writeln ComStopBits See Also: ComBaud ComDataBits ComParity Category: Modem ComStripHighBit (On/Off) This command when set to on (true), will automatically remove the high-order bit when using the ComReadChar command. File transfers and the ComReadLn command are unaffected by this command. See Also: ComReadChar Category: Modem ComThisLine : String ComThisLine returns a string of characters that has been received from the com port since the last CR. This can be used to see what prompts are being received for automatic script processing. Example: if pos('Password',ComThisLine) > 0 ComWriteln 'Beast' endif Category: Modem ComTimeout : Boolean ComTimeout is set to True if the last command ended in a timeout error. Example: if ComTimeout then Writeln 'Something is stuck!' Category: Modem Computer Tyme * MarxMenu * Users Manual Page #127 ----------------------------------------------------------------- ComTotalErrors : Number During an upload or download ComTotalErrors returns the number of errors that occurred during the current file transfer. See Also: ComXmitStatusProgram Category: Modem ComUseInt14 ComUseInt14 sets MarxMenu to talk to the ports through the Int14 serial port routines. This can be used for network modem sharing applications or if for some reason you don't want to talk to the UART directly. The default Int14 routines are unbuffered. Because of the limitations of the Int14 routines many of the more advance MarxMenu communications commands do nothing when this option is activated. Category: Modem ComUseUart ComUseUart sets MarxMenu to talk to the UART directly. This is the default mode. This command can be used to switch back if you used the ComUseInt14 command. Category: Modem ComWatchCD : Boolean When ComWatchCD is set to true MarxMenu watches the carrier detect signal. If carrier detect is lost then several things happen. ComCDAbort is set to true. ComEchoSendChar and ComEchoRecChar are set to false. ComWrite and ComWriteln are disabled. ComCharReady is always true and ComReadChar returns a char 0 when read. This function is there to reset a host program without having to build in a lot of error checking into the MarxMenu script. Setting ComWatchCD to false resets everything and allows you to prepare for the next call. Only set ComWatchCD to true after you receive a carrier detect signal. It is also recommended that you insert a half second delay after receiving a connect to deal with slow modems in fast computers. Category: Modem Computer Tyme * MarxMenu * Users Manual Page #128 ----------------------------------------------------------------- ComWrite (String) Writes a string to the com port with no CR. Example: ComWrite '+++' See Also: ComWriteln ComWriteTimeout Category: Modem ComWriteln (String) Writes a string to the com port with CR. Example: ComWriteln 'ATDT 1-417-866-1665' See Also: ComWrite ComWriteTimeout Category: Modem ComWriteRecChar (On/Off) If ComWriteRecChar is set to On then any characters comming in the serial port will be written to the screen. In a terminal program you would typically turn ComWriteRecChar and ComSendKbdChar both on. See Also: ComCheckActivity ComSendKbdChar Category: Modem ComWriteTimeout : Number This variable controls the number of timer ticks (18.2 ticks per second) that a write command will wait to send data. Example: ComWriteTimeout = 36 ;2 seconds Category: Modem ComXmitAbortProgram ComXmitAbortProgram is called while uploads and downloads are in progress. If this is set to a MarxMenu procedure then you can write your own control routine to control protocol abort. Your program needs to return either a true to abort or a false to not abort. Computer Tyme * MarxMenu * Users Manual Page #129 ----------------------------------------------------------------- Example: ComXmitAbortProgram = loc XmitAbort Procedure XmitAbort if not KbdReady then Return False Return ReadKey = Esc EndProc See Also: ComXmitStatusProgram Category: Modem ComXmitEnding : Boolean This variable is set to true to indicate the ending for an upload or download. It is used to end a communications status window. See Also: ComXmitStatusProgram ComXmitStarting Category: Modem ComXmitStarting : Boolean This variable is set to True to indicate the beginning for an upload or download. It is used to start a communications status window. See Also: ComXmitStatusProgram ComXmitEnding Category: Modem ComXmitStatusProgram ComXmitStatusProgram is called while uploads and downloads are in progress. If this is set to a MarxMenu procedure then you can write your own status display routine to show progress status. See Also: ComXmitAbortProgram Category: Modem ComZRecover (On/Off) If ComZRecover is set to On then if you retry an aborted ZModem download it will resume at the point where it was aborted. Category: Modem Computer Tyme * MarxMenu * Users Manual Page #130 ----------------------------------------------------------------- Console (On/Off) MarxMenu has an built-in system control console that the user can activate by pressing the Tab key. This allows them to dynamically set the screen blanker parameters. The command "CONSOLE OFF" will disable the Tab key function to prevent access console control box. Category: Display ConsoleBorderColor (Color,Color) Sets the color of the console border. See Also: ConsolePos Category: Color ConsoleHeaderColor (Color,Color) Sets the color of the console header. See Also: ConsolePos Category: Color ConsoleInsideColor (Color,Color) Sets the color of the console inside. See Also: ConsolePos Category: Color ConsolePos (Column,Row) Sets the coordinates of the pop-up console menu. Example: ConsoleBorderColor( White,Blue ) ConsoleHeaderColor( Yellow,Blue ) ConsoleInsideColor( Yellow,Blue ) ConsolePos( 5,5 ) ; Column 5, Row 5 Category: Display Computer Tyme * MarxMenu * Users Manual Page #131 ----------------------------------------------------------------- Const Creates a constant. Example: Const X = 50 St = 'MARXMENU' Flag = True See Also: Var Shared Qualifier Category: Variable Contains (String) : Boolean Returns True if the first string contains the second string. Example: if 'ABCD' contains 'BC' See Also: StartsWith Category: String CopyFile (Source,Dest) CopyFile copies a file from source to destination. If the destination file already exists it will be deleted, even if it is a read-only file. On novell networks it takes advantage of the server copy function to increase speed. Results are returned in the FileResult variable. Example: CopyFile('MARXMENU.EXE','A:') Category: System Cos (Radians) : Real Returns the Cosine of a real. Category: Math Float Computer Tyme * MarxMenu * Users Manual Page #132 ----------------------------------------------------------------- CountryCode : Number Returns the international country code from DOS. The country code is the same number as the international telephone dialing code prefix. Category: International CpuClass : Number Reads the type of CPU you are using and returns a number. 1 - 8088, 8086, 80186, V20, V30 2 - 80286 3 - 80386 4 - 80486 Example: var Temp Temp = CPUClass ;<- Read CPu Type into Var Temp if Temp = 1 Writeln "This System is an XT Class Machine!" elseif Temp = 2 Writeln "This System is an AT Class Machine!" elseif Temp = 3 Writeln "That 386 is a powerful machine." else Writeln "Do you really rate having a 486?" endif See Also: CpuName McpClass Category: System CpuName : String Returns the name of the CPU. CPU names include: 8088, 8086, V20 ,V30, 80188, 80186, 80286, 80386, 80386SX, 80486, 80486SX See Also: CpuClass McpName Category: System Computer Tyme * MarxMenu * Users Manual Page #133 ----------------------------------------------------------------- CurrencySymbol : String Returns the currency symbol based on the country code. Category: International CurrentDirectory : String Returns the current directory. Example: Writeln CurrentDirectory Category: System CurrentDrive : String Returns the letter of the current drive. Example: Writeln CurrentDrive ; returns C Category: System CurrentEnvironment CurrentEnvironment selects the current environment for use with environment access commands. See Also: ReadEnv SetEnv ReadEnvironment ShellEnvironment See Also: ParentEnvironment MasterEnvironment Category: Environment CurrentWindow : Number Returns the number of the current window. All windows are given a unique number. Example: ThisWindow = CurrentWindow See Also: SetTopWindow Category: Display Computer Tyme * MarxMenu * Users Manual Page #134 ----------------------------------------------------------------- Cursor (On/Off) MarxMenu automatically turns the cursor on for certain kinds of input. Using Cursor Off prevents MarxMenu from turning the cursor on. Cursor On reverses this and allows MarxMenu to turn the cursor on when needed. Example: Cursor Off Category: Video CustomBox (String) Selects a Box border using an 8-character string to define the sides and the corners. Example: CustomBox ('12345678') ;This will help you figure out what ;position matches which side. See Also: SingleLineBox DoubleLineBox BlockBox NoBoxBorder Category: Display DateSeparator : String Returns the date separator character from the country information. See Also: TimeSeparator DecimalSeparator CountryCode Category: International Time DateString (Time) : String Returns the date of a time value as text. If no parameter is passed then Now is assumed. Uses international date format rules. Example: Writeln DateString ;returns the date of Now as text Writeln DateString (Tomorrow) ;returns the date of Tomorrow as text Category: Time String International Computer Tyme * MarxMenu * Users Manual Page #135 ----------------------------------------------------------------- Day : Number Returns the day of the month. Category: Time DayOf (Date) : Number Returns the day of a date. If Date is passed as a string it is converted automatically. Example: DayOf('April 22, 1992') ;returns 22 See Also: TimeOf BadDate Category: Time DayOfWeek : Number Returns the day of the week. 0=SUNDAY 1=MONDAY 2=TUESDAY 3=WEDNESDAY 4=THURSDAY 5=FRIDAY 6=SATURDAY Category: Time DayOfWeekOf (Date) : Number Returns the DayOfWeek of a date. If Date is passed as a string it is converted automatically. Example: DayOfWeekOf('April 22, 1992') ;returns 4 See Also: TimeOf BadDate Category: Time Computer Tyme * MarxMenu * Users Manual Page #136 ----------------------------------------------------------------- DBaseMode (On/Off) When MarxMenu reads a dBase record it converts numbers into real numbers, boolean fields into boolean variables, and truncates spaces from string variables. DBase programmers, however, like to have all fields returned as strings with all the spaces included. If DBaseMode is set to On, MarxMenu returns data as dBase programmers expect. See Also: DbGetRecord Category: DBase DbClose (Handle) DbClose closes a dBase file. Category: DBase DbDeleted : Boolean After a DbGetRecord, DbDeleted returns True if the record was deleted. Example: Handle = DbOpen 'MAILLIST.DBF' DbGetRecord(Handle,1,Data) if DbDeleted then Writeln 'Record 1 is Deleted' Category: DBase DbCreateFile (Name,Fields) DbCreateFile creates an empty dBase file. The Fields parameter is a 2 dimensional array that specifies the field structure. The field structure of the array is as follows: 1 - Name 2 - Type 3 - Length 4 - Decimal Position Example: var Fields Fields[1] = Set['Name','C',35,0] Fields[2] = Set['Age','N',3,0] DbCreateFile('AGE.DBF',Fields) See Also: DbFields Computer Tyme * MarxMenu * Users Manual Page #137 ----------------------------------------------------------------- Category: DBase DbDeleteRecord (Handle,Record) DbDeleteRecord sets a specified record as deleted. The data in the record remains and can be set undeleted. Example: Handle = DbOpen 'MAILLIST.DBF' DbDeleteRecord(Handle,20) DbClose(Handle) See Also: DbUnDeleteRecord Category: DBase DbGetRecord (Handle,Record,Data) DbGetRecord reads a specific physical record from a dBase file into array Data. It sets a variable DbDeleted to true if the record is deleted. Error status information is returned in the variable FileResult. If FileResult returns 5, the record is locked. Reading beyond the end of the file will return empty data. Example: Handle = DbOpen 'MAILLIST.DBF' DbGetRecord(Handle,1,Data) loop Data Write LoopVal ' ' ;writes the first record endloop Writeln DbClose(Handle) See Also: DbWriteRecord DBaseMode Category: DBase DbFields (Handle,Fields) DbFields reads the list of dBase fields into a 2 dimensional array. The fields are as follows: 1 - Name 2 - Type 3 - Length 4 - Decimal Position Example: var Handle Fields Handle = DbOpen 'MAILLIST.DBF' DbFields(Handle,Fields) Computer Tyme * MarxMenu * Users Manual Page #138 ----------------------------------------------------------------- loop Fields loop LoopVal Write LoopVal ' ' endloop Writeln endloop Field Types: C - Character D - Date N - Number L - Logical (True/False) See Also: DbCreateFile Category: DBase DbLockFile (Handle) DbLockFile puts a file lock on the entire dBase file. See Also: DbUnLockFile DbLockRecord DbUnlockRecord Category: DBase DbLockRecord (Handle,Record) Sets a file lock on a specified record. If you are accessing multiple records or multiple files that all have to be updated at once, you might want to lock them all first before doing the update, See Also: DbUnLockRecord DbLockFile DbUnlockFile Category: DBase DbOpen (FileName) : Handle DbOpen opens a dBase file and returns a file handle. The file handle is used to access the data file with all other dBase commands. If you don't specify a file extension the extension '.DBF' is assumed. Example: Handle = DbOpen 'MAILLIST.DBF' See Also: DbClose DbFields Category: DBase Computer Tyme * MarxMenu * Users Manual Page #139 ----------------------------------------------------------------- DbRecLen (Handle) : Number DbRecLen return the record size in a dBase file. Category: DBase DbRecords (Handle) : Number DbRecords return the number of records in a dBase file. Category: DBase DbUnDeleteRecord (Handle,Record) DbUnDeleteRecord sets a specified record as not deleted. Example: Handle = DbOpen 'MAILLIST.DBF' DbUnDeleteRecord(Handle,55) DbClose(Handle) See Also: DbDeleteRecord Category: DBase DbUnLockFile (Handle) DbUnLockFile removes a file lock from the entire dBase file. See Also: DbLockFile DbLockRecord DbUnlockRecord Category: DBase DbUnLockRecord (Handle,Record) Removes a file lock on a specified record. If you are accessing multiple records or multiple files that all have to be updated at once, you might want to lock them all first before doing the update, See Also: DbLockRecord DbLockFile DbUnlockFile Category: DBase Computer Tyme * MarxMenu * Users Manual Page #140 ----------------------------------------------------------------- DbWriteRecord (Handle,Record,Data) DbWriteRecord writes a physical record into a dBase file from Data at location Record. Error status information is returned in the variable FileResult. If FileResult returns 5, the record is locked. MarxMenu automatically sets file locks while writing to a record so that it prevents multiple writes to the same record when used on a network. If you write a record that is one record past the end of the file, the record will be appended. If you write beyond the end of the file, MarxMenu will fill in the gap with empty deleted records. Example: Handle = DbOpen 'MAILLIST.DBF' DbWriteRecord(Handle,45,Data) DbClose(Handle) See Also: DbGetRecord Category: DBase DecimalSeparator : String Returns the decimal separator character from the country information. See Also: TimeSeparator DateSeparator CountryCode Category: International DefaultExtension (FileName,Extension) : FileName DefaultExtension returns the filename with the Extension appended to it if the FileName doesn't already have an extension. Example: St = 'WIN' Writeln DefaultExtension(St,'INI') ;returns WIN.INI See Also: ForceExtension Category: String Computer Tyme * MarxMenu * Users Manual Page #141 ----------------------------------------------------------------- Delete (String,Pos,Count) Deletes characters from string starting at pos for count. Example: String = 'ABCDEFGH' Delete(String,2,3) This leaves a String containing 'AEFGH' If count exceeds the length of the string, the string is truncated at pos. Another use of Delete is to delete elements of an array. Delete (Array,Position,Count) This works exactly like the delete command for strings. It delete elements of an array beginning at Position for Count elements. The NumberOfElements is adjusted accordingly. Example: MyArray[1] = "ONE" MyArray[2] = "TWO" MyArray[3] = "THREE" MyArray[4] = "FOUR" Delete( MyArray,2,2 ) ;MyArray now contains.. MyArray[1] = "ONE" MyArray[2] = "FOUR" Category: String Array DelFile (Name) Deletes a file by name. FileResult returns a 0 if the file existed and the delete was successful. Example: DelFile( 'C:\NOTES\READ.ME' ) If FileResult = 0 Writeln('C:\NOTES\READ.ME was successfully deleted!') Else Writeln('C:\NOTES\READ.ME was NOT deleted successfully!') EndIf Category: File Computer Tyme * MarxMenu * Users Manual Page #142 ----------------------------------------------------------------- Devices (Array) Fills array with list of all devices. Example: var DevList Devices DevList ;Device list --> array DevList Loop DevList ;Loop thru the array Writeln LoopVar ;And Print contents EndLoop Category: Array System DirectoriesOnly (On/Off) Forces ReadDirectory to read directories instead of file names. See Also: ReadDirectory Category: Directory DisplayType : Number Returns the current video card type. 0 = HercMono 1 = CGA 2 = MCGA 3 = EGA 4 = VGA 5 = PGC MarxMenu also understands the above constant names. For example, if you want to test for a CGA card: if DisplayType = CGA then .... Category: Video DiskType (Drive) : String DiskType returns the type of disk of a drive letter. Types recognized are: FLOPPY360 FLOPPY720 FLOPPY12 FLOPPY14 RAMDISK SUBST HARDDISK BERNOULI NOVELL CDROM UNKNOWN Computer Tyme * MarxMenu * Users Manual Page #143 ----------------------------------------------------------------- INVALID Example: Writeln DiskType('F') This command will actually read floppy drives which could be slow. The DriveType command can be used to read the floppy drive configuration in CMOS memory. See Also: DriveType Category: System Dispose (Variable) This command reclaims memory used by a string variable, file variable, or an array. If you are doing a lot of data manipulation, you might want to reclaim memory space used by arrays you are done with. The disposed variable becomes an untyped variable. Example: Loop 20 MyArray[LoopIndex] = LoopIndex ;Check to See Also: if number is odd or even If (MyArray[LoopIndex] Mod 2) = 0 Writeln('MyArray[' + Str(LoopIndex) + '] is an EVEN number.' ); Else Writeln('MyArray[' + Str(LoopIndex) + '] is an EVEN number.' ); EndIf EndLoop ;We're finished with the array so reclaim its memory space. Dispose(MyArray) The dispose command will take multiple parameters on the same line. Example Dispose X Y Z Category: Memory Array DisposeAll DisposeAll does a dispose on all global variables. This can be used to reset everything to nothing. Local variables are not affected. So, if you want to save something you can copy it to a local variable and copy is back when you're done. Computer Tyme * MarxMenu * Users Manual Page #144 ----------------------------------------------------------------- Category: Memory Array DosBusy (Num) Increments (or decrements) the Dos Busy flag by the number passed. This can be used to prevent TSRs from taking action by signaling that Dos is busy. Example: DosBusy(1) ;-Critical Section DosBusy(-1) Category: System DosKeyInstalled : Boolean DosKeyInstalled returns True if the dos program DOSKEY is installed. Category: System DosVersion : Number Returns the major DOS version number. See Also: DosVersionString MinorDosVersion Category: System DosVersionString : String Returns the DOS version number as a 4 character string. This function always returns 2 places past the decimal point. The form of the string is: #.## Example Writeln DosVersionString ;prints 4.01 See Also: DosVersion MinorDosVersion Category: System String DosWindow (On/Off) When you set DosWindow on, MarxMenu will not drop out of the menu system when you use the Execute command. It will give you a display of the DOS screen within the current window. The program you execute must be a well-behaved program like DIR or COPY or some of the other DOS commands that talk to the screen through standard file handles, otherwise is it possible for the application to corrupt your MarxMenu display. Computer Tyme * MarxMenu * Users Manual Page #145 ----------------------------------------------------------------- See Also: Execute Category: Execution DoubleLineBox Selects double line box. See Also: SingleLineBox BlockBox CustomBox NoBoxBorder Category: Display DPMIInstalled : Boolean Returns True if DPMI services are installed. See Also: DPMIVersion Category: System DPMIVersion : String DPMIVersion returns the version of the DPMI driver you are using. If DPMI isn't present it returns an empty string. See Also: DPMIInstalled Category: System DrawBox (column,row,width,height) Draws a box on the screen. The (column) and (row) are the upper left corner, (width) and (height) is the box size. Example: Explode On Shadow On DoubleLineBox BoxHeaderColor( Yellow,Red ) BoxBorderColor( White, Red ) BoxInsideColor( Yellow,Red ) InverseColor( Black, Gray ) CapsColor( Black, Red ) BoxHeader = ' << Main Menu >> ' DrawBox( 30,10,40,8 ) DrawBox also creates a logical layer for several display variables. These variables include TextColor, InverseColor, CapsColor. It is important to use these color control commands AFTER the DrawBox command in order to properly restore the colors of the previous DrawBox. Computer Tyme * MarxMenu * Users Manual Page #146 ----------------------------------------------------------------- If you call up a box and upon finishing it adversely affects the colors of the previous box, you probably used color control commands BEFORE the DrawBox instead of AFTER. Category: Display Drives : Number Returns the number of drives. This includes drive names that can be substituted. Most of the time the answer is 5. This relates to your LastDrive = command in your CONFIG.SYS file. Category: System DriveType (Drive) : String DriveType returns the type of drive of a given drive letter. This is like DiskType with the exception of how it deals with floppy drives. DiskType actually tries to read the floppy so if you put a 720k disk in a 1.4 meg drive then DiskType will return 720. DriveType returns the type of drive the CMOS is configured for. See Also: DiskType Category: System DvAppNumber : Number Returns the DesqView application number or DesqView window number. Category: DesqView DvFrame (Handle,On/Off) Turns the DesqView border frame On or Off for a particular task identified by Handle. Category: DesqView DvFreeze (Handle) Freezes a program. The program stops executing. See Also: DvUnFreeze DvPifExecute DvLastHandle Category: DesqView Computer Tyme * MarxMenu * Users Manual Page #147 ----------------------------------------------------------------- DvHide (Handle) Hides all output from program making it invisible. The program still continues to run. See Also: DvUnHide Category: DesqView DvKillTask (Handle) Kills a program running under DesqView. The handle is the one returned by DvPifExecute in DvLastHandle. See Also: DvPifExecute Category: DesqView DvLastHandle : Number Returns a number that is associated with a program running under DesqView. This number is used to control other programs running under DesqView. It is set by DvPifExecute. See Also: DvPifExecute Category: DesqView DvLoaded : Boolean Returns true if DesqView is loaded. The DeskView task number can be read through the variable TaskNumber. See Also: TaskNumber Category: DesqView DvMoveWindow (Handle,X,Y) Moves DesqView window upper left corner to position X,Y. Category: DesqView Computer Tyme * MarxMenu * Users Manual Page #148 ----------------------------------------------------------------- DvMyHandle : Number Returns the DesqView handle of the current process. See Also: DvLastHandle Category: DesqView DvPifExecute (Pif File) Executes another program under DesqView in another window. MarxMenu stays resident in its original window. The window executes according to the contents of the DesqView PIF file. The PIF file can be specified by using the full name. If you leave off the extension, MarxMenu assumes the extension DVP. If you pass a 2-character name, like the two characters in the DesqView menus, then MarxMenu will add -PIF.DVP to the name. If the PIF file is on the path, MarxMenu will find it. Warning! DesqView must be loaded to run this command. Example: DvPifExecute 'BD' DvPifExecute 'BD-PIF' ;These all execute Big DOS DVPifExecute 'BD-PIF.DVP' The task handle is loaded into a variable named DvLastHandle. When the program starts, it becomes the current top program. See Also: DvLoaded DvLastHandle Category: DesqView DvResizeWindow (Handle,Width,Height) Changes the size of a DesqView window. Category: DesqView DvSetBottom (Handle) Sets the program associated with the handle to the bottom of the task stack. See Also: DvSetTop Category: DesqView Computer Tyme * MarxMenu * Users Manual Page #149 ----------------------------------------------------------------- DvSetTop (Handle) Sets the program associated with the handle to be the top running task. Using DvMyHandle allows MarxMenu to regain control after starting another task. Example: DvSetTop (DvMyHandle) See Also: DvSetBottom DvLastHandle Category: DesqView DvUnFreeze (Handle) UnFreezes a program. The program starts executing again. See Also: DvFreeze DvPifExecute DvLastHandle Category: DesqView DvUnHide (Handle) Reverses the effect of DvHide making program output visible again. See Also: DvHide Category: DesqView EatKbdChar (On/Off) EatKbdChar controls the behavior of WaitOrKbdReady. If it is On (default) and a key is pressed the character will be absorbed from the keyboard buffer. If it is off the character is left in the buffer. See Also: WaitOrKbdReady Category: Keyboard EchoChar (On/Off) When used with Readln, EchoChar controls whether or not characters typed in will echo to the screen. Turning EchoChar Off is handy when entering a password. Example: var PassW EchoChar Off Write ' Password: ' PassW = Readln Computer Tyme * MarxMenu * Users Manual Page #150 ----------------------------------------------------------------- See Also: Readln Security Category: StringInput Else Starts lines executed if a condition is not true. Example: if X = 1 Writeln 'One' else Writeln 'Not One' endif See Also: If Then Endif ElseIf Category: Conditional ElseIf Used with IF, ELSE, and ENDIF in conditional statements. After one ElseIf is true, execution continues after the endif statement. Example: if X = 1 Writeln 'One' elseif X = 2 Writeln 'Two' elseif X = 3 Writeln 'Three' elseif X = 4 Writeln 'Four' else Writeln 'Other' endif See Also: If Then Endif Else Category: Conditional Computer Tyme * MarxMenu * Users Manual Page #151 ----------------------------------------------------------------- EmsInstalled : Boolean Returns True if EMS memory manager is installed. See Also: EmsVersion Category: System EmsOverlays Loads the MARXMENU.OVR file into EMS memory. This is useful when using MarxMenu to log into Netware or when you are using MarxMenu as an application and you want it to be able to access overlays without going to the disk drives. If successful, the variable RamOverlays is set to true. If RamOverlays is already True then EmsOverlays does nothing. Thus, you can run the command EmsOverlays and XmsOverlays and the first one that succeeds causes the second one to do nothing. Example: EmsOverlays XmsOverlays See Also: XmsOverlays RamOverlays Category: System EmsVersion : String EmsVersion returns the version of the EMS driver you are using. If EMS isn't present it returns an empty string. See Also: EmsInstalled Category: System EndComment Ends a comment block. Example: Comment ======================================= Everything between Comment and EndComment is ignored. ======================================= EndComment Computer Tyme * MarxMenu * Users Manual Page #152 ----------------------------------------------------------------- See Also: Comment Category: Misc EndIf Ends an if statement. Example: writeln "EndIf Example" if DayOfWeekof(Today)=2 ;Code Between IF Writeln 'This line will only print on Tuesdays' ;and ENDIF will endif ;run if cond=True writeln "This line will always execute" See Also: If Else ElseIf Then Category: Conditional EndLoop Ends a loop statement. See Also: Loop LoopIndex LoopLimit Category: Conditional EndOfFile (FileVar) : Boolean Returns True if you are at the end of the file. Example: Var In FileAssign (In,'C:\NOTES\READ.ME') FileOpen (In) While not EndOfFile (In) Writeln (FileReadLn (In)) EndWhile FileClose (In) Category: File Computer Tyme * MarxMenu * Users Manual Page #153 ----------------------------------------------------------------- EndProc Ends a Procedure. See Also: Procedure Return Category: Misc EndsWith (String) : Boolean EndsWith compares two strings and tests to see if one string ends with another string. Example: if IniString EndsWith 'NO' Writeln IniString endif See Also: StartsWith Contains Category: String EndWhile Ends a While statement. See Also: While Category: Conditional EnvExpandString (String) : String EnvExpandString will take a string that has environment variable referrences in it and substitute the environment variable for that part of the string. All commands with file or path referrences in MarxMenu use this function. Example: Writeln EnvExpandString 'F:\HOME\%USERNAME%\WINDOWS' ; returns F:\HOME\MARC\WINDOWS Category: Environment String Computer Tyme * MarxMenu * Users Manual Page #154 ----------------------------------------------------------------- EnvFree : Number Returns the free space in the selected environment. Example: if EnvFree Writeln "WARNING: Environment Memory Critically LOW!!!" endif See Also: EnvSize Category: Environment EnvSize : Number Returns the size of the selected environment. Example: if EnvSize < 20 Writeln 'Your environment size is less than 20 bytes!!' endif See Also: EnvFree Category: Environment EraseWinAfterOvr (On/Off) After an overlay executes, MarxMenu by default erases all the windows the overlay created. If you don't want MarxMenu to erase these windows, set EraseWinAfterOvr to Off. Category: Display EraseTopWindow Erases the last window created with DrawBox. See Also: EraseWindow Category: Display EraseWindow (Number) Erases a window by number. This allows you to erase a window that is not the top window. See Also: CurrentWindow SetTopWindow EraseTopWindow Computer Tyme * MarxMenu * Users Manual Page #155 ----------------------------------------------------------------- Category: Display Execute ("command string") This allows you to execute a program without dropping out of MarxMenu. MarxMenu remains resident in memory and takes up approximately 100k. No batch file will be created by MarxMenu. This is handy if you have a small program you want to run from the menu but don't want to allow for the time required by MarxMenu to create and run a batch file. You can also execute some programs in a MarxMenu window (See Also: DosWindow). You can also execute a program and examine the return code. This command can be placed in a progression of menu commands without any special handling. Under an OnKey statement, you will need use a vertical bar in front of the command. Example: OnKey 'D' |UseCommand Off |Execute 'C:\DM.COM' ;Note the COM extension is required here. Note: If UseCommand is True or On, MarxMenu will load COMMAND.COM to execute your command. If UseCommand is False, MarxMenu will execute your file directly without COMMAND.COM. Using COMMAND.COM will execute slightly slower, use 3.5k more RAM, and allow you to use command lines just like you would from the DOS prompt. If you set UseCommand to Off, you will have to include the COM or EXE extension in the name. If you don't include the extension, MarxMenu will automatically override UseCommand and load the command processor. If the command processor is loaded then you won't be able to read the errorlevel return code from the program you are running. MarxMenu will also use COMMAND.COM if you are piping or redirecting output to a file. COMMAND.COM is required when running internal DOS commands like COPY or DIR. It is also required to run batch files. When UseCommand is off, MarxMenu will search the PATH for the executable file if it isn't in the current directory. Not using COMMAND.COM allows you to use the ReturnCode variable to get the ERRORLEVEL from the subprogram. If COMMAND.COM is loaded, the ERRORLEVEL of the subprogram is lost. The ClearScreenFirst (On/Off) controls whether MarxMenu will clear the screen before you execute. Computer Tyme * MarxMenu * Users Manual Page #156 ----------------------------------------------------------------- The PauseAfterExecute (On/Off) allows you to have a pause like the Pause command in batch files. That way you can read the screen before it restores the MarxMenu screen. MarxMenu will display "Press any key to return to MarxMenu." By setting DosWindow to true MarxMenu will allow some programs to execute with the display going to a MarxMenu window. For this to work the program must output it's text to the standard output device. Programs that write directly to the screen won't work with DosWindow. When Swapping is set to On, MarxMenu will swap itself out to EMS, XMS or disk reducing it's memory footprint to about 5k of ram. If MarxMenu uses a disk file, the file name is the same as the temporary batch file name with the extension SWP. Be sure not to load any TSR programs using the Execute command or MarxMenu will lock up. See Also: UseCommand DosWindow PauseAfterExecute ClearScreenFirst See Also: Swapping ReturnCode Category: Execution ExistDir (Directory) : Boolean Used to test whether or not a DIRECTORY exists. It can also test to see if a disk is inserted in a floppy drive or if a drive exists. Example: if not ExistDir 'A:' then Writeln 'Insert disk in drive A:' See Also: ExistFile Category: Directory ExistFile : Boolean Used to test whether or not a file or device exists. Example: ExistFile 'MARXMENU.EXE' ExistFile 'LPT2' ;returns true if LPT2 device exists See Also: ExistDir Category: File Computer Tyme * MarxMenu * Users Manual Page #157 ----------------------------------------------------------------- ExistOnPath (String) : String Used to search the existing paths for the command to be executed by Execute or other function. Example: OnKey 'D' |Execute(ExistOnPath('DM.COM')) If the file is not found, a null string is returned. Category: File ExitCode This can be set so MarxMenu will return an ErrorLevel that can be used in a batch file. Example: ExitCode = 100 When MarxMenu exits it will use ErrorLevel 100. Category: Execution ExitMenu (Command) Causes MarxMenu to exit. If the Bat command is used or batch commands are used under an OnKey statement then MarxMenu will create a batch file and set the environment variable MXCMD to point to it. If no batch file is to be created, and MXCMD hasn't been set to any value then the menu system will exit by setting MXCMD to MXSTOP. ExitMenu is normally used without a command. If you use an optional command with ExitMenu then MarxMenu will run the command and not come back to the menu. Example: ExitMenu 'DIR /W' Category: Execution Exp (Real) : Real Returns the Exponential of a real. Inverse of Ln. Category: Math Float Computer Tyme * MarxMenu * Users Manual Page #158 ----------------------------------------------------------------- Explode (On/Off) Turn exploding windows On/Off. Example: Explode Off ;Box just appears! DrawBox 1 1 10 15 Explode On ;Box grows on screen. Drawbox 20 1 10 15 Category: Display ExplodeDelay (Number) Sets the speed of exploding windows. Use this command to adjust the speed of the exploding windows. Default is 15. Category: Display Extension (String) : String Returns the Extension of a file name or sets the Extension. Example: Writeln Extension 'MARXMENU.EXE' ;returns 'EXE' Example: var FileName FileName = 'TEST.MNU' Extension (FileName) = 'MRX' Writeln FileName ;this returns 'TEST.MRX' See Also: NamePart PathPart FilePart Category: String FileAppend (FileVar) Opens a file for access and moves the file pointer to the end of the file. File writes will start at the end of the file. Example: var LogFileName FileAssign(LogFileName,'USER.LOG') ; Assign a filename FileAppend(LogFileName) ; Use FileAppend move to EOF FileWriteLn(LogFileName,"This is a test") ;Write to file FileClose(LogFileName) ;Close File Computer Tyme * MarxMenu * Users Manual Page #159 ----------------------------------------------------------------- See Also: FileOpen Category: File FileAssign (FileVar,String) Assigns a file variable to a file name. Files must be given a name before they can be accessed. Example: FileAssign(BatFile,'MARX.BAT') BatFile is a variable and after the FileAssign, it becomes a file variable. All access to the file must be done using the file variable. If an empty string is passed as the filename, MarxMenu will use the standard console file handles. See Also: FileOpen Category: File FileAttr (String) : Number Returns the attribute of a file or directory. It can also be used to set the file attributes. Example: ; ATTRDISP.MNU ; ATTRIBUTE BYTE DISPLAY PROGRAM ; Using the FileAttr command. USAGE: "MARXMENU ATTRDISP Filename" var Temp Temp = BinString(FileAttr(Cmdline),8) Writeln "Menu FileName: " + Cmdline + " " + Temp Writeln " " if mid(Temp,8,1)="1" then Writeln "READ-ONLY FLAG SET" if mid(Temp,7,1)="1" then Writeln "HIDDEN FLAG SET" if mid(Temp,6,1)="1" then Writeln "SYSTEM FLAG SET" if mid(Temp,3,1)="1" then Writeln "ARCHIVE BIT SET" FileAttr ('MARXMENU.OVR') = 1 ;sets to read-only Category: File Computer Tyme * MarxMenu * Users Manual Page #160 ----------------------------------------------------------------- FileClose (FileVar) Closes a file and deallocates the memory space used by the file variable. See Also: FileOpen FileAssign Category: File FileCreate (FileVar) Creates a new file. If the file exists, it overwrites the old one. FileCreate opens the file for output. Do not use FileOpen with FileCreate. See Also: FileWriteln FileAssign Category: File FileDate (String) : Number Returns file date as 32 bit integer. See DOS manual for date structure. This function should not be confused with FileTime which is compatible with all other MarxMenu time commands. See Also: FileTime Category: File FileFlush (FileVar) Writes any information that is in the file buffers to disk. See Also: FileWriteln FileAssign Category: File FileLog (FileName,String) FileLog opens the file if it exists, or creates it if it doesn't exist. It then seeks to the end of the file and writes the string to the end. The file is then closed. FileLog is typically used for things such as usage tracking. Example: FileLog('USAGE.LOG','Add This Line!') Category: File Computer Tyme * MarxMenu * Users Manual Page #161 ----------------------------------------------------------------- FileOpen (FileVar) Opens a file for access. FileOpen is not needed if you are using the ReadTextFile command. The following example copies a text file. var Inp Out St FileAssign(Inp,'INPUT.TXT') FileOpen(Inp) FileAssign(Out,'OUTPUT.TXT') FileCreate(Out) while not EndOfFile(Inp) St = FileReadln(Inp) FileWriteln(Out,St) endwhile FileClose(Inp) FileClose(Out) Category: File FilePart (String) : String Returns the file part of a filename. Example: NamePart ('C:\MARX\MARXMENU.EXE') ;returns MARXMENU.EXE See Also: Extension PathPart NamePart Category: String FilePos (FileVar) : Number Returns the current file position in bytes of where you are in a file that you are reading or writing. You can get back to the same place in the file by using FileSeek. See Also: FileSeek Category: File FileReadln (FileVar) : String Reads one line of an open file returning that line as a string. Example: Line3 = FileReadln(BatFile) Computer Tyme * MarxMenu * Users Manual Page #162 ----------------------------------------------------------------- See Also: FileOpen Category: File FileRename (Old,New) Renames a file from old name to new. A file may be moved to a new directory with this command. Example: FileRename ('F:\HOME\MARC\MESSAGE.TXT','F:\HOME\VICKI\MESSAGE.TXT') Category: File FileResult : Number Returns result code from last file IO. Result codes are the same as Turbo Pascal IOResult codes. These codes usually match the errors returned in the AX register of DOS commands. 0 indicates no problem. Example: DelFile 'TEST.TXT' if FileResult = 5 then Writeln 'ACCESS DENIED!' Category: File FileSeek (FileVar,Number) Moves the file pointer to a specified place in the file. This allows you to set the next place in a file that FileReadln will read from. See Also: FilePos FileReadln Category: File FileSize (String) : Number Returns size of file in bytes. Example: FileSize 'CONFIG.SYS' Category: File Computer Tyme * MarxMenu * Users Manual Page #163 ----------------------------------------------------------------- FileTime (File) : Time Returns the time of a file in MarxMenu format. This should not be confused with FileDate that returns the file time on DOS binary format. Category: File Time FileWrite (FileVar,String) Writes text to a file without a carriage return or line feed. Example: FileWrite (Out,Char(12)) ;writes a FormFeed to the file Out See Also: FileOpen Category: File FileWriteln (FileVar,String) Writes text to a file with a carriage return and a line feed. Example: FileWriteln (Out,'This Line') See Also: FileOpen Category: File FixPath This command reads your path command and verifies that all the paths are accessible. Any path that isn't accessible is removed from the master environment. This can be used on network drives to eliminate searching paths on fileservers that are no longer accessible. On a Novell network, FixPath also sets the search drive table. Category: Environment Floppies : Number Returns number of floppy drives in your computer. Category: System Computer Tyme * MarxMenu * Users Manual Page #164 ----------------------------------------------------------------- ForceExplosion (On/Off) This changes the explosion status of a window that already exists. This allows windows to implode that didn't explode. Category: Display ForceExtension (String,Ext) : String This command forces a file extension on a string. Example: St = ForceExtension('MAIN.MNU','MRX') This sets St equal to MAIN.MRX See Also: DefaultExtension Category: String Forever Forever is part of a loop Repeat -- Forever. Forever is an unconditional jump to Repeat. Example: Repeat [statement] [statement] Forever See Also: Repeat Until Category: Conditional FormatNum (Real,Format) : String Form converts a real number to a string in a specific format which is controlled by a format string. The characters of the string control the decimal places, size of the string, and money signs. # A digit position, blank if not available. * A digit position, fill with asterisk if not available. @ A digit position, fill with zero if not available. $ A digit position, activating a floating dollar sign. - A sign position, needed if * or @ digits used exclusively. + A sign position, shows '+' for positive numbers as well. , A decimal comma or a separator comma. . A decimal period or a separator period. Computer Tyme * MarxMenu * Users Manual Page #165 ----------------------------------------------------------------- Example: Writeln FormatNum(Pi,'#.#####') ;returns 3.14159 Category: Float String Fraction (Real) : Real Returns the fractional part of a real. Example: Fraction (2.36) ;returns .36 Category: Math Float FreeDiskSpace (Drive) : Number Returns free disk space in bytes. If ResultsInK is set to True then the value is returned in K (1024 Bytes). Example: Writeln (FreeDiskSpace 'C') FreeDiskSpace only looks at the first character of the string for the drive letter. See Also: UsedDiskSpace TotalDiskSpace ResultsInK Category: System FreeEMS : Number Returns free EMS memory in bytes. Category: Memory FreeMem(Segment) FreeMem deallocates memory that was allocated with GetMem. FreeMem automatically knows how much memory to deallocate. See Also: GetMem Category: Memory Computer Tyme * MarxMenu * Users Manual Page #166 ----------------------------------------------------------------- FreeMemory : Number Returns the amount of free memory still available. This is the memory available to MarxMenu or the amount you would have using the Execute command. See Also: ApplicationMemory Category: Memory FreeXMS : Number Returns free XMS memory in bytes. Category: Memory FullLineReturn (On/Off) The FullLineReturn command is a control parameter affecting the Readln command. When set to On, subsequent Readlns will auto-force a carriage return when a user reaches the last character of the input field. See Also: Readln Category: StringInput GetMem (Number) : Segment GetMem allocates the amount of memory specified in Number and returns the memory segment where the memory was allocated. The memory segment is filled with 0s. The maximum size of the memory block is 65504 bytes. You can then read and write to this memory area using the Mem commands. Example: var RamBlock RamBlock = GetMem(2000) ;allocate 2000 bytes of memory Mem(RamBlock,0) = 5 ;writes the number 5 to the first byte See Also: FreeMem Category: Memory Computer Tyme * MarxMenu * Users Manual Page #167 ----------------------------------------------------------------- GotoXY (Column,Row) Move cursor to location column,row in current box. Example: GotoXY 35 9 Category: Display Ansi Hash (String) Hashing strings is a very fast way to find a string in a list of strings. It is much faster than a binary search. In MarxMenu, I've implemented hashing in a way that is very innovative. What I do is to associate a hashed string with a MarxMenu variable that is dynamically allocated. The string becomes the key to access the variable for either reading or writing. Example: Hash('AGE') = 21 Hash('HAIR') = 'Brown' Writeln Hash('AGE') ;returns 21 Writeln Hash('HAIR') ;returns 'Brown' In the above example, a variable accessed by Hash('AGE') is created and set to the value 21. Like any other variable it can be read or overwritten with a new value. What is happening here is that we are giving MarxMenu variables a name, which is a string they can be accessed by for either read or write. This allow you to build applications that data and procedures can be accessed through their own vocabulary that you create. Category: HashVars HashDispose (String) HashDispose allows you to remove a name from the hash dictionary and dispose of the value associated with that name. Example: HashDispose('AGE') See Also: Hash HashDisposeLevel HashDisposeAll Category: HashVars Computer Tyme * MarxMenu * Users Manual Page #168 ----------------------------------------------------------------- HashDisposeAll HashDisposeAll removes all names from the hash dictionary and disposes all associated variables. See Also: Hash HashDispose Category: HashVars HashDisposeLevel (Number) HashDisposeLevel is used to dispose of all hash variable names created with a specific hash level. This allows you to create classes of named variables and get rid of a specific class in one step. Example: HashDispose(5) ;disposes all names created with HashLevel 5 See Also: Hash HashDispose HashDisposeAll HashLevel Category: HashVars HashLevel : Number HashLevel is a number that allows you to segment strings into separate categories for the purpose of later disposing of a group of strings by level number. HashLevel defaults to 1. All hashed variable names are tagged with the current value of HashLevel. Example: HashLevel = 2 See Also: Hash Category: HashVars HashLib (Array,Level) HashLib returns the list of all know hash names in the hash dictionary associated with a specific hash level. If level 0 is passed, all names are returned. Example: Var Lib HashLib(Lib,0) Loop Lib Writeln LoopVal EndLoop Computer Tyme * MarxMenu * Users Manual Page #169 ----------------------------------------------------------------- See Also: Hash Category: HashVars HexString (Number, Length) : String HexString converts a number into a base 16 hexadecimal string. If Length > 0 then the number will have enough leading zeros to make it Length long. If Length = 0 then leading zeros are removed. Length must be 8 or less. Example: Writeln HexString(253,4) ;returns 00FD Writeln HexString(253,0) ;returns FD See Also: BinString Category: String HiddenAndSystem (On/Off) Controls if ReadDirectory will read hidden and system files. See Also: ReadDirectory Category: File Directory HighWord (Number) : Number Returns the value of the upper 16 bits of a number. See Also: LowWord Category: Math Hour : Number Return the current hour. 24 hour format. Category: Time HourOf (Date) : Number Returns the hour of a date. If Date is passed as a string it is converted automatically. Example: HourOf '6:00 pm' ;returns 18 Computer Tyme * MarxMenu * Users Manual Page #170 ----------------------------------------------------------------- See Also: TimeOf BadDate Category: Time Hundredth : Number Returns the 1/100 of a second from the system clock. Note that the system clock timer tick is 1/18 second so don't expect a lot of accuracy here. Category: Time IdleProgram : Procedure IdleProgram is a variable that when set to the location of a procedure allows the procedure to run while waiting at the keyboard. This is done by writing a procedure that will run while waiting for input. The way you use this is to set an internal variable named IdleProgram to the Loc of the procedure you want to run as follows: Example: IdleProgram = Loc MyProcedure Note: Do not use parentheses around MyProcedure. When writing MyProcedure make it as short and quick as possible. As of now, MyProcedure is called continuously while there is no keyboard input. You can also use a loop in it as follows. Procedure MyProcedure SetItUp while not KBDReady {do your thing} endwhile PutItBack EndProc MarxMenu doesn't automatically exit your procedure or save and restore anything. If you're writing to the screen you have to put everything back the way it was. If you want to run a program at a specific time, here's how it can be done: Procedure MyProcedure if Now = TimeOf('11:00pm') Bat 'NIGHT' ;run NIGHT.BAT ExitMenu endif if Now = TimeOf('5:00') Bat 'MORNING' ;run MORNING.BAT ExitMenu endif EndProc Computer Tyme * MarxMenu * Users Manual Page #171 ----------------------------------------------------------------- To disable IdleProgram run: Dispose(IdleProgram) See Also: Run Loc BlankScreenProgram Category: Execution If Used for conditional program control. Usage: IF condition THEN statement IF condition THEN statement ELSE statement IF condition statement statement ELSEIF condition statement statement ELSE statement statement ENDIF Category: Conditional See Also: Else ElseIf Then EndIf InactiveBox (BoxType) This is used to select the type of box border to use when a window is not the current window. If any inactive box type is specified, then when you execute another DrawBox, the old window's border changes to the inactive box type. The inactive window also loses its headers and shadows. Note that InActiveBox must be used BEFORE the DrawBox command. Example: InActiveBox (SingleLineBox) ;switches to single line box if inactive. Computer Tyme * MarxMenu * Users Manual Page #172 ----------------------------------------------------------------- InactiveBox (NoBoxBorder) ;disables InActive effect. See Also: InactiveBoxColor InactiveShadow Category: Display InactiveBoxColor (Foreground,Background) Selects the color of the inactive box window. If Black on Black is selected, (default), the inactive box color is the same as the active box color. Example: BoxBorderColor Yellow Blue InActiveBoxColor Brown Blue See Also: InactiveBox InactiveShadow Category: Display InactiveShadow (On/Off) When InactiveShadow is set to Off, the window shadow disappears when then window is not the top window. See Also: InactiveBox InactiveBoxColor Category: Display Include (MenuName) This is used to insert the menu code from another file into the menu that you are compiling. Example: Include 'DOS.MNU' This will compile DOS.MNU into your present menu as if that whole file were part of the menu you are working on. This is useful if you have several menus that share common code. By moving this common code to a separate file, and using an Include statement, you can change the common code and update several menus at once. If you are using overlays, it is a good idea to put your shared variables in an Include file. This assures that the shared variables will be the same for all overlays. Changing an Include file does not cause MarxMenu to recompile automatically like changing the MNU does. You will have to force it to compile your menus. Computer Tyme * MarxMenu * Users Manual Page #173 ----------------------------------------------------------------- This can be done several ways. You can type MARXCOMP (menu) or you can just type DEL *.MRX which will cause all the menus to recompile the next time they are run. Category: Misc IncludeDirectories (On/Off) Controls if ReadDirectory will read directories along with file names. Please note that the Parent Directory [..] will not be shown. Example: Var X IncludeDirectories On DirectoriesOnly on ReadDirectory('*.*',X) See Also: ReadDirectory Category: Directory InFile : String When using StandardIO the input and output files by default use the console. The input can be overridden by setting InFile to point to a different file or device. Example: InFile = 'INPUT.TXT' StandardIO See Also: OutFile StandardIO Category: File InitialCursorPos (Byte) When inputting a string using Readln, MarxMenu positions the cursor at the beginning of the string if the InputString variavle is set. You can override this by setting InitialCursorPos to a value other than 1. InitialCursorPos can be set to a value beyond the end of the string. After input, InitialCursorPos is set back to 1. Example: InputString = '1234' InitialCursorPos = 3 ;starts at 3rd character InitialCursorPos = Length(InputString) + 1 ;starts at end of string St = Readln Computer Tyme * MarxMenu * Users Manual Page #174 ----------------------------------------------------------------- See Also: Readln Category: StringInput InMem (TsrName) : Boolean Inmem returns true if the TSR you are looking for is loaded. This allow you to do conditionals based on the presence or absence of a TSR. It will also check for the names of pending batch files. Example: if not InMem('BTRIEVE') Bat 'BTRIEVE.EXE' endif See Also: MemoryLoc Category: Memory InputBlankChar InputBlankChar is used with Readln to display the input string area for entering information into a string. By default it is set to a space character but can be set to an underline or other characters to make the field size visible. Example: InputBlankChar = '_' ;underline InputLength = 10 Write 'Enter Postal Code: ' ZipCode = Readln See Also: Readln Category: StringInput InputLength When using Readln to get input from the keyboard, MarxMenu normally accepts data from the cursor to the edge of the current window. By setting InputLength to a value, MarxMenu will limit the size of the data to a specific length. Example: InputLength = 10 Write 'Enter Postal Code: ' ZipCode = Readln Computer Tyme * MarxMenu * Users Manual Page #175 ----------------------------------------------------------------- InputLength is reset to 0 after each Readln. See Also: Readln Category: StringInput InputRedirected : Boolean InputRedirected returns True if you are using the dos piping commands to pipe output into MarxMenu. See Also: OutputRedirected Category: System InputString (String) Preloads a string for the Readln command. The next Readln will have the InputString on the screen for you to edit or accept. Once Readln executes, InputString is cleared to a blank string. Example: InputString = ReadEnv('USERNAME') YourName = Readln See Also: Readln Category: StringInput Insert (InsString,OrigString,Pos) Inserts a string into another string at position. If the position is greater than the length of the string, the string will be padded with blanks on the right. Example: St = 'ABCDEF' Insert('123',St,4) ;returns 'ABC123DEF' St = 'ABCDEF' Insert('123',St,8) ;returns 'ABCDEF 123' Category: String Computer Tyme * MarxMenu * Users Manual Page #176 ----------------------------------------------------------------- InsertMode (On/Off) Turns insert mode On and Off for Readln commands. See Also: Readln Category: StringInput Int (Real) : Real Returns the integer part of a real as a real. Example: Int(2.36) ;returns 2.0 Category: Math Float Integer (Real) : Number Returns the integer part of a real as an integer. The fractional part is truncated. Example: Int(2.36) ;returns 2 Category: Math Float InterpretCounter : Number InterpretCounter is a number that is incremented by 1 every time you execute NextWord. This allows you to tell which word in a string that you are on. Example: if InterpretCounter = 1 ... else ... endif See Also: NextWord Category: String Computer Tyme * MarxMenu * Users Manual Page #177 ----------------------------------------------------------------- Intr (Interrupt,Registers) Intr works just like MS-DOS except that it lets you choose which interrupt you want to call. See MS-DOS manual for Details. See Also: MS-DOS Category: System InverseColor (Foreground,Background) Sets colors for inverse bar used with UseArrows command. Example: InverseColor Yellow Mag Category: Color InvertString (String) InvertString turns a string around so that characters are in reverse order. This allows for correct string compares and sorts in Hebrew and Arabic and other languages that are read from right to left. Example: var St St = 'ABCDE' InvertString(St) Writeln St ;Returns 'EDCBA' Category: String IpxLoaded : Boolean Returns True if IPX is loaded Category: Novell Jump (Menu) Jumps to another menu and does not return to original menu. Example: Jump 'MYMENU' See Also: Chain Category: Execution Computer Tyme * MarxMenu * Users Manual Page #178 ----------------------------------------------------------------- KbdReady : Boolean Returns true if a Key has been pressed. See Also: ReadKey Category: Keyboard KeyEvent (Key) : Procedure KeyEvent allows you to assign a procedure to a key so that any time the key is pressed the procedure is called. Setting a key to Nil clears the key. This command can be used to create global OnKey. Example: KeyEvent(F1) = loc ShowHelp ;runs ShowHelp when F1 is pressed KeyEvent(F1) = Nil ;clears F1 key Run KeyEvent(F1) ;executes procedure assigned to F1 KeyEvents are attached to the current window. New windows inherit the KeyEvents from their parent window. But if you create a new KeyEvent in a window and then erase that window the new KeyEvent is erased and the KeyEvents of the parent window are restored. You can have completely different KeyEvents for each window and those events become active whenever the window becomes active. See Also: ClearKeyEvents Category: Execution Event KeyFromMouse : Boolean Normally mouse activity is translated into keystrokes. This variable is set to true if the keystroke came from the mouse. See Also: KbdReady ReadKey Category: MouseControl KeySave : String Stores your keystrokes that you pressed to get to the menu level where you are at. KeySave is passed to DOS using the SET KSV= command to store your position in the menu system. To make this work, you must execute SavePosition On. This variable can be set by you to force MarxMenu to return to a place in the menu other than where you are. This allows MarxMenu to suggest a next step. Computer Tyme * MarxMenu * Users Manual Page #179 ----------------------------------------------------------------- See Also: SavePosition MenuKeyBuffer Category: String Environment Execution KillMusic This command stops the music and de-allocates the memory used by the music buffer. Category: Music LastDrive : String Returns the drive letter of the last local drive in the system as set by CONFIG.SYS. By default, this is drive letter E. On a Novell network the drive after LastDrive is the first network drive. Category: Novell System LastKey : String LastKey returns the last key that was typed at the keyboard. This can be used after a Readln to determine if the ESC key was pressed or perhaps the up or down arrow keys. Sometimes after the press of an ESC key, MarxMenu wants to exit more levels than you want it to. This can be controlled by setting LastKey = ' ' to stop the abort process. See Also: Readln OnKey Category: String Left (String,Count) : String Returns string starting at the beginning for count characters. Example: Left('ABCDEF',3) ;returns 'ABC' Category: String Length (String) : Number Returns the length of the string or sets the length of a string. Example: Length('ABCD') returns 4. Computer Tyme * MarxMenu * Users Manual Page #180 ----------------------------------------------------------------- Example: var St St = '123456' Length(St) = 3 Writeln St ;this produces '123' If you set the length longer than the original string the string is padded with blanks on the end. Category: String LeftOfEqual (String) : String LeftOfEqual returns that part of the string that is left of the equal character (includes the equal character itself) and with the leading spaces trimmed off. Example: Writeln LeftOfEqual('Device=VIPX.386') ;returns 'Device=' See Also: RightOfEqual Category: String Ln (Real) : Real Returns the Natural Logarithm of a real. Example: Exp(Ln(5) * 3) = 125 See Also: Exp Category: Math Float Loc (Procedure or Variable) When used with a procedure, Loc returns the location of a procedure for storing in a variable. The variable is later executed using the Run command. When used with a variable, Loc returns the location of a variable rather than it's contents. Thus B = Loc A sets B to point to A. Example: Var A B B = Loc A B = 9 Writeln A ;returns 9 Computer Tyme * MarxMenu * Users Manual Page #181 ----------------------------------------------------------------- Example: Var A TestLoc (Loc A) Writeln A ;returns 9 Procedure TestLoc (B) B = 9 EndProc The rule is that all indirect location references are resolved in the process of evaluating an expression. Example: Var A B C D B = Loc A C = Loc B D = Loc C D = 9 Writeln A ; Returns 9 As you would expect, qualifiers and multidimensional array addressing works with indirect addressing. Example: var A B C D E A[3] = 12 C = 3 B = Loc C D = Loc E D[7] = 8 TestLoc (Loc A[B]) Writeln A[B,9,E[7]] Procedure TestLoc (X) Writeln X X[9,D[7]] = 6 Writeln X[9,E[7]] EndProc See Also: Run Actual Category: Variable Computer Tyme * MarxMenu * Users Manual Page #182 ----------------------------------------------------------------- Local : Array Parameters passed to procedures and local variables in a procedure are elements of an array of local variables. By using the word Local you can address passed parameters and local variables as if they were elements of an array. Example: Procedure Test (A,B) var C,D Writeln A B C D EndProc In the above example the variable A is the same as Local[1], B is Local[2], C is Local[3], and D is Local[4]. The Local command can be used to pass a varying number of parameters to a procedure as follows: Example: Procedure Test Loop Local Writeln LoopVar endloop EndProc Test (1,2,3,4) This allows the procedure Test to accept and process any number of parameters you wish to pass to it. Category: Array LockWord (word) Sets a default word for the console activated keyboard lock. When the screen goes blank, the user has to type the LockWord to unblank the screen. This is a security feature so that if a user leaves the menu unattended, it prevents others from tampering with the system. Example: LockWord = 'secret' See Also: LogoffTime BlankTime UseNovPassword Category: Display Computer Tyme * MarxMenu * Users Manual Page #183 ----------------------------------------------------------------- Logoff Logoff logs you off the network the same way that LogoffTime does except it does it immediately. See LogoffTime for details as to how. Example: OnKey 'L' |Logoff ;note the use of the '|' under the OnKey statement See Also: LogoffTime Category: Execution LogoffTime : Number MarxMenu supports automatic logoff after a number of minutes of inactivity set by LogoffTime. This only has effect while you are in the menu and not while an application is running. It is set as follows: LogoffTime = 5 ;sets time to 5 minutes Setting LogoffTime to 0 disables this feature. On a Novell network the current drive is changed to the first network drive letter. Any map roots on this drive are removed. Then it changes to the \LOGIN directory. Typically the current directory will be set to F:\LOGIN. MarxMenu will first look for a batch file in the \LOGIN directory called OFF.BAT. If it doesn't find it, MarxMenu will look for OFF.BAT on the PATH. If this isn't found, MarxMenu will look for LOGOFF.EXE. If this isn't found, then MarxMenu will look for LOGOUT.COM. LOGOFF.EXE and LOGOUT.COM are executed by stuffing the keyboard buffer. The best way to use this feature is to create an OFF.BAT file in your \LOGIN directory or on the PATH. Logging off is a tricky process and requires that everything is done right in order for it to work. If strange things happen use ECHO ON and PAUSE in your batch files in order to watch what is happening. See Also: LockWord Logoff Category: Execution Computer Tyme * MarxMenu * Users Manual Page #184 ----------------------------------------------------------------- Logout Same as Logoff. See Also: Logoff LogoffTime Category: Execution LongestLine This system variable is set whenever a text file is read using the ReadTextFile command. LongestLine is set to the length of the longest line in the file. Example: var temp, temp2 write "Name of file to scan: " temp=readln ReadTextFile(temp,temp2) writeln " " write "The longest line in " temp " is " writeln Longestline " Characters." See Also: ReadTextFile Category: String LongestString (Array) : Number LongestString returns the length of the longest string in an array of strings. Example: var X ReadTextFile('MARX.BAT',X) Writeln LongestString (X) Category: String Array Loop MarxMenu has a looping structure that lets you execute a piece of code a specific number of times. It is used as follows: Example: Loop 8 Writeln 'Pass Number ' LoopIndex EndLoop Computer Tyme * MarxMenu * Users Manual Page #185 ----------------------------------------------------------------- You start with LOOP (Number) which specifies the number of times to execute the code between LOOP and ENDLOOP. There are 2 variables available here for loop control. LoopIndex starts at 1 and is incremented at each EndLoop. When LoopIndex becomes greater than LoopLimit, the loop exits. LoopIndex and LoopLimit refer to the innermost loop. As loops are nested LoopIndexes and LoopLimits are kept in two arrays; LoopIndexStack and LoopLimitStack. There is also a variable called LoopLevel which points to the current loop parameters. Thus: LoopIndex is the same as LoopIndexStack[LoopLevel] LoopLimit is the same as LoopLimitStack[LoopLevel] You may therefore access outer loop parameters through the loop stacks. For instance LoopIndexStack[LoopLevel - 1] would refer to the second innermost loop index. LoopIndexStack[1] refers to the outermost loop. The loop variables can be read and written to so you can adjust the looping parameters while inside the loop. You can even adjust the parameters of outer loops. You can also pass an array to a loop instead of a number. If an array is passed MarxMenu will loop for the number of elements in that array. Example: Var X ReadTextFile('MARXREAD.ME',X) OpenPrinter ;Loop X is the same as Loop NumberOfElements X Loop X PrintLn LoopVal EndLoop ClosePrinter You can specify a start and end of the loop: Example: Loop 5 10 Writeln LoopIndex EndLoop This will loop starting at 5 and ending at 10. If you also specify and array variable, you can loop through a section of the array. Computer Tyme * MarxMenu * Users Manual Page #186 ----------------------------------------------------------------- Example: Loop 3 9 MyArray Writeln LoopVal EndLoop In the above example, MarxMenu will write out the loop values for elements 3 thru 9 of MyArray. See Also: EndLoop LoopIndex LoopLimit LoopLevel Category: Conditional LoopIndex : Number Returns the index of the loop you are in. Example: Loop 5 Writeln LoopIndex ;writes the numbers 1 to 5 EndLoop See Also: Loop EndLoop LoopLimit LoopLevel LoopVal Category: Conditional LoopLevel : Number Returns the number of nested loops currently running. This includes all nested loops not just the current procedure. See Also: Loop EndLoop LoopLimit LoopIndex Category: Conditional LoopLimit : Number Returns the upper limit of the loop you are in. Example: Loop 5 Writeln LoopLimit ;writes the number 5, 5 times. EndLoop See Also: Loop EndLoop LoopIndex LoopLevel Category: Conditional Computer Tyme * MarxMenu * Users Manual Page #187 ----------------------------------------------------------------- LoopVal LoopVal returns the current variable in a Loop EndLoop when the loop is started using an array. Example: var X ReadDirectory X Loop X LoopVal = CleanFileName LoopVal Writeln LoopVal EndLoop LoopVal can be read or written to. It can be indexed or used with qualifiers. Any function that can be used with variables can be used with LoopVal. With nested loops, LoopVal always references the innermost loop. See Also: LoopIndex Category: Conditional LowerCase (String) : String Returns the lower case of the string according to international character rules. Example: Writeln LowerCase('ABCDE') ;returns 'abcde' See Also: UpperCase Category: String International LowWord (Number) : Number Returns the value of the lower 16 bits of a number. Example: LowWord -1 ;returns 255 See Also: HighWord Category: Math Computer Tyme * MarxMenu * Users Manual Page #188 ----------------------------------------------------------------- MachineName : String This reads or sets the MachineName for NetBios networks. Example: MachineName = IBM ;sets the MachineName Writeln MachineName ;displays the MachineName Category: Novell MSNet Vines MakeListEntry (Local Name, Server Name) MakeListEntry adds an entry to the network redirection list for assigning drive letters to network servers or redirecting printer output to network printers. Example: MakeListEntry ('P:','\\TYME\SYS\PUBLIC') MakeListEntry ('LPT1','\\TYME\LASER') See Also: AssignList CancelListEntry Category: Novell MSNet Vines MarxVersion : String Returns the version number of the MarxMenu you are running. Category: String MasterEnvironment MasterEnvironment selects the Master Environment for use with environment access commands. See Also: ReadEnv SetEnv ReadEnvironment ShellEnvironment See Also: CurrentEnvironment ParentEnvironment Category: Environment Max (Num,Num) : Num Returns the largest of two numbers or strings. Example: Writeln Max(2,3) ;returns 3 See Also: Min Computer Tyme * MarxMenu * Users Manual Page #189 ----------------------------------------------------------------- Category: Math String Float MatrixInvert (2D Array) MatrixInvert reverses the coordinates of a 2-dimensional array. This is useful when used with ReadAscTextFile to reverse the field and record layout. Example: var Data NameList ReadAscTextFile('PHONE.LST',Data) MatrixInvert Data NameList = Data[1] Category: Array McpClass : Number Returns the math coprocessor class. 0 = None 1 = 8078 2 = 80287 3 = 80387 4 = 80487 (486 CPU) See Also: McpName CpuClass Category: System McpName : String Returns the name of the marh coprocessor. If there is no math coprocessor then an empty string is returned. Names include: 8078, 80287, 80387, 80487 See Also: McpClass CpuName Category: System Mem (seg,ofs) : Number Returns the byte at memory location seg:ofs or lets you write to the byte at seg:ofs. Example: X = Mem(40,5) ;reads memory into X Mem(40,5) = X ;writes X into memory Computer Tyme * MarxMenu * Users Manual Page #190 ----------------------------------------------------------------- See Also: MemW MemL Category: Memory MemL (seg,ofs) : Number Returns the long integer at memory location seg:ofs or lets you write to the byte at seg:ofs. Example: X = MemL(40,5) ;reads memory into X MemL(40,5) = X ;writes X into memory See Also: Mem MemW Category: Memory MemSize : Number Returns total memory size in K. (640 = 640k) Category: Memory MemW (seg,ofs) : Number Returns the word at memory location seg:ofs or lets you write to the byte at seg:ofs. Example: X = MemW(40,5) ;reads memory into X MemW(40,5) = X ;writes X into memory See Also: Mem MemL Category: Memory MemoryLoc (TsrName) : Number MemoryLoc returns the memory segment address of the TSR name you specify. If the TSR isn't in memory it returns a 0. Example: Writeln 'Btrieve is at $' HexString(MemoryLoc('BTRIEVE'),4) See Also: InMem Category: Memory Computer Tyme * MarxMenu * Users Manual Page #191 ----------------------------------------------------------------- MenuFileName : String This returns the name of the current menu file including the complete path. It can be used under an OnKey statement to edit the current menu as follows: Example: OnKey 'E' EDIT MenuFileName Category: String MenuKeyBuffer This is an internal MarxMenu variable. It is where the environment variable KSV= is read. Characters in this string variable are treated as if someone had typed them from the keyboard. This variable can be set to blank in order to override the effects of SET KSV= or can be set to a different value in order to automatically make selections as if they were typed in. See Also: SavePosition KeySave Category: Keyboard MhsDirectory : String Returns the directory of MHS. Example: Writeln MhsDirectory ; '\\TYME\SYS\MHS' Category: MHS Directory MhsMailDirectory : String Returns the mail directory of MHS. Example: Writeln MhsMailDirectory ; '\\TYME\SYS\MHS\MAIL' Category: MHS Directory Computer Tyme * MarxMenu * Users Manual Page #192 ----------------------------------------------------------------- MhsReadFile (FileName,Header,Message) MhsReadFile reads FileName into two arrays. The Header array contains the MHS message header. The Message array contains the MHS message. Example: var MailFiles Mail Headers X WholeFileNames ReadDirectory(MhsUserDirectory + '\MHS\*.',MailFiles) Loop MailFiles MhsReadFile(MailFiles[LoopIndex],Mail[LoopIndex],Headers[LoopIndex]) EndLoop Loop Mail X = LoopIndex Loop Headers[X] Writeln Headers[X,LoopIndex] EndLoop Loop Mail[X] Writeln Mail[X,LoopIndex] EndLoop EndLoop Category: MHS MhsSendDirectory : String Returns the directory of MHS where messages are placed to be sent. Example: Writeln MhsSendDirectory ; '\\TYME\SYS\MHS\MAIL\SND' Category: MHS Directory MhsUserDirectory : String Returns the user directory of MHS. Example: Writeln MhsMailDirectory ; '\\TYME\SYS\MHS\MAIL\USERS\MARC' Category: MHS Directory Computer Tyme * MarxMenu * Users Manual Page #193 ----------------------------------------------------------------- Mid (string,pos,count) : String Returns a string starting at pos for count. Example: Writeln Mid('ABCDEFG',2,3) ;returns 'CDE' Mid also allows you to write into a string at a specified point. When using Mid in this manner you drop the 3rd parameter. Example: St = 'ABCDEFG' Mid(St,3) = '1' X becomes 'AB1DEFG' Mid(St,3) = '123' X becomes 'AB123FG' Mid(St,3) = '1234567' X becomes 'AB1234567' Mid(St,9) = '12' X becomes 'ABCDEFG 12' Category: String Min (Num,Num) : Num Returns the smallest of two numbers or strings. Example: Writeln Min(2,3) ;returns 2 See Also: Max Category: Math String Float MinorDosVersion : Number Returns the minor DOS version number. See Also: DosVersion DosVersionString Category: System Minute : Number Returns the current minute. Category: Time Computer Tyme * MarxMenu * Users Manual Page #194 ----------------------------------------------------------------- MinuteOf (Date) : Number Returns the minute of a date. If Date is passed as a string it is converted automatically. Example: MinuteOf '6:15 pm' ;returns 15 See Also: TimeOf BadDate Category: Time MkDir (String) Makes a new directory. The FileResult variable returns the DOS result error code. A zero in FileResult indicates success. Example: MkDir 'C:\MARX' See Also: ChDir RmDir Category: File Directory Mod : Operator Returns the remainder of the division of two numbers. Example: 25 mod 7 = 4 Category: Math ModifyPath The MarxMenu directory should be in the search path. This is because if you change directories, MarxMenu may not be able to find the menu files. MarxMenu will now test the PATH= environment variable before it writes the batch file to execute a program. If the MarxMenu path is not included, MarxMenu will add the path to the Master Environment if it can. If for some reason you don't want to allow MarxMenu to modify the master environment, use the command: ModifyPath Off Category: Environment Computer Tyme * MarxMenu * Users Manual Page #195 ----------------------------------------------------------------- Month : Number Returns current month. Category: Time MonthOf (Date) : Number Returns the month of a date. If Date is passed as a string it is converted automatically. Example: MonthOf 'April' ;returns 4 See Also: TimeOf BadDate Category: Time Mouse MarxMenu normally uses the mouse if present. If you don't want to use the mouse you can use the command: Mouse Off To turn the mouse back on type: Mouse On The mouse is actually switched on and off at the point when MarxMenu waits at the keyboard for a keypress. Mouse Sensitivity can be set for individual workstations on a network by setting environment variables MouseX and MouseY as follows: Set MouseX=15 Set MouseY=25 See Also: MouseHorizontal MouseVertical Category: System MouseControl MouseHorizontal (Number) Controls the horizontal sensitivity of the mouse. The larger the number, the less sensitive the mouse. Default is 25. Example: MouseHorizontal = 25 Computer Tyme * MarxMenu * Users Manual Page #196 ----------------------------------------------------------------- See Also: MouseVertical Mouse Category: MouseControl MouseIRQ : Number Returns the interrupt number that the mouse driver is using. Category: System MouseControl MouseType : String Reurns the type of mouse being used. If a mouse driver isn't present it returns an empty string. Mouse Types: BUS, SERIAL, HP, INPORT, PS2, UNKNOWN Category: System MouseControl MouseVersion : String MouseVersion returns the version of the mouse driver you are using. If a mouse driver isn't present it returns an empty string. Category: System MouseControl MouseVertical (Number) Controls the vertical sensitivity of the mouse. The larger the number, the less sensitive the mouse. Default is 15. Example: MouseVertical = 15 See Also: MouseHorizontal Mouse Category: MouseControl MoveWindow (Horizontal,Vertical) Moves top window. If Horizontal is negative motion is left. If Vertical is negative, motion is up. Example: MoveWindow -3 4 ;moves window 3 spaces left and 4 down Category: Display Computer Tyme * MarxMenu * Users Manual Page #197 ----------------------------------------------------------------- MsDos (Registers) MsDos calls the interrupt 21h system call using values passed in an array of 10 numbers. The array is set up using predefined Qualifiers that represent the registers that are passed. These qualifiers are: AX BX CX DX DI SI DS ES BP FL Example: Get Current Drive var Reg Reg.AX = $1900 MsDos (Reg) Writeln Char(LowWord(Reg.AX) + 1) ':' ;writes C: See Also: Intr Category: System MxCmd : String This is an internal string variable that is written to the environment variable MXCMD. This variable can be written to control what MarxMenu will write to the Shell Environment. If this variable is written to, it overrides anything that MarxMenu automatically writes. Example: OnKey 'A' |MxCmd = 'SHUTDOWN.BAT' |ExitMenu Category: Environment String Execution NamePart (String) : String Returns the name part of a file name. Example: NamePart ('C:\MARX\MARXMENU.EXE') ;returns MARXMENU See Also: Extension PathPart FilePart Category: String Computer Tyme * MarxMenu * Users Manual Page #198 ----------------------------------------------------------------- NetworkVersion : Boolean Returns true if you are running the network version of MarxMenu. Category: Misc NewOverlayName (FileName) NewOverlayName closes the overlay file and reopens a new overlay file. This is used if you are in the Novell LOGIN directory and yo want to change servers and drive mappings and attach to the MARXMENU.OVR file on a different server. This command does nothing if EmsOverlays or XmsOverlays are used. Example: NewOverlayName('Z:\LOGIN\MARXMENU.OVR') Category: System NextWord (String) : String This command returns the next logical word of a string variable and removes the string from the original string. Example: StringA = 'one two three' StringB = NextWord(StringA) StringB contains 'one' StringA contains 'two three' See Also: InterpretCounter Category: String Nil Nil returns a zero or empty value for any type data. As a boolean Nil returns False. As a number Nil returns 0. As a string, Nil returns an empty string. Category: Constants Computer Tyme * MarxMenu * Users Manual Page #199 ----------------------------------------------------------------- NilProgram Normally, if you use the Run command on a Nil value, it does nothing. However, if you set NilProgram to the Loc of a procedure then it will run that procedure instead. This is used if you are writing an interpreter in MarxMenu and you want to deal with a "command not found" type error. Example: NilProgram = Loc BadCommandError Category: Execution NoBoxBorder Use this command if you don't want a border around the menus. See Also: SingleLineBox DoubleLineBox BlockBox CustomBox Category: Display NoExit Prevents ESC key from allowing you to exit menu. To exit, you must execute the ExitMenu command. This could be password protected. See Also: ExitMenu Category: Execution Not : Operator Returns logical Not if operators are boolean; or bitwise Not if operators are numeric. Example: if Not ExistDir('C:\MARX') then Writeln 'Marx not Installed!' Not(0) = -1 See Also: And Or Xor Category: Math Boolean Computer Tyme * MarxMenu * Users Manual Page #200 ----------------------------------------------------------------- NotesLeft : Number NotesLeft returns the number of notes left in the music buffer to play. The music buffer is self-adjusting and can store a day's worth of music. Category: Music NotesPlayed : Number Returns the number of notes played. If NotesLeft ever reaches 0, NotesPlayed also is set to 0. Category: Music NovAccountDisabled (UserName) : Boolean NovAccountDisabled returns True if the users account is disabled. It can also be used to disable a users account. If no user is specified, the current user is assumed. Example: Writeln NovAccountDisabled('MARC') NovAccountDisabled('MARC') = True Category: Bindery NovAccountExpDate (UserName) : Date Returns the Novell account expiration date. You must be logged in to be able to read this. You can also set the expiration date. Example: DaysToExpire = NovAccountExpDate(UserName) - Today / SecondsInDay NovAccountExpDate(UserName) = Now Category: Bindery Time NovAddUserToGroup (User,Group) Adds a user to a group and updates GROUPS_I'M_IN, GROUP_MEMBERS, and SECURITY_EQUALS properties. Example: NovAddUserToGroup ('MARC','EVERYONE') See Also: NovRemoveUserFromGroup Category: Bindery Computer Tyme * MarxMenu * Users Manual Page #201 ----------------------------------------------------------------- NovAddToSet (Obj,Prop,ObjType,MemberObj,MemberType) Adds an object to a property that is a set property. Example: Add a user to a group NovAddToSet(Group,'GROUP_MEMBERS',2,User,1) NovAddToSet(User,"GROUPS_I'M_IN",1,Group,2) NovAddToSet(User,'SECURITY_EQUALS',1,Group,2) See Also: NovDeleteFromSet NovSetProperty Category: Bindery NovAddTrustee (Dir,Rights,Object,Type) NovAddTrustee adds a directory and access rights to a user or group. To add rights to a user the Type is 1. For a group the Type is 2. Example: NovAddTrustee ('F:\PUBLIC',$FF,'EVERYONE',2) See Also: NovDeleteTrustee NovScanTrusteePaths Category: Novell NovAttach (Server) NovAttach is used to create a software link between you and a server, usually a second server. It must be followed by a NovLogin command to log you into the server if you want to do anything useful there. Note: NovAttach is not the same as running Novell's attach utility which is really a utility to log into a second server. It just gets you a connection number. It is not necessary to do a NovAttach before a NovLogin. If you want to do the same thing as Novell's Attach utility, use the NovLogin command. Example: NovAttach 'TYME' See Also: NovDetach NovLogin Category: Novell Computer Tyme * MarxMenu * Users Manual Page #202 ----------------------------------------------------------------- NovAttachedServers (Array) Returns a list of servers you are already attached to. Example: var Servers NovAttachedServers(Servers) Loop Servers Writeln LoopVal EndLoop See Also: NovServers Category: Novell Array NovAutoDetach (On/Off) When using MarxMenu to log into a Novell network, MarxMenu will detach from the file server, if NovAutoDetach is on, when the screen blanker kicks in, and reattach when the screen is restored. This keeps the workstation from tying up a connection number while waiting to log in. If you want to use a workstation as a print server without being logged in you will want to set this to Off. Default is Off. Category: Novell NovBinderyAccess : Number NovBinderyAccess returns the users bindery access level. 0 - Not logged in. 1 - Logged in. 2 - Object Access. 3 - Supervisor Access. Category: Bindery NovBroadcastMode (Mode) This reads or sets the message broadcast mode. Example: Writeln NovBroadcastMode NovBroadcastMode = 3 Modes: 0 - All Messages, same as running CastOn 1 - Server messages only, same as running CastOff 2 - Same as 0 but user has to poll server for messages 3 - Same as 1 but user has to poll server for messages Computer Tyme * MarxMenu * Users Manual Page #203 ----------------------------------------------------------------- See Also: NovSendMessage NovGetMessage Category: Novell NovCaptureBanner (String) NovCaptureBanner sets the banner name to be printed with print jobs. You can't specify a different user name for each LPT device. If the banner is set to an empty string then the users login name is used for the banner. Example: NovCaptureBanner = 'Beavis' Category: Novell Printer NovCaptureCopies (Port) : Number NovCaptureCopies reads or sets the number of copies to print for a particular port. Example: NovCaptureCopies (2) = 5 ;Sets LPT2 to print 5 copies Writeln NovCaptureCopies (2) ;displays the copies setting on LPT2 See Also: NovCaptureQueue Category: Novell Printer NovCaptureFF (Port) On/Off NovCaptureFF reads or sets the printer Form Feed function of a particular port. Example: NovCaptureFF (2) On ;Sets LPT2 Form Feed to On Writeln NovCaptureFF (2) ;displays the Form Feed setting on LPT2 See Also: NovCaptureQueue Category: Novell Printer NovCaptureFile (Port) File This command is used to capture the output from an LPT port to a specified file. If output is set to an empty string then this command performs the same function as an endcapture. Computer Tyme * MarxMenu * Users Manual Page #204 ----------------------------------------------------------------- Example: NovCaptureFile (1) = "PRINTER.TXT" ;Captures LPT1 output to File. NovCaptureFile (1) = "" ;Ends Capture of Port. See Also: NovCaptureQueue Category: Novell Printer NovCaptureFlush (Port) This commands flushes any data present in a Netware Print queue to the printer. Example: NovCaptureFlush (2) ;Flush any data in queue on port 2 See Also: NovCaptureQueue Category: Novell Printer NovCaptureForm (Port) : Number NovCaptureForm reads or sets the printer form of a particular port. Example: NovCaptureForm (2) = 3 ;Sets LPT2 to form 3 Writeln NovCaptureForm (2) ;displays the form setting on LPT2 See Also: NovCaptureQueue Category: Novell Printer NovCaptureIgnoreTabs (Port) : Boolean NovCaptureIgnoreTabs reads or sets the printer Tabs and control character processing of a particular port. Example: NovCaptureIgnoreTabs (2) On ;Sets LPT2 Ignore Tabs to On Writeln NovCaptureIgnoreTabs (2) ;displays Ignore Tabs setting on LPT2 See Also: NovCaptureQueue Category: Novell Printer Computer Tyme * MarxMenu * Users Manual Page #205 ----------------------------------------------------------------- NovCaptureNotify (Port) : Boolean NovCaptureNotify reads or sets the Notify function of a particular port. Example: NovCaptureNotify (2) = on ;Sets LPT2 Notify to On Writeln NovCaptureNotify (2) ;displays Notify setting on LPT2 See Also: NovCaptureQueue Category: Novell Printer NovCaptureQueue (Port) Returns the name of the queue that the port is being captured to. A nul string indicates capturing is not active. This command can also be used to start capturing and set the queue to capture. A server can also be specified. Example: Writeln NovCaptureQueue (2) ;shows capture queue for LPT2 NovCaptureQueue (2) = 'LASER' ;captures LPT2 to server Laser Printer NovCaptureQueue (2) = 'TYME/LASER' ;specifies server TYME NovCaptureQueue (2) = '' ;End Capture on LPT2 If you are using the VLM shells, MarxMenu can capture from LPT1 to LPT9. To enable these extra printers, add this line to your NET.CFG file: NetWare DOS Requester NETWORK PRINTERS = 9 Category: Novell Printer NovCaptureReset (Port) : String NovCaptureReset can read or set the reset string for a print queue. Example: NovCaptureReset (1) = Esc + char($15) Writeln NovCaptureReset (1) ;reads the capture setup string See Also: NovCaptureSetup Category: Novell Printer Computer Tyme * MarxMenu * Users Manual Page #206 ----------------------------------------------------------------- NovCaptureSetup (Port) : String NovCaptureSetup can read or set the setup string for a print queue. Example: NovCaptureSetup (1) = Esc + char($15) Writeln NovCaptureSetup (1) ;reads the capture setup string See Also: NovCaptureReset Category: Novell Printer NovCaptureTabSize (Port) : Number NovCaptureTabSize reads or sets the printer TabSize of a particular port. Range is 1 - 18. Example: NovCaptureTabSize (2) = 8 ;Sets LPT2 TabSize to 8 spaces Writeln NovCaptureTabSize (2) ;displays the TabSize setting on LPT2 See Also: NovCaptureQueue Category: Novell Printer 8 NovCaptureTimeOut (Port) : Number NovCaptureTimeOut reads or sets the printer TimeOut of a particular port. Example: NovCaptureTimeOut (2) = 10 ;Sets LPT2 to 10 second TimeOut Writeln NovCaptureTimeOut (2) ;displays the TimeOut setting on LPT2 See Also: NovCaptureQueue Category: Novell Printer NovCaptureUseBanner (Port) This reads or sets whether or not a print banner is used. Example: Writeln NovCaptureUseBanner (2) ;displays if LPT2 is using a banner NovCaptureUseBanner (2) = On ;sets banner to On for LPT2 See Also: NovCaptureQueue Computer Tyme * MarxMenu * Users Manual Page #207 ----------------------------------------------------------------- Category: Novell Printer NovChangePassword (OldPassword,NewPassword) Changes the Novell users password from OldPassword to NewPassword. Example: NovChangePassword('OLDPASS','NEWPASS') See Also: NovChangeObjPassword Category: Bindery NovChangeObjPassword (Obj, Type, OldPassword, NewPassword) NovChangeObjPassword is like NovChangePassword except it allows you to change the password on other objects than yourself. Type refers to the object type. Users are type 1. Example: NovChangeObjPassword('DAN',1,'POTATOE','POTATO') See Also: NovChangePassword Category: Bindery NovCleanVolumeName (String) : String Returns a string containing the server and volume name of a filename or directory. Example: Writeln NovCleanVolumeName('L:') ;Returns 'MARX/SYS:LOGIN' See Also: CleanFileName TrueName Category: Novell NovClearConnection (Connection Number) Disconnects a specific connection number from the server. Requires console operator rights to use this command. Example: NovClearConnection 2 Category: Novell Computer Tyme * MarxMenu * Users Manual Page #208 ----------------------------------------------------------------- NovCloseBindery Closes the Novell bindery for access. See Also: NovOpenBindery Category: Bindery NovCloseSemaphore (Name) This closes semaphore Name. If there are no other users using this semaphore, it is deleted. Example: NovCloseSemaphore 'LOTUS' Category: Novell NovConLoggedIn (Array) NovConLoggedIn returns an array of connection numbers that have someone logged in. Example: var Connections NovConLoggedIn(Connections) Loop Connection Writeln LoopVal EndLoop See Also: NovUsersLoggedIn NovShowNotLoggedIn Category: Novell NovConnection (ServerName) : Number This returns your workstation's logical connection number to the server specified by ServerName. The ServerName parameter is optional and if not specified then the connection number returned is the connection number on the default server. A zero indicates that you are not connected to any servers. Example: Var Serv1,Serv2 Serv1 = 'TYME' Serv2 = 'TSS' Writeln "I'm Connection " NovConnection(Serv1) " on Server "+Serv1 Writeln "I'm Connection " NovConnection(Serv2) " on Server "+Serv2 Computer Tyme * MarxMenu * Users Manual Page #209 ----------------------------------------------------------------- Category: Novell NovConnectionInfo (2D Array) NovConnectionInfo reads all the connections and gathers a variety of information about each connection into a two dimensional array. This fields of this array include: 1 - Connection Number 2 - Connection Name 3 - Connection Station Address 4 - Connection Object Type 5 - Connection Login Time 6 - Connection Object Number Example: Var ConInfo NovConnectionInfo ConInfo Loop ConInfo Loop LoopVal Write LoopVal ' ' EndLoop Writeln EndLoop See Also: NovConLoggedIn Category: Novell Array NovConnectionsInUse : Number Returns the number of connections in use. Example: Writeln 'There are ' NovConnections ' connections in use.' Category: Novell NovConOpenFiles(Array,Connection) Returns a list of files that the Connection number has open in Novell filename format. Example: var Files NovConOpenFiles(Files,1) ;connection 1 Loop Files Writeln LoopVal EndLoop Computer Tyme * MarxMenu * Users Manual Page #210 ----------------------------------------------------------------- Category: Novell NovConsoleOperator : Boolean This returns true if the user has Console Operator privileges. This can come in handy when you are trying to determine who gets access to the command line. Example: OnKey Esc |if NovConsoleOperator | ExitMenu |endif Category: Novell NovConTableSize : Number NovConTableSize returns the maximum number of servers the shell can connect to. In the past using the NETX shells this has been 8. But the new shells can be set to different values. Category: Novell NovConUsingAFile (Array,FileName) NovConUsingAFile creates an array with a list of connection numbers that have a file open. Example: ;WhoHas program in MarxMenu var ConnectionList NovConUsingAFile(ConnectionList,ParamStr(2)) Loop ConnectionList Writeln NovLoginName(LoopVal) ' [' LoopVal ']' EndLoop Category: Novell NovCreateGroup (Name) Creates a group in the bindery along with all the minimum default properties. Example: NovCreateGroup 'ACCOUNTING' Category: Bindery Computer Tyme * MarxMenu * Users Manual Page #211 ----------------------------------------------------------------- NovCreateObject (Name, ObjectType) Creates a bindery object of a specific object type. If NovStaticObject is set to true, then the object will be permanent unless it is deleted. If set to false, then the object will be automatically deleted if the file server is rebooted. Example: ;- This example creates a new user var UserName UserName = 'TIMESYNC' ;- Delete object if it already exists NovDeleteObject(UserName,1); NovStaticObject On ;Static Object NovObjectSecurity $31 NovCreateObject (UserName,1) NovStaticProperty On NovSetProperty On NovPropertySecurity $32 NovCreateProperty(UserName,'SECURITY_EQUALS',1) NovPropertySecurity $31 NovCreateProperty(UserName,"GROUPS_I'M_IN",1) ;- Copies login control from the supervisor NovSetProperty Off NovPropertySecurity $32 NovCreateProperty(UserName,'LOGIN_CONTROL',1) NovPropertyValues(Item,'SUPERVISOR','LOGIN_CONTROL',1) NovWritePropValue(Item,UserName,'LOGIN_CONTROL',1) NovCreateProperty(UserName,'ACCOUNT_BALANCE',1) NovWritePropValue(Set [''],UserName,'ACCOUNT_BALANCE',1) NovPropertySecurity $22 NovCreateProperty(UserName,'MISC_LOGIN_INFO',1) NovPropertySecurity $31 NovCreateProperty(UserName,'IDENTIFICATION',1) NovWritePropValue(Set ['Time Sync User'],UserName,'IDENTIFICATION',1) Computer Tyme * MarxMenu * Users Manual Page #212 ----------------------------------------------------------------- NovChangeObjPassword(UserName,1,'','SETTIME') ;- Gives user Console Operator access. NovAddToSet(NovDefaultServer,'OPERATORS',4,UserName,1) NovObjectSecurity controls who can access the object. The default security is $11 which allows anyone logged into the network to access the object for both read and write. In this example the security of $31 allows anyone logged in to read the object, but only users with supervisor equivalence can write/modify/delete it. With some objects as in the above example where we create a new Netware group, you must also assign the necessary properties before the object is functional to Netware. See Also: NovStaticObject NovObjectSecurity NovDeleteObject See Also: NovCreateProperty Category: Bindery NovCreatePrintQueue (Name) Creates a print queue in the bindery along with all the minimum default properties. Example: NovCreatePrintQueue 'ACCOUNTING' Category: Bindery NovCreateProperty (Object, Prop, ObjType) Creates a property on the object. The security of the property is controlled by setting the variable NovPropertySecurity. You can also control if the property is an item property or a set property. This is done by setting NovSetProperty to True or False. If NovStaticProperty is true then the property will remain until someone deletes it. If it is not static (dynamic) then it will be deleted if the server is rebooted. A set property contains a list of objects. An item property contains a value up to 128 bytes long. The value can be anything. Example: ; Create a Group Example. NovDeleteObject ('TESTGROUP',2) NovStaticObject On NovObjectSecurity $31 Computer Tyme * MarxMenu * Users Manual Page #213 ----------------------------------------------------------------- NovCreateObject ('TESTGROUP',2) NovSetProperty On NovStaticProperty On NovPropertySecurity $31 NovCreateProperty('TESTGROUP','GROUP_MEMBERS',2) See Also: NovStaticProperty NovPropertySecurity NovDeleteProperty See Also: NovCreateObject Category: Bindery NovCreateUser (Name) Creates a user in the bindery along with all the minimum default properties. Example: NovCreateUser 'MARC' Category: Bindery NovDefaultServer : String Returns the name of the default file server. Example: Writeln NovDefaultServer Category: Novell NovDeleteFromSet (Obj,Prop,ObjType,MemberObject,MemberType) Deletes an object from a property that is a set property. Example: To Remove a user to a group: NovDeleteFromSet(Group,'GROUP_MEMBERS',2,User,1) NovDeleteFromSet(User,"GROUPS_I'M_IN",1,Group,2) NovDeleteFromSet(User,'SECURITY_EQUALS',1,Group,2) See Also: NovAddToSet NovSetProperty Category: Bindery Computer Tyme * MarxMenu * Users Manual Page #214 ----------------------------------------------------------------- NovDeleteObject (Object,Type) Deletes an object from the bindery. Example: NovDeleteObject('JOE',1) Category: Bindery NovDeleteProperty (Obj,Prop,Type) NovDeleteProperty deletes a property from an object. Example: NovDeleteProperty('TEST','WASTE',2) Category: Bindery NovDeleteTrustee (Dir,Object,Type) NovDeleteTrustee removes a directory access rights from a user or group. To delete rights from a user the Type is 1. For a group the Type is 2. Example: NovDeleteTrustee ('F:\PUBLIC','EVERYONE',2) See Also: NovAddTrustee NovScanTrusteePaths Category: Novell NovDetach (Server) This is used to drop the connection to a server. It also logs you off. Example: NovDetach 'TYME' See Also: NovAttach Category: Novell NovDirectoryRights (Dir) : Number NovDirectoryRights return your effective rights in the directory Dir. Example: Writeln NovDirectoryRights 'F:\PUBLIC' Computer Tyme * MarxMenu * Users Manual Page #215 ----------------------------------------------------------------- Category: Novell NovDiskSpaceFromDel (Path) : Number NovDiskSpaceFromDel returns the amount of disk space that is used by deleted files and is available for reuse. Example: Writeln NovDiskSpaceFromDel 'F:' Category: Novell NovDiskSpaceFromDelNA (Path) : Number NovDiskSpaceFromDelNA returns the amount of disk space that is used by deleted files and is not yet available for reuse. Example: Writeln NovDiskSpaceFromDelNA 'F:' Category: Novell NovDownServer Takes the default file server down if there are no files open. You must be supervisor equivalent to user this command. See Also: NovForceDownServer Category: Novell NovEndCapture (Port) Ends printer capture for LPT ports. Example: NovEndCapture (1) ;cancels LPT1 capture See Also: NovCaptureQueue Category: Novell Printer NovFirstNetworkDrive : String NovFirstNetworkDrive returns the drive letter of the first network drive on a Novell network. Category: Novell Computer Tyme * MarxMenu * Users Manual Page #216 ----------------------------------------------------------------- NovForceDownServer Takes the default file server down regardless of open files. You must be supervisor equivalent to use this command. See Also: NovDownServer Category: Novell NovFreeDirSlots (Path) : Number Returns the number of free directory slots for this volume. Example: Writeln NovFreeDirSlots 'SYS:' Writeln NovFreeDirSlots 'F:' See Also: NovTotalDirSlots Category: Novell NovFreeVolumeSpace (Path) : Number Returns the free file space of the volume in bytes. Example: Writeln NovFreeVolumeSpace 'SYS:' Writeln NovFreeVolumeSpace 'F:' See Also: NovTotalVolumeSpace NovUsedVolumeSpace Category: Novell NovFullName (User) Returns the Full Name of the user as set by Syscon. If NovFullName is used without a parameter then MyLoginName is assumed. You can also use this command to set the FullName. Example: NovFullName ('MARC') = 'Marc Perkel' ;Sets FullName to Marc Perkel Writeln NovFullName ('MARC') ;Writes Marc Perkel If you want to read the full name of a group or other object, you can pass the object type as a parameter. Example: NovFullName ('PEOPLE',2) = 'Staff' ;Sets Group People to Staff Writeln NovFullName ('PEOPLE',2) ;Writes Staff Computer Tyme * MarxMenu * Users Manual Page #217 ----------------------------------------------------------------- See Also: NovLoginName Category: Bindery NovGetConnections (Array,Name,Type) NovGetConnections return an array of connection numbers that a specified user or other object is attached to. For users use type 1. Example: var Connections NovGetConnections(Connections,'VICKI',1) Loop Connections NovSendMessage('The Princess Called!',LoopVal) EndLoop Category: Bindery NovGetMessage : String When in broadcast mode 2 or 3 this polls the server for stored messages and returns them if found. Example: NovBroadcastMode = 3 Writeln NovGetMessage See Also: NovSendMessage NovBroadcastMode Category: Novell NovGetRootLevel (Drive) : Number NovGetRootLevel returns the number of directories below the fake root that the current directory is. Drives with no fake root return 255. Example: The current directory is H:\LETTERS, but H: is mapped to the directory: TYME/SYS:HOME\MARC. Writeln NovGetRootLevel('H') ;returns 1 See Also: NovMapRoot NovMapDrive Category: Novell Computer Tyme * MarxMenu * Users Manual Page #218 ----------------------------------------------------------------- NovGraceLoginReset (User) : Number Returns the number of grace logins that Novell resets when the user changes his password. Example: Writeln NovGraceLoginReset (NovMyLoginName) If the User parameter is not included, MarxMenu will assume the current user. You can also set the grace login reset as follows: NovGraceLoginReset = 5 See Also: NovGraceLogins Category: Bindery NovGraceLogins (User) : Number Returns the number of grace logins the user has left. Example: Writeln 'You have ' NovGraceLogins (NovMyLoginName) ' left!' If the User parameter is not included, MarxMenu will assume the current user. You can also set the grace logins as follows: NovGraceLogins = 5 See Also: NovPasswordExpDate NovGraceLoginReset Category: Bindery NovGroupMembers (Group,Array) This reads all the members of Group and puts them into an array. Example: var Members NovGroupMembers ('EVERYONE',Members) Loop Members Writeln LoopVal EndLoop Computer Tyme * MarxMenu * Users Manual Page #219 ----------------------------------------------------------------- Category: Bindery Array NovGroups (Array) Fills array with list of all groups. Example: var Groups NovGroups (Groups) Loop Groups Writeln LoopVal EndLoop See Also: NovUsersLoggedIn NovUsers NovPrintQueues NovServers Category: Bindery NovInGroup (Group) : Boolean Returns true if you are in the group. Example: If NovInGroup ('PAYROLL') then Writeln 'Accounting' Category: Bindery NovLastLoginDate (User) : Date Returns the date and time the user last logged in. Example: DaysSinceLogin = NovLastLoginDate(UserName) - Today / SecondsInDay If the User parameter is not included, MarxMenu will assume the current user. Category: Bindery Time NovLogin (Name,Password) This logs you into a file server. It is different than the Novell's login program in that it doesn't execute any login scripts. It merely gets you in. It is similar in function to Novell's attach utility. You can include the preferred server with the name. Example: NovLogin ('MARC','PASSWORD') NovLogin ('TYME/MARC','PASSWORD') Computer Tyme * MarxMenu * Users Manual Page #220 ----------------------------------------------------------------- NovLogin will automatically attach to the file server for you and preserve all default and preferred server settings. The variable NovResult is set to 0 or 223 if successful. The 223 result indicated a grace login. If you are using Netware 3, MarxMenu shells a program named SUBLOGIN.EXE which does encrypted passwords. This program needs to be on the search path. If you are using MarxMenu to log into the network the you will need a copy of SUBLOGIN in the LOGIN directory. If you don't use SUBLOGIN you will have to go to the server console and type: SET ALLOW UNENCRYPTED PASSWORDS = ON See Also: NovDetach NovAttach Category: Novell NovLoginName (Connection) : String This returns the login name of the user at any specified connection. This can also be used to see who else is on the network. If no connection is specified, the current connection is assumed. Example: Writeln NovLoginName ;name of user on this connection Writeln NovLoginName (2) ;name of user on connection 2 See Also: NovFullName Category: Bindery NovLoginTime (Connection) Returns the login time of a specific connection. If the connection number isn't specified then the current connection is assumed. Example: var X X = NovLoginTime Writeln DateString(X) ' ' TimeString(X) Category: Novell Computer Tyme * MarxMenu * Users Manual Page #221 ----------------------------------------------------------------- NovLoginType (Connection) : Num NovLoginType returns the object type at a specific connection number. Example: Writeln NovLoginType(1) ;returns the object type on connection 1 Category: Novell NovLogout This logs you off the server. Warning! Make sure that you are running MarxMenu from a local drive and not the server you are logging out of. MarxMenu needs access to overlays within MARXMENU.EXE and a Logout can cut off access. This command automatically runs FixPath. See Also: FixPath Logoff LogoffTime Category: Novell Vines NovLongMachineName : String NovLongMachineName returns the long machine name from the shell. See Also: NovShortMachineName Category: Novell NovManager (UserName) : Boolean Returns True if the user has workgroup manager priveledges. If UserName isn't specified then the current user is assumed. Example: if NovManager ('FRED') then Writeln 'Fred is a Manager' if NovManager then Writeln 'I am a Manager' See Also: NovConsoleOperator Category: Bindery NovMapDrive (Drive,Directory) This will map a drive letter to a directory like the Novell MAP command does. You may specify volume names and server names. Example: NovMapDrive ('J','TYME2/SYS:PUBLIC\DOS') Computer Tyme * MarxMenu * Users Manual Page #222 ----------------------------------------------------------------- Mapping a drive to a nul string ('') deletes the drive map. See Also: NovMapRoot Category: Novell NovMapRoot (Drive,Path) NovMapRoot works like Novell's MAP ROOT command. It allows you to map a drive letter to a subdirectory and make it look like the root directory of that drive. You may specify volume names and server names. Example: NovMapRoot('P','TYME/SYS:PUBLIC') P:\ is the same as the TYME/SYS:PUBLIC directory NovMapRoot also works on local drives and has the same effect as running the dos SUBST utility. Example: NovMapRoot('D','C:\NET') See Also: NovMapDrive NovGetRootLevel Category: Novell NovMaxConnections : Number Returns the maximum number of connections that your Netware will allow. Category: Novell NovMaxConnectionsUsed : Number Returns the maximum number of connection used on the server. If you're hunting through connection numbers you can use this value as a maximum instead of NovMaxConnections to reduce the number of connections you have to deal with. Category: Novell NovMaxUserConnections (UserName) : Number Returns the maximum number of connections that a user is limited to. A zero means unlimited connections. If UserName isn't specified then the current user is assumed. You can also use this command to set the limit. Example: Writeln NovMaxConnection ('FRED') ; Fred's Limit Writeln NovMaxConnection ; My Limit NovMaxConnections ('BARNEY') = 5 ; Set Barney's limit to 5 Computer Tyme * MarxMenu * Users Manual Page #223 ----------------------------------------------------------------- Category: Bindery NovMinPasswordLength (User) : Number Returns the minimum length of the password that Novell will accept for a new password. Example: Writeln NovGraceLoginReset (NovMyLoginName) If the User parameter is not included, MarxMenu will assume the current user. Category: Bindery NovMyLoginName : String This returns the login name of the user. Example: Writeln NovMyLoginName Category: Bindery NovMyPassword (Password) : Boolean Novell won't let you read the password, but it will let you guess and tell you if you're right. This routine returns true if the password passed is the correct password. Example" var Pass Pass = Readln if NovMyPassword (Pass) ;Do Something else Writeln 'Bad Password!' endif Category: Bindery NovMyPrintQueues (Array) Returns a list of all print queues that the user has access too. Example: var Queues NovMyPrintQueues (Queues) Loop Queues Writeln LoopVal EndLoop Computer Tyme * MarxMenu * Users Manual Page #224 ----------------------------------------------------------------- See Also: NovPrintQueues Category: Bindery Array NovNumberOfPrinters When using the VLM shells you can specify up to 9 printers. This command returns the number of printers your shell will support. With NETX it returns 3 printers. Example: if NovNumberOfPrinters = 9 NovCaptureQueue(9) = 'DOT' endif See Also: NovCaptureQueue Category: Novell Printer NovObjectID (User) : String NovObjectID returns the users Novell object identification code. This is the same as the name of the users mail directory. Example: MailDir = 'F:\MAIL\' + NovObjectID (NovMyLoginName) Category: Bindery NovObjects (2D Array) NovObjects reads all objects from the bindery returning a 2-dimensional array containing all object names and object types. Example: NovObjects (X) Loop X Writeln LoopVal[1] ' ' LoopVal[2] EndLoop Common Object Types: 1 - User 2 - Group 3 - Print Queue 4 - File Server 5 - Job Server 6 - Gateway 7 - Print Server Computer Tyme * MarxMenu * Users Manual Page #225 ----------------------------------------------------------------- See Also: NovScanProperties NovPropertyValues Category: Bindery Array NovObjectSecurity : Number NovObjectSecurity is used when objects are created to determine who can read or write the object. The number is one byte. The upper 4 bits control who can read the object, the lower 4 bits control who can write to the object. 0000 Anyone 0001 Logged In 0010 Only your Object 0011 Supervisor 0100 Netware Itself The default is $11 (00010001) which is anyone logged in can read or write to the object. NovObjectSecurity can also read and set the security of an existing object. Example: NovObjectSecurity('MARXMENU',600) = $13 Writeln NovObjectSecurity('MARXMENU',600) See Also: NovCreateObject NovStaticObject NovPropertySecurity Category: Bindery NovOpenBindery Opens the Novell bindery for access. See Also: NovCloseBindery Category: Bindery NovOpenSemaphore (Name,Value) This opens semaphore Name and assigns it an initial value. If the semaphore already exists, the value isn't changed. The number of semaphore users is increased by one if this user hasn't already opened this semaphore name. Example: NovOpenSemaphore ('LOTUS',0) Computer Tyme * MarxMenu * Users Manual Page #226 ----------------------------------------------------------------- See Also: NovCloseSemaphore NovSemaphoreUsers SemAttachTo Category: Novell NovPasswordExpDate (UserName) : Date Returns the Novell password expiration date. You must be logged in to be able to read this. You can set the password expiration date as well. Example: DaysToExpire = NovPasswordExpDate(UserName) - Today / SecondsInDay NovPasswordExpDate(UserName) = Now See Also: NovGraceLogins Category: Bindery Time NovPasswordInterval (User) : Num NovPasswordInterval returns the number of days between forced password changes. if the user name is left off, the current user is assumed. This command can also be used to set this value. Example: NovPasswordInterval('MARC') = 50 ;sets to 50 Writeln NovPasswordInterval('MARC') ;writes 50 Category: Bindery NovPasswordRequired (User) : Num NovPasswordRequired returns True if the user is required to have a password. This cammand can also be used to set this value Example: NovPasswordRequired('MARC') = True Writeln NovPasswordRequired('MARC') Category: Bindery NovPreferredServer : String Returns the name of the preferred file server. This is set with the NovSetPreferredServer command. Normally the default server is controlled by the current directory. If a preferred server is set then this default is changed. Setting the preferred server to blank resets the default server. When MarxMenu terminates the Preferred server setting is terminated. Computer Tyme * MarxMenu * Users Manual Page #227 ----------------------------------------------------------------- Category: Novell NovPrimaryServer : String Returns the name of the primary file server. This is the one you first logged into. Category: Novell NovPrintQueues (Array) Fills array with list of all print Queues. The user might not have access rights to all these queues. Example: var Queues NovPrintQueues (Queues) Loop Queues Writeln LoopVal EndLoop See Also: NovMyPrintQueues NovUsersLoggedIn NovUsers See Also: NovGroups NovServers Category: Bindery Array Printer NovPropertySecurity : Number NovPropertySecurity is used when properties are created to determine who can read or write the property. The number is one byte. The upper 4 bits controls who can read the property, the lower 4 bits control who can write to the property. 0000 Anyone 0001 Logged In 0010 Only your Object 0011 Supervisor 0100 Netware Itself The default is $11 (00010001) which is anyone logged in can read or write to the property. NovPropertySecurity can also read and set the security of an existing property. Example: NovPropertySecurity('MARXMENU','USERS',600) = $13 Writeln NovPropertySecurity('MARXMENU','USERS',600) Computer Tyme * MarxMenu * Users Manual Page #228 ----------------------------------------------------------------- See Also: NovCreateProperty NovObjectSecurity NovSetProperty Category: Bindery NovPropertyValues (Array, Object, Prop, Type) Reads property values of object into an array. If the property is a Set property, then the names of the objects contained in the set are read. If the property is an Item property, then the property is read as an array of strings that are all 128 bytes in length. These strings will contain binary data. Example: ;shows contents of bindery StandardIO Var Objects, Obj, Prop, Ty, Values Qualifier ObjName ObjType NovObjects (Objects) Loop Objects Obj = LoopVal.ObjName Ty = LoopVal.ObjType Writeln Obj ' --------- ' Ty NovScanProperties (Prop,Obj,Ty) Loop Prop Writeln ' ' Prop[LoopIndex] NovPropertyValues(Values,Obj,LoopVal,Ty) Loop Values Writeln ' ' LoopVal EndLoop EndLoop EndLoop See Also: NovObjects NovScanProperties NovWritePropValue Category: Bindery Array NovReadGroups (User,Array) This reads all the groups that User belongs to and puts them into an array. Example: var Groups NovReadGroups ('VICKI',Groups) Loop Groups Writeln LoopVal EndLoop Computer Tyme * MarxMenu * Users Manual Page #229 ----------------------------------------------------------------- Category: Bindery Array NovReadSecurityEquals (Name,Array) This reads all the security equivalences that Name belongs to and puts them into an array. (This includes groups). Example: var SecEq NovReadSecurityEquals ('VICKI',SecEq) Loop SecEq Writeln LoopVal EndLoop Category: Bindery Array NovRemoveUserFromGroup (User,Group) Removes a user to a group and updates GROUPS_I'M_IN, GROUP_MEMBERS, and SECURITY_EQUALS properties. You must be supervisor equivalent in order to use this command. Example: NovRemoveUserFromGroup ('MARC','EVERYONE') See Also: NovAddUserToGroup Category: Bindery NovRenameObject (OldName, NewName, ObjType) Renames an object. Example: NovRenameObject('VICKY','VICKI',1) ;corrects serious spelling error Category: Bindery NovResult : Number NovResult is a variable like FileResult that returns the success status of the previous Novell system call. A zero generally indicates success. Category: Novell Computer Tyme * MarxMenu * Users Manual Page #230 ----------------------------------------------------------------- NovScanProperties (Array, Object, ObjType) NovScanProperties reads the properties (not the values) into an array. You also have to pass the object type. Novell Object Types: 1 - User 2 - Group 3 - Print Queue 4 - File Server 5 - Job Server 6 - Gateway 7 - Print Server Example: var Properties NovScanProperties (Properties,NovMyLoginName,1) Loop Properties Writeln LoopVal EndLoop See Also: NovObjects NovPropertyValues Category: Bindery Array NovScanTrusteePaths (2D Array,ObjectName,ObjectType) Returns a 2-dimensional array containing the name of the trustee paths assigned to the object and the trustee access rights. Example: var X NovScanTrusteePaths (X,'MARC',1) Loop X Writeln LoopVal[1] ' ' LoopVal[2] EndLoop See Also: NovAddTrustee NovDeleteTrustee Category: Novell Array NovSecurityEquals (Security) : Boolean Returns True if user has the security equivalent of Security. Example: if NovSecurityEquals ('SUPERVISOR') Execute ('SYSCON') endif Computer Tyme * MarxMenu * Users Manual Page #231 ----------------------------------------------------------------- Category: Bindery NovSemaphoreInfo (2DArray,Connection) NovSemaphoreInfo reads the semaphore information of a connection number. It returns a two dimensional array of the semaphore names, open count, value, and task number. Example: Var Sem Qualifier Name, OpenCount, Val, Task NovConSemaphoreInfo(Sem,9) Loop Sem Write LoopVal.Name ' ' LoopVal.OpenCount ' ' Writeln LoopVal.Val ' ' LoopVal.Task EndLoop Category: Novell NovSemaphoreTimeout This variable controls the amount of time (in 1/18 seconds) that MarxMenu will wait for the value of a semaphore to become not negative. The initial value is 50. Example: NovSemaphoreTimeout = 50 See Also: NovWaitOnSemaphore NovSignalSemaphore Category: Novell NovSemaphoreUsers (Name) : Number This returns the number of users that have the semaphore open. This can be used for software metering. Read file METER.INC to use this feature. Example: if NovSemaphoreUsers ('LOTUS') > 5 Writeln 'Sorry, all copies of LOTUS are in use.' endif Category: Novell Computer Tyme * MarxMenu * Users Manual Page #232 ----------------------------------------------------------------- NovSemaphoreValue (Name) : Number This returns the value of a semaphore. The value is initially set with NovOpenSemaphore and can be adjusted with NovSignalSemaphore or NovWaitOnSemaphore. Example: Writeln NamSemaphoreValue See Also: NovOpenSemaphore NovSignalSemaphore NovWaitOnSemaphore Category: Novell NovSendMessage (Message,Connection) Sends a message to the specified connection number just like the Novell SEND command. NovResults: 0 - Successful 252 - Buffer Full 253 - Invalid Connection Number 255 - Blocked (running CastOff) See Also: NovGetMessage NovBroadcastMode Category: Novell NovSerialNumber : String NovSerialNumber returns the current server serial number as a string. Example: Writeln NovSerialNumber Category: Novell NovServDescription (Array) NovServDescription returns an array of strings that contain the novell file server description, Example: var Des NovServDescription(Des) Loop Des Writeln LoopVal EndLoop Computer Tyme * MarxMenu * Users Manual Page #233 ----------------------------------------------------------------- Category: Novell NovServerLogin (On/Off) Enables or disables logins to file server. This requires the user have Console Operator status to use this feature. Example: if NovConsoleOperator then NovServerLogin Off Category: Novell NovServers (Array) This command returns a string array of the file servers you are connected to. Example: var Servers NovServers Servers Loop Servers Writeln LoopVal EndLoop Category: Bindery Array NovServerTime : Time NovServerTime can read or set the date and time of a Novell file server. To read the server time: X = NovServerTime To set the server time: NovServerTime = X Category: Novell Time NovSetPreferredServer (Server) Sets the preferred file server. Passing a '' will switch you back to the default or primary file server. See Also: NovSetPrimaryServer NovPreferredServer Category: Novell Computer Tyme * MarxMenu * Users Manual Page #234 ----------------------------------------------------------------- NovSetPrimaryServer (Server) The primary file server is the one that executes your login scripts. It can also be set using the NovSetPrimaryServer command. See Also: NovSetPreferredServer NovPrimaryServer Category: Novell NovSetProperty (On/Off) NovSetProperty is a variable that controls if the property to be created is going to be a set property or an item property. A set property contains a list of objects. An item property contains a value up to 128 bytes long. The value can be anything. NovSetProperty can also be used to read if a property is an item or a set. Example: if NovSetProperty (Object,Property,ObjectType) NovPropertyValues(Values,Object,Property,ObjectType) Loop Values Writeln LoopVal EndLoop endif See Also: NovPropertySecurity NovCreateProperty NovStaticProperty Category: Bindery NovShellLoaded : Boolean Returns True if the Novell shell (NetX or VLM) is in memory. See Also: VlmLoaded Category: Novell NovShellVersion : String Returns the Novell shell version number. Category: Novell Computer Tyme * MarxMenu * Users Manual Page #235 ----------------------------------------------------------------- NovShortMachineName : String NovShortMachineName returns the short machine name from the shell. See Also: NovLongMachineName Category: Novell NovShowNotLoggedIn : Boolean NovShowNotLoggedIn is used with NovUsersLoggedIn and NovConLoggedIn. Normally users who are connected but not logged in are filtered out buy MarxMenu. But if you set NovShowNotLoggedIn to True, then NOT-LOGGED-IN will be included in the list. See Also: NovUsersLoggedIn NovConLoggedIn Category: Novell NovSignalSemaphore (Name) This increments the value of a semaphore. It is used to indicate that you are done with a resource and makes it available for the next user. See Also: NovOpenSemaphore NovWaitOnSemaphore Category: Novell NovSpaceLimit (UserName, Volume) : Number NovSpaceLimit returns the disk space limit for the user on the specified volume. You can also use this command to set the limit. If space is unlimited, a -1 is returned. Setting the space limit to -1 allows for unlimited space. Example: Writeln NovSpaceLimit ('BILL','F:') ; Bill's space limit on F: NovSpaceLimit ('BILL','SYS:') = 2000000 ; Limits Bill's space Category: Novell NovSpaceUsed (UserName,Volume) : Number NovSpaceUsed returns the total disk space in use by the user on the specified volume. Example: Writeln NovSpaceUsed ('BILL','F:') ; Bill's disk space on F: Computer Tyme * MarxMenu * Users Manual Page #236 ----------------------------------------------------------------- Category: Novell NovStaticObject : Boolean This variable controls if objects created will be static or dynamic objects. Dynamic objects are deleted when the file server is rebooted. NovStaticObject can also be used to read if an object is static or not. Example: Writeln NovStaticObject('MARXMENU',600) ;test for static object See Also: NovCreateObject NovObjectSecurity Category: Bindery NovStaticProperty : Boolean This variable controls if objects created will be static or dynamic objects. Dynamic objects are deleted when the file server is rebooted. NovStaticProperty can also be used to read if an property is static or not. Example: Writeln NovStaticProperty('MARXMENU','USERS',600) See Also: NovCreateProperty NovPropertySecurity Category: Bindery NovStationAddress (Connection) : String This returns the stations internetwork address at connection. Example: NovStationAddress (NovConnection) Returns the address of the user's workstation. NovStationAddress (1) Returns the address of station 1. 254:41 where 254 is the network number and 41 is the node number. The second parameter (Connection) is optional. If it is left out, the current connection is assumed. Example: NovStationAddress ;Returns the address of the users workstation. Computer Tyme * MarxMenu * Users Manual Page #237 ----------------------------------------------------------------- Category: Novell NovTotalDirSlots (Path) : Number Returns the total number of directory slots for this volume. Example: Writeln NovTotalDirSlots 'SYS:' Writeln NovTotalDirSlots 'F:' See Also: NovFreeDirSlots Category: Novell NovTotalVolumeSpace (Path) : Number Returns the total file space of the volume in bytes. Example: Writeln NovTotalVolumeSpace 'SYS:' Writeln NovTotalVolumeSpace 'F:' See Also: NovFreeVolumeSpace NovUsedVolumeSpace Category: Novell NovUsedVolumeSpace (Path) : Number Returns the used volume space of Path. Example: Writeln NovUsedVolumeSpace('F:') See Also: NovFreeVolumeSpace NovTotalVolumeSpace Category: Novell NovUserDirectories (UserName,Volume) : Number NovUserDirectories returns the number of directories on the volume that are owned by the user. This commamd takes a while to run. Expect delays from a few seconds to several minutes. Example: Writeln NovUserDirectories ('PETE','F:') See Also: NovUserFiles Computer Tyme * MarxMenu * Users Manual Page #238 ----------------------------------------------------------------- Category: Novell NovUserFiles (UserName,Volume) : Number NovUserFiles returns the number of files on the volume that are owned by the user. This commamd takes a while to run. Expect delays from a few seconds to several minutes. Example: Writeln NovUserFiles ('PETE','SYS:') See Also: NovUserDirectories Category: Novell NovUserInGroup (Name,Group) : Boolean This is used to test if other users are in a group. Returns true is the specified user is in the specified group. Example: if NovUserInGroup ('KEVIN','MAILUSERS') ;do something endif See Also: NovInGroup Category: Bindery NovUserPassword (User,Password) : Boolean NovUserPassword returns True if the Password is correct for the User. Example: if NovUserPassword('MARC','SECRET') then Writeln 'Got it!' Category: Novell NovUsers (Array) Fills array with list of all users. Example: var Users NovUsers(Users) Loop Users Writeln LoopVal EndLoop Computer Tyme * MarxMenu * Users Manual Page #239 ----------------------------------------------------------------- See Also: NovUsersLoggedIn NovGroups NovPrintQueues NovServers Category: Bindery Array NovUsersLoggedIn (Array) Fills array with list of all users that are currently logged in. Example: var Users NovUsersLoggedIn(Users) Loop Users Writeln LoopVal EndLoop See Also: NovUsers NovGroups NovPrintQueues NovServers See Also: NovConLoggedIn NovShowNotLoggedIn Category: Novell Array NovVersionNumber : Number Returns the Novell Netware version number. The number is returned as the major version number times 100 plus the minor version number. Thus 3.12 netware returns the number 312. Category: Novell NovVolumeNumber (Directory) : Number Returns the Novell volume number of a directory. Example: Writeln NovVolumeNumber ('F:') Category: Novell NovVolumes (Array) Reads volumes on the default server into an array. Example: var X NovVolumes(X) Loop X Writeln LoopVal EndLoop Computer Tyme * MarxMenu * Users Manual Page #240 ----------------------------------------------------------------- Category: Novell Array NovWaitOnSemaphore (Name) : Boolean This decrements the value of a semaphore and if the value is zero or more, returns true. If the value of the semaphore is negative, it returns false. This is used to indicate that you are out of whatever you are testing for. See Also: NovSignalSemaphore NovOpenSemaphore NovSemaphoreTimeout Category: Novell NovWritePropValue (Array,Obj,Prop,Type) NovWritePropValue is used to write values to Item properties only and not to static properties. Item properties contain data in 128-byte segments. These segments are passed as an array of strings. If you are passing binary data then build the binary data into the string array. Any strings that have less than 128 bytes are padded with zeros. Example: AppendArray(Values,'123') AppendArray(Values,'456') AppendArray(Values,'789') NovWritePropValue(Values,'TEST','WASTE',2) See Also: NovPropertyValues Category: Bindery NumberOfElements (Array) : Number This function returns the number of elements in the array. If the variable is not an array, 0 is returned. Example: var Lines ReadTextFile('MARXREAD.ME',Lines) Writeln 'The file is ' NumberofElements (Lines) ' lines long.' Category: Array Computer Tyme * MarxMenu * Users Manual Page #241 ----------------------------------------------------------------- Now : Time Returns the current moment or sets the system clock. Read the current moment: X = Now Set the system clock: Now = X See Also: Today Tomorrow Category: Time NumericOnly (On/Off) When NumericOnly is set to On only numbers will be accepted as input to Readln commands. See Also: Readln Category: StringInput NumLock : Boolean Returns true if the keyboard Num Lock light is On. This command can also set the Num Lock On and Off. Example: if NumLock then Write 'NumLock is On' NumLock On ;Turns NumLock On NumLock Off ;Turns NumLock Off NumLock (by itself) turns NumLock On. To test for NumLock: if NumLock Writeln 'NumLock is On' endif See Also: CapsLock ScrollLock Category: System Computer Tyme * MarxMenu * Users Manual Page #242 ----------------------------------------------------------------- Offset (String) : Number Returns the memory offset where string is located. See Also: Segment Category: Memory OldKbdBuffer : String When MarxMenu loads it clears the keyboard buffer of any characters left from the previous application. However, there are some applications that chain from one part to another by stuffing the keyboard buffer and exiting to dos. These applications are difficult to run from menu systems. So, when MarxMenu clears the buffer, it stores the buffer and it can be read by OldKbdBuffer. This allows you to execute other programs based on what was left in the buffer. Example: if OldKbdBuffer > '' Bat OldKbdBuffer ExitMenu endif See Also: ClearKbdBuffer Category: Keyboard OnKey (Char) When char is selected, the line(s) following are executed up to the next OnKey or end of file. This means that they are written to a BATCH file. Example: Onkey 'W' cd\wordstar ws cd\menu In the above example if 'W' is selected, MarxMenu will create a temporary batch file containing all the lines under the OnKey command. All the lines under an OnKey are written literally to the batch file with few exceptions. All leading and trailing blanks are stripped. String variables are evaluated and their value passed if the name of the string variable name starts with a '%'. Computer Tyme * MarxMenu * Users Manual Page #243 ----------------------------------------------------------------- If a line begins with a '|' (vertical bar), the line is interpreted rather than written to a batch file. If a '^Label' is used under an OnKey, a jump is made to the 'Label' and interpretation is resumed. This is commonly used to jump to a submenu. Another way to include MarxMenu variables and have more control inside the batch file is to use Bat commands. Bat commands are MarxMenu commands that create lines in the batch file you are creating. Any OnKey statement that causes a batch file to be written to will cause the menu to exit. MarxMenu normally will exit with ErrorLevel 0 unless an ExitCode is set. The first blank line under an OnKey ends what is written to the batch file. One common mistake is that when MarxMenu commands are intermixed with batch file statements that all the MarxMenu commands are executed first. This is because the batch statements are written to a batch file and executed when MarxMenu exist. Example: OnKey 'W' |ChDir('c:\wordstar') WS |ChDir('c:\menu') The above example won't work. Here's why. MarxMenu changes to the c:\wordstar directory. Then it stores WS in a batch file buffer. Then it changes to the c:\menu directory. Then MarxMenu writes the batch file and exits and you are in the wrong directory. Here is an example of using conditional statements under an OnKey command: Example: OnKey 'S' |if DisplayType = 'HERCMONO' |ChDir('C:\MONSMART') SMART |else |ChDir('C:\COLSMART') SMART |endif In the above example MarxMenu tests to see if a color-compatible screen is available. If so it runs SMART out of the color directory. Otherwise it runs SMART out of the mono directory. Note that all commands that MarxMenu sees start with the vertical bar character. Computer Tyme * MarxMenu * Users Manual Page #244 ----------------------------------------------------------------- Sometimes you want to execute a command where the command is created by a complex set of rules. The BAT command is useful here. Example: OnKey 'P' |Bat 'CAPTURE Q=' + Queue + ' C=1 NB NFF TI=5 Local=' + PrnPort In this example the |Bat command allows more specific control over what is sent to the batch file for execution. See Also: MxCmd Bat UseArrows OnScreenOnly Category: Conditional OnScreenOnly (On/Off) This allows you to restrict selections to only what is actually on the screen. Hidden OnKey commands will not execute if this is set on. This allows you to limit user selection to the choices on the screen. Example: OnScreenOnly On See Also: OnKey Category: Conditional OpenPrinter This command opens the printer device. It is not necessary to use this command since that it is done automatically whenever you print. But, if you are running under a multitasking shell like Windows or DesqView, it will reserve the printer for your task. If the printer is locked, or if you have specified a file name that can't be created, the variable FileResult will contain the DOS error code (usually 5 for access denied). A FileResult of 0 indicates success. See Also: ClosePrinter FileResult PrinterName Category: Printer OptionSwitch (String1,String2) : Boolean This command tests if String1 contains the option switch String2. If it does, it will remove the switch from String1. Example: String1 = 'Test /A/B/C' HasB = OptionSwitch(String1,'B') Computer Tyme * MarxMenu * Users Manual Page #245 ----------------------------------------------------------------- HasB will be true. String1 will contain 'Test /A/C' Category: String Or : Operator Returns logical Or if operators are boolean; or bitwise Or if operators are numeric. Example: if (B < 9) or (C > 5) then ..... ;boolean or X or $0F ;bitwise or See Also: And Xor Not Category: Math Boolean Ord (Char) : Number Returns the numeric value of an ascii character. Example: Ord('A') ;returns 65 Char(Ord('A') + 1) ;returns 'B' See Also: Char Category: String OutFile : String When using StandardIO the input and output files by default use the console. The output can be overridden by setting InFile to point to a different file or device. Example: OutFile = 'OUTPUT.TXT' StandardIO See Also: InFile StandardIO Category: File Computer Tyme * MarxMenu * Users Manual Page #246 ----------------------------------------------------------------- OutputRedirected : Boolean OutputRedirected returns True if you are using the dos piping commands to pipe output from MarxMenu into a file or another program. See Also: InputRedirected Category: System OverKey : String When using UseArrows, OverKey returns the character that selects the item that the inverse bar is over. This can be used with IdleProgram to display context sensitive help as you move the inverse bar over different selections. See Also: IdleProgram Category: String OverLay (MenuName) Overlay loads another menu as if that menu were a procedure of the current menu. After the overlaid menu exits, control is returned to the calling menu at the next line after the overlay command. Like the Chain command, Overlay is very fast and doesn't require MarxMenu to be reloaded. Example: Overlay 'SUBMENU' When using overlays, all variables declared as shared are accessible to the main program and all overlays. The shared variables have to be the same for all overlays. See Also: Shared Chain Category: Execution Overlayed : Boolean Overalyed returns true if menu is loaded as an overlay. Category: Execution Computer Tyme * MarxMenu * Users Manual Page #247 ----------------------------------------------------------------- PadLeft (String,Length) : String PadLeft will return String filled with blanks on the left side so that the length of the string is Length. Example: Writeln PadLeft('123',5) ;returns ' 123' See Also: PadLeftChar PadRight PadRightChar Category: String PadLeftChar (String,Char,Length) : String PadLeftChar returns a string that is padded on the left side with the character Char to a length of Length. Example: St = 'MARC' Writeln PadLeftChar(St,'*',8) ;returns '****MARC' See Also: PadLeft PadRight PadRightChar Category: String PadRight (String,Length) : String PadRight will return String filled with blanks on the right side so that the length of the string is Length. Example: Writeln PadRight('123',5) ;returns '123 ' See Also: PadRightChar PadLeft PadLeftChar Category: String PadRightChar (String,Char,Length) : String PadRightChar returns a string that is padded on the right side with the character Char to a length of Length. Example: St = 'MARC' Writeln PadRightChar(St,'*',8) ;returns 'MARC****' See Also: PadRight PadLeft PadLeftChar Computer Tyme * MarxMenu * Users Manual Page #248 ----------------------------------------------------------------- Category: String ParallelPorts : Number Returns number of parallel ports. Category: System ParamsToArray The ParamsToArray command allows you to pass any number of parameters to a procedure and receive those parameters into a single array. Example: Procedure WriteList (LinesToWrite) ParamsToArray Loop LinesToWrite Writeln LoopVal EndLoop EndProc WriteList ('Line1','Line2','Line3') See Also: Procedure Category: Array ParamStr (Num) : String Returns the DOS parameter string from the command line. The 0 parameter is MARXMENU.EXE. The 1 parameter is the name of the menu file you are using. This is like the %1 %2 %3 ... in batch file parameters. Category: String ParentEnvironment ParentEnvironment selects the parent environment for use with environment access commands. See Also: ReadEnv SetEnv ReadEnvironment ShellEnvironment See Also: CurrentEnvironment MasterEnvironment Category: Environment Computer Tyme * MarxMenu * Users Manual Page #249 ----------------------------------------------------------------- Password (Pswd,column,row) This command opens up a password box at row and column. The user must type the password correctly before the command will execute. Example: OnKey 'X' |PassWord('shell',4,3) COMMAND.COM The password is case sensitive if the password in the source code is lower case. But if the password in the source code is in uppercase then the password is not case sensitive. Example: Password 'CRITTER' 4 3 ;will accept critter or CRITTER Password 'CriTTeR' 4 3 ;will only accept CriTTeR Category: Conditional PathPart (String) : String Returns the path part of a filename. Example: PathPart ('C:\MARX\MARXMENU.EXE') ;returns C:\MARX See Also: Extension NamePart FilePart Category: String PauseAfterExecute (On/Off) If on, this command causes the message "Press any key to return to MarxMenu..." to appear after an execute command is executed. See Also: Execute Category: Execution PcType : String PcType returns the type of computer you are running as a string. Types: PC, XT, AT, PS2. Category: System Computer Tyme * MarxMenu * Users Manual Page #250 ----------------------------------------------------------------- Pi : Real Returns the value of Pi to 18 digits. Category: Math Float PickFile (FileSpec,column,row,height) : String Allows you to display a directory of files on the screen from a menu. Normally used to display a list of files for the user to choose from. Could be used in a command to load a word processor or database. Allows selection of the file to be loaded by the word processor or database program. The filename can be passed to a percent variable placed in the batch file executing the application. See example files on MarxMenu distribution disk. Example: FileName = PickFile('C:\WORDSTAR\*.DOC',3,4,17) Notice: The use of a variable with a name that starts with a '%' allows the choice to be passed to a batch file for execution. The three numbers represent the column and row of the upper left corner of the box and the height of the box. All DrawBox commands can be used here to control the looks of the PickFile window. This includes the BoxHeader command. Category: String PickMany(SourceArray,DestinationArray) PickMany displays a string array in the current window and allows you to choose as many lines as you want. The chosen lines go into DestinationArray. When the window appears, the space bar toggles the marked status of the line. The right arrow sets the marked status and the left arrow resets the marked status. Ctrl-Right-Arrow marks all lines, Ctrl-Left-Arrow unmarks all lines. The return key accepts the selection and exits. The ESC key aborts. If using a mouse, the left button toggles the mark on the current line. The right button accepts and exits. If no selections are made by marking selections then pressing Return on an entry selects the item the cursor bar is over. If ESC is pressed, the DestinationArray is left unchanged. You can test LastKey to see what was pressed. Computer Tyme * MarxMenu * Users Manual Page #251 ----------------------------------------------------------------- PickMany also creates two other arrays. One is called PickManyPositions and it is a list of numbers with the positions in the array that were picked. The other array is called PickManyFlags and is an array of boolean (True/False) values that are set in real time as the users chooses. Example: ;PICK&DEL.MNU Usage "MARXMENU PICK&DEL mask" ; var Temp, Work, Hitlist BoxHeader "PICK and DEL: A MarxMenu Demo" BoxFooter "Space=Mark, =DoIt" DrawBox 25,5,30,15 ReadDirectory(Cmdline,Work) ;Read Dir into Array work PickMany(Work,Hitlist) ;Use PickMany to select files! BoxHeader "Deleting Files" DrawBox 20,10,40,4 Loop Hitlist Writeln " Now Deleting File: " LoopVal DelFile LoopVal wait (10) EndLoop EraseTopWindow EraseTopWindow See Also: PickManyPositions PickOne PickManyFlags PickRedisplay Category: String Array PickManyFlags : Array PickManyFlags is an array that PickMany creates in real time indicating which items are picked. The array is an array of boolean values (True/False) that has the same number of elements as the array you are picking from. Every element that is picked is set to true in the same position in the PickManyFlags array. Since updating is done in real time a KeyEvent or background task can monitor this array and read which elements of the array are being selected. You could pop up another window that listed those elements already selected. See Also: PickMany Category: String Array Computer Tyme * MarxMenu * Users Manual Page #252 ----------------------------------------------------------------- PickManyPositions : Array After running PickMany an array PickManyPositions is created that has the position numbers in the original array that were chosen. See Also: PickMany Category: String Array PickOne (Array) : String This command displays an array in the current window and lets you pick a line and returns the chosen line. Example: var BatFiles, BatName ReadDirectory('*.BAT',BatFiles) DrawBox 35 10 20 9 BatName = PickOne(BatFiles) See Also: PickMany PickPosition PickRedisplay Category: String Array PickPosition : Number The variable PickPosition works with the PickOne command. PickPosition returns the number of which element in the array was picked. It is updated in real time so that if you are using KeyEvents you can read which elements the inverse bar is currently over. See Also: PickOne PickMany Category: String Array Port (Number) : Number Returns the value at the port or writes a number to a port. Example: X = Port(20) ;Reads port 20 into X Port(20) = X ;Writes X to Port 20 Category: Memory Computer Tyme * MarxMenu * Users Manual Page #253 ----------------------------------------------------------------- PickRedisplay PickRedisplay sets a flag for PickOne or PickMany to redisplay the choices in the array. If a KeyEvent were to alter the contents of an array that is currently being picked, this commant would force a redisplay the that the user sees the changes. PickOne and PickMany automatically detect and redisply the array if the number of elements of the array changes. See Also: PickMany PickOne Category: Array Pos (substring,string) : Number Finds position of substring in string. If substring isn't found, Pos returns 0. Example: pos('CD','ABCDE') returns 3 Category: String PosInList (String,Array) : Number Scans a string array looking for a match on string and returns the array index of the first matched string if found or a zero if not found. Example: X[1] = 'JOE' X[2] = 'KEVIN' X[3] = 'MARC' X[4] = 'PETE' Writeln PosInList('KEVIN',X) ;returns 2 You can also pass two numbers to PosInList which define the start and end positions in the list to search. Example: Writeln PosInList('KEVIN',X,2,3) ;returns 2 See Also: PosInSortedList Category: Array Computer Tyme * MarxMenu * Users Manual Page #254 ----------------------------------------------------------------- PosInListLeft (String,Array) : Number PosInListLeft is similar to the PosInList command. It searches a string array for a matching string and returns the line number of the first match. Unlike PosInList which compares the whole string, PosInListLeft will find the first string that starts with the search string. The difference between PosInListPartial and PosInListLeft is that PosInListPartial will match anywhere in the string, and PosInListLeft will match only if the string start with the search string. Example: var List List[1] = 'Date=09-20-93' List[2] = 'Time=10:18' List[3] = 'Name=Marc' Writeln PosInListLeft('Name=',List) ; returns 3 You can also pass two numbers to PosInListLeft which define the start and end positions in the list to search. See Also: PosInList Category: String Array PosInListPartial (String,Array) : Number PosInListPartial is similar to the PosInList command. It searches a string array for a matching string and returns the line number of the first match. Unlike PosInList which compares the whole string, PosInListPartial will find the first string that contains the search string. Example: var List List[1] = 'Date=09-20-93' List[2] = 'Time=10:18' List[3] = 'Name=Marc' Writeln PosInListPartial('Name=',List) ; returns 3 You can also pass two numbers to PosInListPartial which define the start and end positions in the list to search. See Also: PosInList Category: String Array Computer Tyme * MarxMenu * Users Manual Page #255 ----------------------------------------------------------------- PosInSortedList (String,Array) : Number Scans a string array looking for a match on string in a sorted array and returns the array index of the first matched string if found or a zero if not found. The array must be in sorted order. A binary search is used to make this command very fast. Example: X[1] = 'JOE' X[2] = 'KEVIN' X[3] = 'MARC' SortArray (X) Writeln PosInList('KEVIN',X) ;returns 2 See Also: PosInList Category: Array Power (Real,Real) : Real Raises a real to a given power. Example: Power(3,4) ;returns 81.0 Category: Math Float Pred (Number) : Number Returns number minus 1. Example: Pred(5) ;returns 4 See Also: Succ Category: Math Print (String) Prints string to the printer with no CR or LF. If there is an error printing, the error is returned in FileResult. Example: Print Char(12) ;prints a form feed Category: Printer Computer Tyme * MarxMenu * Users Manual Page #256 ----------------------------------------------------------------- PrinterName (String) Sets the filename for the printer to use. The default name is PRN. Other common printer names include: LPT1, LPT2, LPT3, and AUX. You can also use filenames to direct printer output to a file. See Also: ClosePrinter OpenPrinter Category: Printer PrintInstalled : Boolean PrintInstalled returns True if the dos program PRINT is installed. Category: System Println (String) Prints string to the printer with CR and LF. See Also: Print Category: Printer PrintScreen (On/Off) Turns the print screen function On and Off. Turning the print screen off disables the print screen key. This can be used to prevent a computer from locking up when the user hits the Print Screen key with no printer attached. Example: PrintScreen Off Category: Printer Procedure (name) This word begins the definition of a procedure. A procedure is like a subroutine. Once the procedure is defined, all you have to do to call the procedure is use its name. The procedure definition is terminated by the command EndProc. Example: Procedure SelectFile BoxHeaderColor ForeColor BackColor BoxBorderColor Cyan Mag BoxInsideColor Yellow Mag InverseColor Yellow Red Return PickFile (FileType,4,5,17) EndProc Computer Tyme * MarxMenu * Users Manual Page #257 ----------------------------------------------------------------- Whenever we use the word SelectFile in the menu, all the lines of the procedure SelectFile will execute. Parameters can be passed to procedures. When a parameter is passed it is normally passed by value. This mean that a copy of the original is passed. Whatever you do to the copy doesn't affect the original value. Example: var A Procedure Square (X) X = X * X Writeln X EndProc A = 6 Square (A) ;prints 36 Writeln A ;prints 6 In the above example Square (A) will write 36 but Writeln A will write 6. The reason is that Square passes a copy of A to X but the value of X is not returned to A. If you want the original A to be affected you would use the Loc command. A = 6 Square (Loc A) ;prints 36 Writeln A ;prints 36 In this example we pass Loc A to the Square procedure. Thus, instead of X being set to 6, X is set to point to A. As a pointer, any operation performed on X is performed on A instead. You can also return parameters from procedures using the Return command. Example: Procedure Cube (X) Return X * X * X EndProc Writeln Cube(3) ;returns 27 In MarxMenu you can return any number of parameters as long as the calling procedure is expecting the same number of parameters. Example: Procedure CenterOfScreen Return (ScreenWidth / 2) (ScreenHeight / 2) EndProc Computer Tyme * MarxMenu * Users Manual Page #258 ----------------------------------------------------------------- GotoXY(CenterOfScreen) In the above example, GotoXY expects two parameters. CenterOfScreen returns two parameters so MarxMenu is happy with it. You can pass many parameters and have them concatinated into a single string as the real parameter, much the way the parameters of the Writeln command work. Numbers passed are converted to strings. When you define your procedure, if you have a single parameter whose name begins with a "$", MarxMenu will process all parameters passed as a single string. Example: Procedure WriteALine ($Line) FileWriteln(OutputFile,Line) EndProc WriteALine DateString ' ' TimeString ' ' Temperature In the above example, because WriteALine had the parameter $Line, it tells MarxMenu to concatinate all parameters passed to it into a single string and put it into the variable Line. See Also: EndProc Return Loc ParamsToArray Category: Misc PullMenu (On/Off) Controls the behavior of the left and right arrow keys when using pull-down menus. Default is Off. See PULL.MNU for example. Category: Display Qualifier Used to create qualifiers which are named elements of an array. Example: Var President Qualifier FirstName, LastName President.FirstName = 'George' President.LastName = 'Washington' See Also: Var Constant Shared Computer Tyme * MarxMenu * Users Manual Page #259 ----------------------------------------------------------------- Category: Variable QualVal (Qualifier) : Number Returns the numeric value of a qualifier. Example: Qualifier A B C Writeln QualVal C ;returns 3 See Also: Qualifier Category: Variable RamOverlays : Boolean Returns True if overlays have been sucessfully loaded into ram by either EmsOverlays or XmsOverlays. See Also: EmsOverlays XmsOverlays Category: System Random : Number The Random command returns random numbers between 0 and +2,147,483,647. (2^31). The algorithm has been checked for good uniformity and takes advantage of re-seeding itself from random events like the timer interrupt and keyboard input. To get a random number in a specific range, use the Mod command. Example: Write 'Pick a Number from 1 to 10 ' Writeln (Random mod 10 + 1) Category: Math ReadAscTextFile (FileName,2D Array) ReadAscTextFile reads a standard comma delimited text file into a 2-dimensional array. The lines of the file must be limited to 1000 characters and the number of lines must be less than 13100. It also has to fit in memory. All text in quotes is converted to strings. Numbers not in quotes are translated as numbers unless there is a '.' in which case they are translated as floating point numbers. Computer Tyme * MarxMenu * Users Manual Page #260 ----------------------------------------------------------------- See Also: ReadlnAsc Category: File Array ReadDirectory (Path,Array) Reads a directory into an array. This command is controlled by several variables that control its behavior. If WholeFileNames is set to true, the names that are returned contain the whole path. If HiddenAndSystem is set to true, then Hidden and System files are also read. If IncludeDirectories is set to true, then directories are also read. If DirectoriesOnly is set to true, then only directory names are read. Example: Var X WholeFileNames Off ReadDirectory('*.MNU',X) Loop X Execute ('COPY ' + LoopVal + ' A:') EndLoop Here's a recursive example where we use ReadDirectory to read all the directories on the current drive. StandardIO DirectoriesOnly WholeFileNames ReadSubdirectories(CleanFileName('\')) Procedure ReadSubdirectories (Dir) var Subs Writeln Dir ReadDirectory(Dir,Subs) Loop Subs ReadSubdirectories(LoopVal) EndLoop EndProc See Also: WholeFileNames HiddenAndSystem IncludeDirectories See Also: DirectoriesOnly ReadSqDirectory Category: Array Directory Computer Tyme * MarxMenu * Users Manual Page #261 ----------------------------------------------------------------- ReadEnv (String) : String Returns the environment string specified. Example: PathString = ReadEnv('PATH') You can also read environment strings by enclosing the environment variable name in '%' like you do in batch files. Example: PathString = %PATH% See Also: SetEnv ReadEnvironment ShellEnvironment See Also: CurrentEnvironment ParentEnvironment MasterEnvironment Category: Environment ReadEnvironment (Array) Reads all environment variables into an array. The variable LongestLine is set to the length of the longest environment variable. Example: Var Env ReadEnvironment (Env) Writeln 'Your current environment variables are:' Loop Env Writeln LoopVal EndLoop Writeln Writeln('Your Environment Size is ',Str(EnvSize)) Writeln('You are using ',Str(EnvSize-EnvFree),' bytes.') Writeln('You have ',Str(EnvFree),' bytes free.') See Also: SetEnv ReadEnv ShellEnvironment See Also: CurrentEnvironment ParentEnvironment MasterEnvironment Category: Environment Array ReadFileBlock (Name,Offset,Size,Segment) ReadFileBlock reads disk file Name starting at byte Offset for Size bytes into memory buffer Segment. It is intended to read any kind of file. The maximum value for Size is 65504. The segment must be as large as the number of bytes you are reading. The following example will copy a small file. Computer Tyme * MarxMenu * Users Manual Page #262 ----------------------------------------------------------------- Example: Var RamBlock Size Size = FileSize 'MARXREAD.ME' RamBlock = GetMem(Size) ReadFileBlock('MARXREAD.ME' 0 Size RamBlock) WriteFileBlock('COPYREAD.ME' 0 Size RamBlock) FreeMem(RamBlock) See Also: WriteFileBlock GetMem FreeMem Category: File Memory ReadKey : String Returns the character that is input from the keyboard. If UseArrows is on then the inverse bar will appear in the current window for selecting a choice. Example: Var Key Repeat Writeln( 'Press the key to exit this program.' ) Key = ReadKey Until Key = Esc See Also: UseArrows UpperCaseOnly Category: Keyboard Readln : String Reads a string from the keyboard. By default the size of the string is from the cursor position to one space left of the right side of the current window. The size can be set to a smaller value using the InputLength command. InputString can be set to preload the string with a value for editing. UppercaseOnly can be set to force the string be entered in uppercase. Example: Name = Readln Number = Value (Readln) ;Converts to an numerical value State = UpperCase (ReadLn) See Also: InputString UpperCaseOnly InsertMode InputLength See Also: TrimInputString InputBlankChar Security See Also: NumericOnly CapFirstChar EchoChar FullLineReturn See Also: WorkString ReadlnTimeout ClearIfNewInput See Also: InitialCursorPos Computer Tyme * MarxMenu * Users Manual Page #263 ----------------------------------------------------------------- Category: String StringInput ReadlnAsc (File,Array) ReadlnAsc reads a single line from a comma delimited Ascii file and breaks the fields out into an array. All fields in quotes are considered strings. If the field is just comma delimited and numeric then it is converted to a number. If it has a decimal point then it is converted to a real number. Example: var F Fields FileAssign(F,'TEST.ASC') FileOpen(F) while not EndOfFile(F) ReadlnAsc(F,Fields) loop Fields Write LoopVal ' ' endloop Writeln EndWhile See Also: ReadAscTextFile Category: File ReadlnTimeout (Seconds) ReadlnTimeout is set to control the number of seconds a Readln or Readkey will wait for input before timing out. If a timeout occurs, LastKey will be set to char(255). Example: ReadlnTimeout = 5 Line = Readln See Also: Readln ReadKey Category: StringInput Keyboard ReadSqDirectory (Path,2DArray) ReadSqDirectory works like ReadDirectory but rather than just returning the file name it returns all the information about the file in a 2 dimensional array. The fields of the array are as follows: Computer Tyme * MarxMenu * Users Manual Page #264 ----------------------------------------------------------------- 1 - Name 2 - Date last Updated 3 - Size 4 - Attributes Under Netware there are several other fields: 5 - Date Created 6 - Date last Accessed 7 - Date last Archived 8 - Owner 9 - Maximum Rights Mask (Directories) Example: Var X Y ReadSqDirectory('*.EXE',X) Writeln 'Listing File Name, Date Last Accessed, and Size.' Loop X Y = LoopIndex Writeln X[Y,1] ' ' DateString(X[Y,6]) ' ' X[Y,3] EndLoop See Also: WholeFileNames HiddenAndSystem IncludeDirectories See Also: DirectoriesOnly ReadDirectory Category: Array Directory ReadTextFile (FileName,Array) This command reads a text file into a string array. It also sets the variable LongestLine to the length of the longest line in the file. Example: Var Docs ReadTextFile('MARXMENU.DOC',Docs) ;After the read, Docs[1] becomes the first line of the file. ;Docs[NumberOfElements(Docs)] becomes the last line. Loop Docs ; Convert each line to its uppercase equivalent LoopVal = UpperCase LoopVal EndLoop ;Save the newly formatted array WriteTextFile ('NEWMM.DOC',Docs) Do not use FileOpen with ReadTextFile. The power of the ReadTextFile and WriteTextFile have expanded. You can now load and save arrays of any variable types, multidimensional arrays, and mixed array types. This includes strings, numbers, and booleans. File variables are also stored. When a file variable is stored and reloaded the FileAssign command is not necessary. Computer Tyme * MarxMenu * Users Manual Page #265 ----------------------------------------------------------------- See Also: LongestLine Category: File Array Real (Integer) : Real Returns the real equivalent of an integer. Example: Real(5) ;returns 5.0 See Also: Integer Category: Math Float Reboot Causes the computer to do a warm reboot. See Also: ColdBoot Category: Execution ReleaseDate : String Returns the MarxMenu Release Date. Category: String Repeat Used for program control. Example: REPEAT statement statement UNTIL condition REPEAT statement UNTIL condition REPEAT statement UNTIL condition REPEAT statement statement FOREVER Computer Tyme * MarxMenu * Users Manual Page #266 ----------------------------------------------------------------- Example: Var Key Repeat Key = ReadKey If Key = 'A' Bat( 'DOLIST.EXE' ) ExitMenu EndIf If Key = F1 Then Help Until Key = Esc See Also: Until Forever Category: Conditional ResizeWindow (Horizontal Vertical) Changes the size of the top window. The horizontal and vertical numbers are added to the current size. Use negative numbers to shrink the window. The top left corner stays in the same place. Example: DrawBox 15 5 30 15 ResizeWindow 15 5 See Also: MoveWindow Category: Display ResultsInK (On/Off) Normally the value returned by TotalDiskSpace and other similar disk functions are returned in bytes. When ResultsInK is set to true the values return are in K (1024 bytes). This allows you to show the total disk space on drives larger than 2 gigabytes. Example: ResultsInK Writeln FreeDiskSpace('.') / 977 ' Mb' ;1,000,000 / 1024 = 997 See Also: FreeDiskSpace UsedDiskSpace TotalDiskSpace Category: System Computer Tyme * MarxMenu * Users Manual Page #267 ----------------------------------------------------------------- Return (param,param,...) Exits a procedure and optionally returns parameters to the calling procedure. It can return as many parameters as you want as long as the calling program uses the same number of parameters. Otherwise, you will get an "Invalid number of parameters" error. Example: Procedure SmallRandomNumber {Returns a random number between 1 and 100} var SmallRand SmallRand = Random mod 100 Return (SmallRand + 1) EndProc See Also: Procedure EndProc Category: Misc ReturnCode : Number When you use the Execute function, a ReturnCode value is fed into this variable when you return to the menu. The code returned is the same as what the DOS ErrorLevel would be. This will not work if you use the UseCommand On function because COMMAND.COM would have been loaded and the returncode would be lost. You also have to specify the COM or EXE extension or else MarxMenu will use COMMAND.COM and the return code will be lost. Example: Execute 'INMEM.EXE SK' if ReturnCode = 0 then Writeln 'Sidekick not Loaded!' See Also: ExitCode Category: Execution Right (string,count) : String Returns right characters of string for length count. Example: Right('ABCDEF',3) returns 'DEF' Category: String Computer Tyme * MarxMenu * Users Manual Page #268 ----------------------------------------------------------------- RightOfEqual (String) : String RightOfEqual return that part of the string that is right of the equal character (not including the equal character itself) and with trailing spaces trimmed off. Example: Writeln RightOfEqual('Device=VIPX.386') ;returns 'VIPX.386' See Also: LeftOfEqual Category: String RmDir (String) Removes a directory. The FileResult variable returns the DOS result error code. A zero in FileResult indicates success. You can't remove a directory that contains files or other directories. Example: RmDir 'C:\NETUTILS' See Also: ChDir MkDir Category: Directory RollWindow (Number) Windows can be looked at as a stack. RollWindow will roll a previous window to the top of the stack making the previous window the current window. Example: ;Make the third window on the stack the active window RollWindow 3 ;Write out message Writeln 'You have mail waiting!' ;Now put the windows back PushBackWindow (3) Procedure PushBackWindow (N) ;Will roll a window back to its original position on the stack ;The parameter should be the same as the parameter for the call ;to RollWindow. If you use RollWindow(3) then use PushBackWindow(3) Loop N RollWindow N EndLoop EndProc ;PushBackWindow Computer Tyme * MarxMenu * Users Manual Page #269 ----------------------------------------------------------------- See Also: CurrentWindow SetTopWindow Category: Display Run variable (parameters) This runs a procedure that was stored in a variable. Example: var Y Procedure WriteSquared (X) Writeln (X * X) EndProc Y = Loc WriteSquared Run Y(3) ; This will write a 9 on the screen Warning! Don't put the variable you are running in parentheses. Run (Y,3) ; this won't work See Also: Loc Category: Misc SavePosition (On/Off) If SavePosition is On, MarxMenu will return to the last menu selection you made when MarxMenu is re-entered. As you select menu layers your keystrokes are stored in an internal string variable called KeySave. On exit, MarxMenu writes KeySave to an environment variable KSV. On return to MarxMenu, this variable is retrieved. The return point may be altered by using the command KeySave = (String). Another thing this points out is that environment variables can be used to store information and allow MarxMenu to remember things from one selection to another. Since MarxMenu doesn't stay memory resident, this is the only way I have found to store information. See Also: MenuKeyBuffer KeySave Category: Keyboard Environment Computer Tyme * MarxMenu * Users Manual Page #270 ----------------------------------------------------------------- ScreenHeight : Number Returns number of rows of character on your screen. Normally this is 25. Category: Video ScreenWidth : Number Returns number of columns of character on your screen. Normally this is 80. Category: Video ScrollLock : Boolean Returns true if Scroll Lock is on. This command can also set the Scroll Lock on and off. Example: if ScrollLock then Write 'ScrollLock is On' ScrollLock On ;Turns ScrollLock On ScrollLock Off ;Turns ScrollLock Off ScrollLock (by itself) turns ScrollLock On. To test for ScrollLock: if ScrollLock endif See Also: CapsLock NumLock Category: System ScrollMove (On/Off) This allows you to control whether or not the ScrollLock will allow you to move the top window. Default is On. Example: ScrollMove Off Category: Display Computer Tyme * MarxMenu * Users Manual Page #271 ----------------------------------------------------------------- Second : Number Returns the current second. Category: Time SecondOf (Date) : Number Returns the second of a date. If Date is passed as a string it is converted automatically. Example: SecondOf '6:32:23' ;returns 23 See Also: TimeOf BadDate Category: Time Security (On/Off) When security is on, Readln echos '*' instead of the letters that are being typed. This is used for such things as entering passwords other than using the password command. Example: Security On See Also: Readln Category: StringInput Segment (String) : Number Returns the memory segment where string is located. See Also: Offset Category: Memory SelectPath : String This command uses another program in the Computer Tyme DOS TOOLBOX called Pick Directory to read a text into a variable. You must have Computer Tyme Pick Directory for this feature to work. Example: OnKey 'B' |%BackPath = SelectPath cd %BackPath backup c: a: Computer Tyme * MarxMenu * Users Manual Page #272 ----------------------------------------------------------------- Category: Directory SemAttachTo (String) Novell Semahpores work by finding a TSR in memory and attaching the semaphore to it. Normally it attaches to the first TSR, but if SemAttachTo is set it will attach to a specific TSR. If SemAttachTo is empty it will be set to the name of the TSR that MarxMenu uses to attach the Semaphore. That way you can read it's value. Example: SemAttachTo = 'LSL' See Also: NovOpenSemaphore Category: Novell SerialNumber This returns your MarxMenu serial number in a numeric variable. If you are using an unregistered evaluation version of MarxMenu the result is (0)-Zero. Example: if SerialNumber <> 0 writeln "My MarxMenu serial number is: " SerialNumber else writeln "This is an unregistered MarxMenu, no serial number." endif SerialPorts : Number Returns number of serial ports. Category: System Set [Value,Value,Value,Value] Set is used to define an array made up of specific values. Example: X = Set[2,3,5,7] ;Variable X becomes an array containing 2 3 5 and 7. Category: Array Computer Tyme * MarxMenu * Users Manual Page #273 ----------------------------------------------------------------- SetArraySize (Array,Size) If the array is larger than Size the array is truncated. If it is smaller, memory is allocated for the array. Category: Array SetEnv (String) This is used to set environment strings. It can be used on the Current, Parent, Master or Shell environment. Example: SetEnv ('PATH=C:\') SetEnv ('COMSPEC=X:COMMAND.COM') You can also set the environment by using '%' on each side of the environment variable. Example: %PATH% = 'C:\' %COMSPEC% = 'O:\COMMAND.COM' MarxMenu also allows you to select which environment you are working with. This is done with the following commands. CurrentEnvironment ParentEnvironment MasterEnvironment ShellEnvironment (default) See Also: ReadEnv ReadEnvironment ShellEnvironment See Also: CurrentEnvironment ParentEnvironment MasterEnvironment Category: Environment SetTimerTask (Loc Procedure,Ticks) SetTimerTask allows for background multitasking or real time events. The Ticks parameter specifies how often the task will run in clock ticks (18.2 times a second). If 6 ticks are specified then the task will run every 6 clock ticks or about 3 times a second. This command can be used to run scheduled events as well as periodic events. Example: SetTimerTask(Loc BlinkColor,9) Procedure BlinkColor gotoxy 5 5 textcolor white (random mod 7)+1 writeln " * Colors Change * " EndProc Computer Tyme * MarxMenu * Users Manual Page #274 ----------------------------------------------------------------- Category: Event SetTopWindow (Number) Selects a window by number making it the current window and moves it to the top. Example: DrawBox .... ThisWindow = CurrentWindow DrawBox .... DrawBox .... SetTopWindow (ThisWindow) See Also: CurrentWindow RollWindow SetWindowUnder Category: Display SetWindowUnder (Window1,Window2) This command moves Window1 underneath Window2. This can be used to put a window back in the stack after you use SetTopWindow. Example: SetWindowUnder (StatusWindow,StatusWindow + 1) See Also: CurrentWindow SetTopWindow RollWindow Category: Display Shadow (On/Off) Turn window shadows On/Off. Example: Shadow On Category: Display ShadowColor (Foreground,Background) Sets the color of the shadow. There are actually two shadow colors. MarxMenu stores different values for big shadows and small shadows. See Also: BigShadow SmallShadow ShadowPosition Shadow Category: Color Computer Tyme * MarxMenu * Users Manual Page #275 ----------------------------------------------------------------- ShadowPosition (Number) Selects the shadow position around the window. A zero (default) sets the shadow position to the bottom right side. A one sets the shadow position to the bottom left. Using ShadowPosition turns shadowing on so a Shadow On command is not required. Example: ShadowPosition 1 See Also: Shadow ShadowColor BigShadow SmallShadow Category: Display Shared The key word SHARED can be used to define variables just like VAR. Any variable defined with SHARED is passed globally to and from overlays. The important thing is that the Shared variables must be defined exactly the same way between the overlays. There is also a predefined variable called COMMON. Technically, Shared variables are qualifiers off of COMMON. Example: Shared Var1 Var2 Var3 See Also: Var Constant Qualifier Category: Variable ShareInstalled : Boolean ShareInstalled returns True if the dos program SHARE is installed. Category: System ShellEnvironment ShellEnvironment selects the environment of the last COMMAND.COM in memory for use with environment access commands. This is usually the same as the Master Environment. More than one COMMAND.COM is loaded when you are running a shell under Windows or DesqView. When using these programs, you will want to access the Shell Environment instead of the Master Environment. The Shell Environment is the one that will run batch files. Computer Tyme * MarxMenu * Users Manual Page #276 ----------------------------------------------------------------- See Also: ReadEnv SetEnv ReadEnvironment MasterEnvironment See Also: CurrentEnvironment ParentEnvironment Category: Environment Shl : Operator Shift left, does a binary 32 bit shift left. Example: Writeln 5 Shl 2 ;returns 20 See Also: Shr Category: Math Shr : Operator Shift right, does a binary 32 bit shift right. Example: Writeln 20 Shr 2 ;returns 5 See Also: Shl Category: Math Sin (Radians) : Real Returns the Sine of a real. Category: Math Float SingleLineBox Selects single line box for menu borders. See Also: DoubleLineBox BlockBox CustomBox NoBoxBorder Category: Display SmallShadow Selects small shadow type. See Also: BigShadow ShadowPosition ShadowColor Category: Display Computer Tyme * MarxMenu * Users Manual Page #277 ----------------------------------------------------------------- SortArray (Array) SortArray will do an alphabetical sort on an array of strings. Example: Sort a Text File: Usage: DIR|MARXMENU SORT|MORE MARXMENU SORT INFILE OUTFILE SORT.MNU var SortBuf StandardIO ReadTextFile (ParamStr(2),SortBuf) SortArray(SortBuf) WriteTextFile (ParamStr(3),SortBuf) Category: Array SortArrayLinked Array,KeyArray SortArrayLinked will sort an array based upon the contents of a key array. Example: var NumberArray,key writeln "Array sequential on element 1" loop 10 NumberArray[LoopIndex,1]=LoopIndex NumberArray[LoopIndex,2]=(random mod 50 + 1) writeln NumberArray[LoopIndex,1] " " NumberArray[LoopIndex,2] endloop MatrixInvert NumberArray key = NumberArray[2] matrixinvert NumberArray sortarraylinked NumberArray,key writeln "Array now sorted based on element 2" loop 10 writeln NumberArray[LoopIndex,1] " " NumberArray[LoopIndex,2] endloop See Also: MatrixInvert Computer Tyme * MarxMenu * Users Manual Page #278 ----------------------------------------------------------------- Category: Array Sound (On/Off) Turn sound effects On/Off. Category: Display SplitPath (Array) SplitPath reads the PATH environment variable and splits it up into an array of strings that are directories the path is made up of. All directory names are capitalized. Example: var P SplitPath P Loop P Writeln LoopVal ;writes the directories in PATH EndLoop See Also: BuildPath FixPath Category: String Array Environment SpxFreeConnections : Number Returns the number of free SPX connections. Category: Novell IpxLoaded : Boolean Returns True if SPX is loaded Category: Novell SpxMaxConnections : Number Returns the maximum number of SPX connections allowed. Category: Novell Computer Tyme * MarxMenu * Users Manual Page #279 ----------------------------------------------------------------- Sqr (Real) : Real Returns the Square Root of a real. Category: Math Float StandardIO (On/Off) This tells MarxMenu to use standard Input and Output file handles for reading the keyboard and writing to the screen when turned On. When turned Off, MarxMenu does direct screen writes. When StandardIO is on, several MarxMenu commands will send ANSI escape sequences. The commands that send ANSI sequences are as follows: TextColor TextBackground ClearScreen ClearLine GotoXY The input and output can be redirected by using the InFile and OutFile variables. See Also: InFile OutFile Category: Display Ansi StartsWith (String) : Boolean StartsWith compares two strings and tests to see if one string starts with another string. Example: if IniString StartsWith 'DEVICE=' Writeln IniString endif See Also: EndsWith Contains Category: String Str (Number) : String Returns a string value from a numeric variable. Example: writeln "*"+Str(6 * 5)+"*" ;returns the string '*30*' Computer Tyme * MarxMenu * Users Manual Page #280 ----------------------------------------------------------------- See Also: Value Category: String StuffAKey (String or Number) Stuffs a single key into the DOS keyboard buffer when MarxMenu exits. The limit is 16 characters. Example: StuffAKey($3F00) ;stuff the F5 key StuffAKey F5 ;same thing Do not mix StuffAKey with StuffKBD. Use one or the other. Category: Execution Keyboard String StuffKBD (String) Stuffs the string into the DOS keyboard buffer when MarxMenu exits. The limit is 16 characters. Example: StuffKBD 'LOGOUT' + CR Category: Execution Keyboard String StuffKeyboardNow Normally the keyboard stuffing is done as MarxMenu quits. This forces the keyboard to be stuffed immediately. Category: Keyboard Substitute (String,Old,New) Substitute wiil scan a string to see if it contains the substring Old and replace it with New. If UpperCaseCompare is set to True then case is ignored in the comparison. Example: Var St St = 'ABCDEFABC' Substitute(St,'ABC','XX') Writeln St ;returns XXDEFXX Category: String Computer Tyme * MarxMenu * Users Manual Page #281 ----------------------------------------------------------------- Succ (Number) : Number Returns number plus 1. Example: Succ(4) ;returns 5 See Also: Pred Category: Math Suggest (Char) Normally the UseArrows command will start in the upper left-hand corner. By using the Suggest command, you can set it to start on any menu selection. Example: Suggest 'E' Category: Display Swapping (On/Off) If Swapping is set to On, the Execute command will cause MarxMenu to swap itself out of memory allowing more ram for the application being run. See Also: Execute Category: Execution TaskNumber : Number Reads the current task number. If running DesqView or Software Carousel, this is set to the window number. If running TaskMax this is set to the TaskID. If running in a DOS session under Windows it is set to the virtual machine number It can also be set by setting the TASK= environment variable. The TaskNumber is used to create unique batch files in an operating environment that supports multiple tasks so that temporary files from one task don't trash temporary files from another task when running MarxMenu more than once. See Also: CarouselLoaded WindowsLoaded DvLoaded TMaxInstalled Category: System Computer Tyme * MarxMenu * Users Manual Page #282 ----------------------------------------------------------------- TextBackground (color) Sets text background color. Example: TextBackground Blue Category: Color Ansi TextColor (Foreground,Background) Sets the color of text to be displayed on the screen. TextColor resets the value of CapsColor. Example: Loop 16 TextColor LoopIndex,Brown Writeln "This is a test" EndLoop Category: Color Ansi TextMode (num) Sets the video text mode. 0 = 40 column BW 1 = 40 column COLOR 2 = 80 column BW 3 = 80 column COLOR 7 = Mono 258 = 43/50 line EGA BW 259 = 43/50 line EGA COLOR Example: TextMode BW80 Category: Video TextPos : Number TextPos returns the current position in a text file. This can be saved so that you can go to the same place using TextSeek. See Also: TextSeek Category: File Computer Tyme * MarxMenu * Users Manual Page #283 ----------------------------------------------------------------- TextSeek (Number) TextSeek moves to a specific byte in a text file. See Also: TextPos Category: File Then Conditional control. Example: if then See Also: If Else Endif ElseIf Category: Conditional TimeOf (String) : Number Converts a string representing a date to a time number. The number is the number of seconds since 01-01-80. Conversion follows international rules based on the country code. Examples: '4-7-91' ;04-07-1991 00:00:00 '040791' ;04-07-1991 00:00:00 'April 7th, 1991 4:35pm' ;04-07-1991 16:35:00 '12:35:23a' ;04-07-1991 00:35:23 '3:15' ;04-07-1991 03:15:00 If the string can't be converted, then BadDate is set to true. See Also: BadDate Category: International Time Timer : Number Returns the system timer 32 bit value that is set to 0 at midnight and is incremented 18.2 times a second. Category: Time Computer Tyme * MarxMenu * Users Manual Page #284 ----------------------------------------------------------------- TimeSeparator : String Returns the time separator character from the country information. See Also: DecimalSeparator DateSeparator CountryCode Category: International Time TimeString (Time) : String Returns the time as a string in HH:MM:SS format. 24 hour. If no parameter is passed, Now is assumed. Example: Writeln TimeString ;returns the time of Now as text Writeln TimeString (Now + (5 * SecondsInHour)) ;returns the time of 5 hours from now as text Category: String Time TMaxActiveTasks : Number Returns the number of active tasks started under TaskMax. Category: TaskMax TMaxCreateTask (command string) TMaxCreateTask creates a new task and executes it. You pass it a command line just like you would use the EXECUTE program. Like the EXECUTE program, if you use the COM or EXE extension then you won't load a secondary COMMAND.COM and save yourself 5k of memory and gain some speed. When the program exits that task is cleared. The TaskID of the created task is returned in TMaxResult. Example: TMaxCreateTask 'DIR *.*' See Also: TMaxReturnCount TMaxResult Category: TaskMax Computer Tyme * MarxMenu * Users Manual Page #285 ----------------------------------------------------------------- TMaxCut (TaskID) Activates TaskMax data-cutting function. See Also: TMaxPaste TMaxGetPasteBuffer TMaxSetPasteBuffer Category: TaskMax TMaxDeleteTask (TaskID) Kills the task identified by TaskID. See Also: TMaxTaskOpenFiles Category: TaskMax TMaxDirectSwitching (On/Off) Turns On or Off the ability to use the direct switch keys without going through the task manager menu. Default is On. By setting it to Off the direct switch keys work normally. TaskMax sometimes conflicts with applications when direct switching is On. Example: TMaxdirectSwitching Off Category: TaskMax TMaxEMSMemLim (Number) This is a variable that can be either read or set to the maximum number of bytes of EMS memory that each task can have. This prevents one task from hogging up all the EMS. Setting this to 0 disables limiting. Example: TMaxEMSMemLim = 2000000 ;2 megs per task Writeln TMaxEMSLim Category: TaskMax TMaxGetPasteBuffer (Array) Reads the TaskMax paste buffer into an array of strings. See Also: TMaxCut TMaxPaste TMaxSetPasteBuffer Category: TaskMax Computer Tyme * MarxMenu * Users Manual Page #286 ----------------------------------------------------------------- TMaxInstalled : Boolean This function returns true if TaskMax is installed. Any other TaskMax command produces a run-time error if used when TaskMax is not installed. Example: if not TMaxInstalled Writeln 'This menu requires TaskMax to run!' endif Category: TaskMax TMaxMaxTasks : Number Returns the total number of tasks allowed by TaskMax. Default is 20. Category: TaskMax TMaxNameTask (Task,Name) Normally TaskMax automatically names tasks according to what program is running. TMaxNameTask allows you to override the default task name with a task name of your choosing. The name is limited to 8 characters, Example: TMaxNameTask (2,'MYNAME') ;renames task 2 Category: TaskMax TMaxPaste (TaskID) Activates TaskMax data pasting function. See Also: TMaxCut TMaxGetPasteBuffer TMaxSetPasteBuffer Category: TaskMax TMaxReadTaskInfo (2D Array) Reads the task information table into a 2-dimensional array where the first field is the task name and the second field is the TaskId number. The TaskID number is used by all TMax commands that act on a single task (TMaxDelete, TMaxSwitchTasks... ). Example: var Tasks TMaxReadTaskInfo(Tasks) Loop Tasks Writeln LoopVal[1] ' ' LoopVal[2] EndLoop Computer Tyme * MarxMenu * Users Manual Page #287 ----------------------------------------------------------------- Category: TaskMax TMaxResult : Number TMaxResult is a variable containing return information that other TMax command return or the result status of a TMax command. Category: TaskMax TMaxReturnCount This variable sets the number of timer ticks (18.2 ticks per second) that TMaxCreateTask will execute in a program before returning to the original program. If it is set to 0 it will stay in the original program. By setting TMaxReturnCount to a number other than 0 you can run a program for a few seconds and come back. This is used to preload tasks that you might later want to switch to. Example: TMaxReturnCount = 27 ;1.5 Seconds TMaxCreateTask 'DM3.EXE' ;load a file manager TMaxReturnCount = 0 ;set back to 0 for normal usage See Also: TMaxCreateTask Category: TaskMax TMaxSetPasteBuffer (Array) Sets the TaskMax paste buffer to the strings in array. See Also: TMaxCut TMaxPaste TMaxGetPasteBuffer Category: TaskMax TMaxSwitchTasks (TaskID) Switches the current task out and selects the task identified be TaskID. Category: TaskMax TMaxSwitchToManager This command brings up the task manager the same way as if you had pressed the hot key. Category: TaskMax Computer Tyme * MarxMenu * Users Manual Page #288 ----------------------------------------------------------------- TMaxTakeOver (On/Off) This allows your MarxMenu program to become the task manager menu. When the user presses the hot key to pop up the task switching menu it will pop up your MarxMenu program instead. You can disable this by setting it to Off. Category: TaskMax TMaxTaskOpenFiles (TaskID) : Number Returns the number of open files a task has. You may want to test to see if a task that open files before deleting the task. Example: if TMaxTaskOpenFiles (3) > 0 Writeln 'Task 3 has open files.' endif See Also: TMaxDeleteTask Category: TaskMax TMaxThisTask : Number Returns the TaskID of the current task. Category: TaskMax TMaxVersion : Number Returns the version number of TaskMax. Category: TaskMax Today : Date Returns the current day as a date. The date returned has the time set to midnight or 00:00:00. It can also be used to set the system date. Read the current day; X = Today Set the system clock: Today = TimeOf '08-19-91' See Also: Tomorrow Now Category: Time Computer Tyme * MarxMenu * Users Manual Page #289 ----------------------------------------------------------------- Tomorrow : Time Returns the time of the day after today at midnight. See Also: Today Now Category: Time Tone (Frequency,Duration) This command plays a note at Frequency cycles per second for a period of Duration 1/18 of a second. The reason it is in 1/18 seconds is because there is a standard interrupt that returns that time period. The IBM series computers are not music oriented machines so don't throw away your Compact Disk player. The maximum duration is 255 1/18 of a second. Normally, MarxMenu will create a break in between notes equal to 1/8 of the duration of the note. If you want to eliminate the break and create a 'slur' (music term), add 256 to the duration. This tells MarxMenu to connect the notes without a break. Category: Music TotalDiskSpace (Drive) : Number Returns total disk space in bytes. If ResultsInK is set to True then the value is returned in K (1024 Bytes). Example: Writeln (TotalDiskSpace 'C') TotalDiskSpace only looks at the first character of the string for the drive letter. See Also: FreeDiskSpace UsedDiskSpace ResultsInK Category: System TotalEMS : Number Returns total EMS memory in bytes. Example: Writeln TotalEMS Category: Memory Computer Tyme * MarxMenu * Users Manual Page #290 ----------------------------------------------------------------- Trim (String or Array) Trims white space from both ends of a string. White space is blank characters and lower. Example: St = ' ABC ' Trim St ;St now is 'ABC' When used with an array Trim removes blank lines from the beginning and end of the array. It doesn't trim the elements of the array. See Also: TrimLead TrimTrail Category: String Array TrimInputString (On/Off) TrimInputString if set to On will cause blank characters to be trimmed from the front and tail of a string read from the keyboard with Readln. By default, TrimInputString is set to true. See Also: Readln Category: StringInput TrimLead (St) TrimLead trims the leading spaces off of the left side of a string. Example: St = ' MARC ' TrimLead(St) Writeln St ;returns 'MARC ' When used with an array Trim removes blank lines from the beginning of the array. It doesn't trim the elements of the array. See Also: Trim TrimTrail Category: String Array TrimTrail (St) TrimTrail trims the trailing spaces off of the right side of a string. Example: St = ' MARC ' TrimTrail(St) Writeln St ;returns ' MARC' Computer Tyme * MarxMenu * Users Manual Page #291 ----------------------------------------------------------------- When used with an array Trim removes blank lines from the end of the array. It doesn't trim the elements of the array. See Also: Trim TrimLead Category: String Array TrueName (String) : String There is an undocumented feature of DOS called TRUENAME. It returns the real name of a file or directory looking past such things as drive mappings and Assigned or Substituted drives. On local drives you get the drive and path where the file really is. On networks you get server and volume information where the server name starts with a '\\'. Example: TrueName ('H:') ;returns \\TYME\SYS\HOME\MARC See Also: CleanFileName Category: String File TSRs (Array) TSRs returns a list of all TSRs in memory as well as the names of pending batch files. Example: var TsrList TSRs(TsrList) Loop TsrList Writeln LoopVal EndLoop See Also: InMem Category: Memory UnBlank : Boolean Unblank returns true if MarxMenu has determined that the screen blanker should finish. Your screen blanker needs to call UnBlank to determine when to unblank the screen. Example: while not UnBlank endwhile Computer Tyme * MarxMenu * Users Manual Page #292 ----------------------------------------------------------------- You can also set UnBlank to true when you want to UnBlank the screen. This can be used if you write your own screen blanker that is an external program. An example of writing your own screen blanker is included in the file WORM.INC. Example: Procedure MyBlanker Execute 'MYBLANK.EXE' UnBlank = True EndProc See Also: BlankScreenProgram Category: Display Unique (Array) Unique removes duplicates from a sorted array. Example: Var A A = Set['A','B','B','C'] Unique(A) ;removes the duplicate 'B' See Also: SortArray Category: Array UniqueFileName : String Uses the create new file call to get a filename that is different than any other filename. It is tied to the DOS call that is used to create a unique filename according to the rules of your operating system. Category: File String Until Conditional control. Example: Repeat Until Computer Tyme * MarxMenu * Users Manual Page #293 ----------------------------------------------------------------- See Also: Repeat Forever Category: Conditional UpperCase (String) : String Returns UpperCase of String, Supports international characters. Example: Name = UpperCase(Name) The UpperCase command will now take arrays as parameters. All strings in the array will become uppercase. Will work with multidimensional arrays. Elements that aren't strings are left alone. See Also: LowerCase Category: String International UpperCaseCompare (On/Off) When UpperCaseCompare is set to On, all string commands that compare strings are case insensitive. Example: UpperCaseCompare On Writeln 'ABC' = 'abc' ; returns true The commands this affects include all comparison operators, Pos, PosInList, PosInSortedList, PosInListPartial. Category: String UpperCaseOnly : Boolean Setting UpperCaseOnly to On forces text entered with Readln or ReadKey to upper case. Example: UpperCaseOnly On See Also: Readln Category: StringInput Computer Tyme * MarxMenu * Users Manual Page #294 ----------------------------------------------------------------- UseArrows UseArrows tells MarxMenu that the selection will be made by moving an inverse video bar over the selections. No parameters are required for this command to work. It will pick the first line with a capital letter as the first menu selection. All text in the window must be indented at least one space and there must be one space between the end of the line and the right wall of the window. Multiple items on the same line must be separated by two or more spaces. The OnKey selection is triggered by either the first capital letter in the selection or by a number from 0 - 9 or some punctuation characters. This number or letter will be a different color if you use the CapsColor command. (See Also: PULL.MNU for an example). UseArrows Off will disable this feature. See Also: ReadKey Category: Display UseCommand (On/Off) Used with Execute. UseCommand will load COMMAND.COM before running the specified program. Its not as fast, because the system has to find and load COMMAND.COM, then the specified program. The advantage is if COMMAND.COM is loaded, it will allow you to run batch files and internal DOS commands. It also doesn't require you to specify the COM or EXE extension. Example: OnKey 'D' |UseCommand On |Execute 'DM' The default is Off. See Also: Execute Category: Execution UsedDiskSpace (Drive) : Number Returns used disk space in bytes. If ResultsInK is set to True then the value is returned in K (1024 Bytes). Example: Writeln (UsedDiskSpace 'C') Computer Tyme * MarxMenu * Users Manual Page #295 ----------------------------------------------------------------- UsedDiskSpace only looks at the first character of the string for the drive letter. See Also: FreeDiskSpace TotalDiskSpace ResultsInK Category: System UseNovPassword : Boolean If UseNovPassword is set to true then the screen blanker will require that the user type his Novell password to unblank the screen. Full Novell security and intruder detection is active here. If Novell's intruder detection is active, then if an intruder fails to type in the password after a number of attempts, then Netware will not accept the correct password until intruder detection allows it. If you don't know what intruder detection is, read the Netware manuals on the subject. It is something you should use. Category: Novell Value (String) : Number Converts String to Number. Leading $ indicates Hex. Example: Value '5' ;returns 5 See Also: Str Category: String Math Real Var In MarxMenu all variables must be declared before they can be referenced. The VAR command is used to declare variables. Example: var X,Y,Z var X = 5 Y = 6 See Also: Constant Shared Qualifier Category: Variable Computer Tyme * MarxMenu * Users Manual Page #296 ----------------------------------------------------------------- VarType (Variable) : String VarType returns the type of data contained in a variable. Types returned include the following: NUL NUMBER REAL STRING ARRAY FILE POINTER PROCEDURE UNKNOWN Category: Variable VCPIInstalled : Boolean Returns True if VCPI services are installed. See Also: VCPIVersion Category: System VCPIVersion : String VCPIVersion returns the version of the VCPI driver you are using. If VCPI isn't present it returns an empty string. See Also: VCPIInstalled Category: System VideoMode : Number Returns Current Video Mode. Example: Writeln VideoMode Category: Video Computer Tyme * MarxMenu * Users Manual Page #297 ----------------------------------------------------------------- VideoPage : Number Returns Current Video Page. Category: Video ViewArray (Array) Allows you to view an array of strings in the current window. Works just like ViewTextFile. Example: var New ReadTextFile ('MARXREAD.ME',New) DrawBox 1 2 80 23 ViewArray New See Also: ViewTextFile Category: Display Array ViewTextFile (Name) This command lets you view a text file in the current window. Example: DrawBox 1 2 80 23 ViewTextFile 'MARXREAD.ME' See Also: ViewArrayFile Category: Display File VinCheckService (Service) : Number Returns information about the requested service. Services: 1 - Communications 2 - Primary 3270 Emulation ID 3 - Async Terminal Emulation 4 - File Deflection 5 - BPS 6 - Undocumented 7 - StreetTalk 8 - Environment 9 - NetBios 10 - Secondary 3270 Emulation ID 11 - Semaphore 12 - 3270 Emulation Active Status 13 - 3270 Keyboard Interrupt Simulator 14 - Advanced 3270 SNA 15 - Undocumented 16 - Undocumented Computer Tyme * MarxMenu * Users Manual Page #298 ----------------------------------------------------------------- Return Codes: 0 - Service is Installed 1 - Service is not Installed 2 - Invalid Service Number Category: Vines VinesInt : Number Returns the interrupt number the Vines software is servicing. Category: Vines VinesLoaded : Boolean VinesLoaded returns true if the Vines shell is loaded. Category: Vines VinUserName : String Returns the StreetTalk name of the person who is logged in. Category: Vines VinSerialNumber (Drive) : Number Returns the Vines serial number on the server that the drive letter references. Example: Writeln VinSerialNumber ('Z') Category: Vines VlmLoaded : Boolean Returns true if the VLM shell is loaded. See Also: NovShellLoaded Category: Novell Computer Tyme * MarxMenu * Users Manual Page #299 ----------------------------------------------------------------- Volume (Drive) Returns the volume label of the specified drive. It can also set the volume label of a drive. Example: Writeln Volume 'C' ;Volume label on drive C Volume 'C:' = 'HARD_DISK' Volume 'A:' = '' ;Erases volume label Category: System VT100mode (On/Off) There are some differeences between ANSI and VT100 codes. When VT100mode is on the AnsiWindows respond to VT100 sequences. See Also: AnsiWindows Category: Modem Wait (Number) Delay for a number of 1/100 seconds. Wait 250 delays 2 1/2 seconds. If you are running a multi-tasker like Windows 3 or DesqView, and the delay is over 1/4 second, MarxMenu will release time slices back to DOS and not bog down the CPU power on long waits. MarxMenu also releases CPU cycles while idle at the keyboard. Example: Wait 300 ;3 second delay See Also: WaitOrKbdReady Category: Misc WaitOrKbdReady (Number) This command is just like the WAIT command except the wait is aborted by pressing any key. Time to wait is in hundredths of a second. This command is useful when using MarxMenu to write a running demo. Example: WaitOrKbdReady 300 ;3 second delay or until KeyPress See Also: Wait EatKbdChar Computer Tyme * MarxMenu * Users Manual Page #300 ----------------------------------------------------------------- Category: Keyboard WhereX : Number Returns the horizontal position of the cursor within the current window. Category: Display WhereXAbs : Number Returns the horizontal screen position of the cursor. Category: Display WhereY : Number Returns the vertical position of the cursor within the current window. WhereYAbs : Number Returns the vertical screen position of the cursor. Category: Display While Used for program control. Usage: WHILE (condition) (statement) (statement) ENDWHILE Execution stays in the while loop as long as the condition is true. See Also: EndWhile Category: Conditional WholeFileNames (On/Off) Controls if ReadDirectory will return the whole name and path or just the filename part. Example: Var X WholeFileNames Off ;Just filename, no paths! ReadDirectory('*.MNU',X) Loop X Execute ('COPY ' + LoopVal + ' A:') EndLoop Computer Tyme * MarxMenu * Users Manual Page #301 ----------------------------------------------------------------- See Also: ReadDirectory Category: File Directory Window (X,Y,Width,Height) Window changes the size of the active area of the screen. It can be used to either reduce or expand where text can be written. See Also: DrawBox Category: Display WindowHeight : Number Returns number of rows in current window. Category: Display WindowWidth : Number Returns number of columns in current window. Category: Display WindowsLoaded : Boolean Returns True if MarxMenu is being run under Microsoft Windows. The virtual machine number can be read in the TaskNumber variable. See Also: TaskNumber Category: System WinX : Number Returns the horizontal location of the left hand corner of the window. See Also: WinY Category: Display WinY : Number Returns the vertical location of the left-hand corner of the window. See Also: WinX Computer Tyme * MarxMenu * Users Manual Page #302 ----------------------------------------------------------------- Category: Display Within (Start,End) : Boolean Within returns true if a value is within the range from Start to End. Within works with numbers and strings. Example: Within (Start,End) : Boolean Within returns True if a value is within the range from Start to End. Within works with numbers and strings. Example: if X within(5,7) then Write 'X is Within 5 to 7' if not (Ch within('A','Z')) Write 'Lower Case' Category: Misc WordStarKeys (On/Off) In the early days of MarxMenu I mapped many of the cursor movement keys to match the WordStar key strokes. Now you can turn this off to get the real scan codes from the arrow keys. See Also: Readln Category: String WorkString : String WorkString is a MarxMenu variable that contains the string that Readln is editing. This string can be accessed by KeyEvent routines so that a KeyEvent procedure can set what is being entered. Example: WorkString = PickOne(List) See Also: KeyEvent Category: StringInput Write (String) Writes (String) on the screen at the current cursor position. Example: Write ' - Heading - ' Computer Tyme * MarxMenu * Users Manual Page #303 ----------------------------------------------------------------- Category: Display WriteAscTextFile (File,2DArray) WriteAscTextFile writes a 2-dimensional array to a comma delimited ascii text file. Category: File WriteCenter (String) Writes (String) centered in current window. Category: Display WriteError (String) This command works just like Write except that it writes to the DOS error device handle. This can be used to put messages on the screen when the output is redirected to a file. See Also: WritelnError Category: Display WriteFileBlock (Name,Offset,Size,Segment) WriteFileBlock writes disk file Name starting at byte Offset for Size bytes from memory buffer Segment. It is intended to write any kind of file. If the file doesn't exist, it is created. The maximum value for Size is 65504. The segment must be as large as the number of bytes you are writing. See Also: ReadFileBlock GetMem FreeMem Category: File Memory Writeln (String) Writes (String) on the screen followed by a CR-LF (carriage return-line feed). Example: Writeln 'The time is: ' TimeString Category: Display Computer Tyme * MarxMenu * Users Manual Page #304 ----------------------------------------------------------------- WritelnAsc (File,Array) WritelnAsc writes one line to the end of a comma delimited ascii text file. Each element of the array becomes one field of that line. Writeln can be used two ways. You can either open a file with FileAssign and FileCreate or FileAppend, or you can just pass the name of the file. Passing the name alone assumes that you want to append the file, write one line, and close the file. You would want to use FileAssign if you are going to write several lines to a file. Example: var A A = set['MARC PERKEL','NERD',38] WritelnAsc('TEST.TXT',A) ;appends "MARC PERKEL","NERD",38 to file TEST.TXT Example: var X Y F FileAssign(F,'MULT.TBL') FileCreate(F) Loop 9 X = LoopIndex Loop 9 AppendArray(Y,LoopIndex * X) EndLoop WritelnAsc(F,Y) dispose(Y) EndLoop FileClose(F) Category: File WritelnError (String) This command works just like Writeln except that it writes to the DOS error device handle. This can be used to put messages on the screen when the output is redirected to a file. See Also: WriteError Category: Display Computer Tyme * MarxMenu * Users Manual Page #305 ----------------------------------------------------------------- WriteTextFile (FileName,Array) This command writes a string array to a text file. Do not use FileCreate or any other file commands with this. This command does it all. Example: var X ReadTextFile('MARXREAD.ME',X) WriteTextFile('A:MARXREAD.ME',X) ;copies file to A: See Also: ReadTextFile Category: File Array WriteVertical (String) Writes (String) vertically on the screen from the current cursor position. Example: WriteVertical( 'Hello' ) ;This would display H e l l o Category: Display XmsInstalled : Boolean Returns True if XMS memory manager is installed. See Also: XmsVersion Category: System XmsOverlays Loads the MARXMENU.OVR file into XMS memory. This is useful when using MarxMenu to log into Netware or when you are using MarxMenu as an application and you want it to be able to access overlays without going to the disk drives. If successful, the variable RamOverlays is set to true. If RamOverlays is already True then XmsOverlays does nothing. Thus, you can run the command XmsOverlays and EmsOverlays and the first one that succeeds causes the second one to do nothing. Computer Tyme * MarxMenu * Users Manual Page #306 ----------------------------------------------------------------- Example: XmsOverlays EmsOverlays See Also: EmsOverlays RamOverlays Category: System XmsVersion : String XmsVersion returns the version of the XMS driver you are using. If XMS isn't present it returns an empty string. See Also: XmsInstalled Category: System Xor : Operator Returns logical Xor if operators are boolean; or bitwise Xor if operators are numeric. Xor (exclusive or) means one or the other but not both can be true. Example: A = True B = False A Xor B ;returns true See Also: And Or Not Category: Math Boolean Year : Number Returns current Year. Example: Writeln Year ;returns 1993 Category: Time YearOf (Date) : Number Returns the year of a date. If Date is passed as a string it is converted automatically. Example: Writeln YearOf Today ;returns 1993 Computer Tyme * MarxMenu * Users Manual Page #307 ----------------------------------------------------------------- See Also: TimeOf BadDate Category: Time STRING CONSTANTS F1 = #0#59 SF1 = #0#84 CF1 = #0#94 AF1 = #0#104 F2 = #0#60 SF2 = #0#85 CF2 = #0#95 AF2 = #0#105 F3 = #0#61 SF3 = #0#86 CF3 = #0#96 AF3 = #0#106 F4 = #0#62 SF4 = #0#87 CF4 = #0#97 AF4 = #0#107 F5 = #0#63 SF5 = #0#88 CF5 = #0#98 AF5 = #0#108 F6 = #0#64 SF6 = #0#89 CF6 = #0#99 AF6 = #0#109 F7 = #0#65 SF7 = #0#90 CF7 = #0#100 AF7 = #0#110 F8 = #0#66 SF8 = #0#91 CF8 = #0#101 AF8 = #0#111 F9 = #0#67 SF9 = #0#92 CF9 = #0#102 AF9 = #0#112 F10 = #0#68 SF10 = #0#93 CF10 = #0#103 AF10 = #0#113 F11 = #0#133 SF11 = #0#135 CF11 = #0#137 AF11 = #0#139 F12 = #0#134 SF12 = #0#136 CF12 = #0#138 AF12 = #0#140 ALT1 = #0#120 BKSP = #8 ALT2 = #0#121 CR = #13 ALT3 = #0#122 CRLF = #13#10 ALT4 = #0#123 ESC = #27 ALT5 = #0#124 FF = #12 ALT6 = #0#125 LF = #10 ALT7 = #0#126 ALT8 = #0#127 ALT9 = #0#128 ALT0 = #0#129 Key Scan WordStar ---------------------------------- UpArrow = #0#72 ^E DownArrow = #0#80 ^X LeftArrow = #0#75 ^S RightArrow = #0#77 ^D HomeKey = #0#71 ^W EndKey = #0#79 ^Z CtrlLeftArrow = #0#115 ^A CtrlRightArrow = #0#116 ^F PgUpKey = #0#73 ^R PgDnKey = #0#81 ^C InsKey = #0#82 ^V DelKey = #0#83 ^G Category: Constants Computer Tyme * MarxMenu * Users Manual Page #308 ----------------------------------------------------------------- TIME AND DATE CONSTANTS Jan = 1 Sun = 0 Feb = 2 Mon = 1 Mar = 3 Tue = 2 Apr = 4 Wed = 3 May = 5 Thu = 4 Jun = 6 Fri = 5 Jul = 7 Sat = 6 Aug = 8 Sep = 9 SecondsInHour = 3600 Oct = 10 SecondsInDay = 86400 Nov = 11 Dec = 12 Category: Constants VIDEO CONSTANTS Video Modes: Display Types: BW40 = 0 0 = HercMono CO40 = 1 1 = CGA BW80 = 2 2 = MCGA CO50 = 3 3 = EGA MONO = 7 4 = VGA Category: Constants COLOR CONSTANTS Black = 0 DGrey = 8 Blue = 1 LBlue = 9 Green = 2 LGreen = 10 Cyan = 3 LCyan = 11 Red = 4 LRed = 12 Magenta = 5 LMagenta = 13 Brown = 6 Yellow = 14 Grey = 7 White = 15 Category: Constants BOOLEAN CONSTANTS True Yes On False No Off Category: Constants Computer Tyme * MarxMenu * Users Manual Page #309 -----------------------------------------------------------------