home *** CD-ROM | disk | FTP | other *** search
/ On Hand / On_Hand_From_Softbank_1994_Release_2_Disc_1_1994.iso / 00004 / s / disk1 / myob.ms_ / myob.bin
Text File  |  1993-12-22  |  17KB  |  531 lines

  1. '**************************************************************************
  2. '*                       M.Y.O.B. 4.0 Setup Script
  3. '*
  4. '*  Written 05/15/1992 by BMT
  5. '*  Revised 12/07/1993 by BMT
  6. '*
  7. '**************************************************************************
  8.  
  9. ''$DEFINE DEBUG  ''Define for script development/debugging
  10.  
  11. '$INCLUDE 'myob.inc'        '' Routines extracted from setupapi.inc and msdetect.inc
  12.  
  13. DECLARE SUB MaximizeWindow LIB "mscuistf.dll" (hwnd%)
  14. DECLARE SUB AddFilesToCopyList LIB "mscuistf.dll" (Dest$, SectType%)
  15. DECLARE FUNCTION CalcSectionSize LIB "mscuistf.dll" (SectType%) AS LONG
  16.  
  17. ''Default string constants
  18. CONST DEFPATH$      = ":\MYOB4"                     ''Default path
  19. CONST DEFGROUP$     = "Best!Ware"                   ''Default group
  20. CONST SETUPTITLE$   = "M.Y.O.B. Accounting Setup"   ''Title of setup window
  21. CONST ICONNAME$     = "M.Y.O.B. Accounting"         ''Name of program icon
  22. CONST UPGICONNAME$  = "M.Y.O.B. Accounting Upgrade" ''Name of upgrade program icon
  23. CONST APPEXENAME$   = "MYOB.EXE"                    ''Name of executable
  24. CONST UPGAPPEXENAME$= "MYOBUPG.EXE"                 ''Name of upgrade executable
  25.  
  26. CONST STARTERDIR$   = "STARTERS"        ''Sub directory for starter files
  27.  
  28. ''Miscellaneous numeric constants
  29. CONST WINDRIVECOST  = 1024  '' Extra space needed on Windows drive
  30.  
  31. ''Dialog ID's
  32. CONST WELCOME       = 100
  33. CONST ASKQUIT       = 200
  34. CONST DESTPATH      = 300
  35. CONST GROUPNAME     = 350
  36. CONST REGISTER      = 360
  37. CONST EXITFAILURE   = 400
  38. CONST EXITQUIT      = 600
  39. CONST EXITSUCCESS   = 700
  40. CONST OPTIONS       = 800
  41. CONST APPHELP       = 900
  42. CONST CHECK         = 2500
  43. CONST MODLESS       = 5000
  44. CONST CUSTINST      = 6200
  45. CONST TOOBIG        = 6300
  46. CONST BADPATH       = 6400
  47.  
  48. ''Bitmap ID
  49. CONST LOGO          = 1
  50.  
  51. ''File Types
  52. CONST NUMFILETYPES  = 2 '' Number of file types defined below
  53. CONST APPFILES      = 1 '' Application files
  54. CONST SAMPDATA      = 2 '' Sample data files
  55.  
  56. ''CustInst list symbol names
  57. CONST LISTAPPFILES$ = "ListAppFiles"    ''App. files key list
  58. CONST LISTSAMPDATA$ = "ListSampData"    ''Sample data key list
  59.  
  60. ''Free space calculation symbols
  61. CONST EXTRAS$   = "Extras"  ''List of extra costs to add per drive
  62. CONST COSTS$    = "Costs"   ''Disk space cost for each drive
  63. CONST NEEDEDS$  = "Neededs" ''Disk space needed for each drive
  64.  
  65. ''Section names
  66. CONST SECTAPPFILES$ = "APPFILES"    ''.INF file section for app. files
  67. CONST SECTSAMPDATA$ = "SAMPDATA"    ''.INF file section for starter data
  68.  
  69. ''Dialog list symbol names
  70. CONST CHECKSTATES$    = "CheckItemsState"   ''Checkbox state in main dialog
  71. CONST CHECKITEMS$     = "CheckItems"        ''Checkbox state in sample data dialog
  72. CONST STATUSTEXT$     = "StatusItemsText"   ''Disk space requirements display
  73. CONST DRIVETEXT$      = "DriveStatusText"   ''Path display
  74. CONST LISTITEMSLEFT$  = "ListItemsLeft"     ''Dual listbox (left) input/output
  75. CONST LISTITEMSRIGHT$ = "ListItemsRight"    ''Dual listbox (right) input/output
  76.  
  77. ''Reusable strings
  78. CONST KON$          = "ON"
  79. CONST KOFF$         = "OFF"
  80. CONST ZERO$         = "0"
  81. CONST KEND$         = "END"
  82. CONST CONTINUE$     = "CONTINUE"
  83. CONST REACTIVATE$   = "REACTIVATE"
  84. CONST KEXIT$        = "EXIT"
  85.  
  86. ''Miscellaneous string constants
  87. CONST CUIDLL$         = "mscuistf.dll"      ''Custom user interface dll
  88. CONST HELPPROC$       = "FHelpDlgProc"      ''Help dialog procedure
  89. CONST DIVIDER$        = ", "                ''String dividing data file and description
  90. CONST CENTERMODELESS$ ="CenterMode"         ''Modeless dialog center flag
  91.  
  92. ''Global system strings
  93. GLOBAL gDest$           ''Default destination directory.
  94. GLOBAL gGroup$          ''Default program manager group
  95. GLOBAL gSysDir$         ''Windows system directory (with the backslash)
  96. GLOBAL gWinDir$         ''Windows directory (with the backslash)
  97. GLOBAL gWinDrive$       ''Windows drive letter.
  98.  
  99. '' Miscellanoues
  100. GLOBAL  gWinVer%        ''Version of windows
  101. GLOBAL  gLastDrive%     ''Number (1 to 26) of LASTDRIVE in config.sys
  102. GLOBAL  gAppSize&       ''Application file(s) size in bytes
  103. GLOBAL  gSampSize&      ''Sample data file(s) size in bytes
  104.  
  105. DECLARE SUB SetDriveStatus
  106. DECLARE FUNCTION MakePath (sDir$, sFile$) AS STRING
  107.  
  108.  
  109. INIT:   '' Initialization
  110.  
  111.     ''Display maximized window and get Windows version
  112.     hwnd% = HwndFrame()
  113.     MaximizeWindow hwnd%
  114.     SetBitmap CUIDLL$, LOGO
  115.     SetTitle SETUPTITLE$
  116.     SetCopyGaugePosition -1, 2   '' Centered horizontally, but near top vertically
  117.     gWinVer% = GetWindowsMajorVersion() * 10 + GetWindowsMinorVersion()
  118.     gLastDrive% = WGetConfigLastDrive() - ASC("A") + 1
  119.     IF gLastDrive% < 5 THEN
  120.         gLastDrive% = 26
  121.     END IF
  122.     AddListItem CENTERMODELESS$, "3"    '' Center both horizontally and vertically
  123.     s$ = UIStartDlg(CUIDLL$, WELCOME, "FModelessDlgProc", APPHELP, HELPPROC$)
  124.  
  125.     ''Read the .INF file
  126.     Inf$ = GetSymbolValue("STF_SRCINFPATH")
  127.     IF Inf$ = "" THEN
  128.         Inf$ = GetSymbolValue("STF_CWDDIR") + "SETUP.INF"
  129.     END IF
  130.     ReadInfFile Inf$
  131.  
  132.     ''Get path and group
  133.     gWinDir$     = GetWindowsDir
  134.     gWinDrive$   = MID$(gWinDir$, 1, 1)
  135.     gDest$       = gWinDrive$ + DEFPATH$
  136.     gSysDir$     = GetWindowsSysDir()
  137.     gGroup$      = DEFGROUP$
  138.  
  139.     ''CustInst list symbols
  140.     FOR i% = 1 TO NUMFILETYPES STEP 1
  141.         AddListItem CHECKSTATES$, KON$
  142.     NEXT i%
  143.  
  144.     ''Build permanent key list for applications
  145.     MakeListFromSectionKeys LISTAPPFILES$, SECTAPPFILES$
  146.  
  147.     ''Get names of sample data files and add them as input to dual listbox screen
  148.     MakeListFromSectionKeys LISTSAMPDATA$, SECTSAMPDATA$
  149.     Num% = GetListLength(LISTSAMPDATA$)
  150.     FOR i% = 1 TO Num% STEP 1
  151.         AddListItem CHECKITEMS$, KON$
  152.         Desc$ = GetListItem(LISTSAMPDATA$, i%)  ''Using reference key as description
  153.         l& = GetSectionKeySize(SECTSAMPDATA$, Desc$)
  154.         Size$ = "(" + LTRIM$(STR$(l& / 1024)) + "K)"
  155.         FileName$ = GetSectionKeyFilename(SECTSAMPDATA$, Desc$)
  156.         FileName$ = UCASE$(FileName$)
  157.         AddListItem LISTITEMSRIGHT$, FileName$ + DIVIDER$ + Desc$ + DIVIDER$ + Size$
  158.     NEXT i%
  159.  
  160.     ''CustInst status text
  161.     FOR i% = 1 TO 2 STEP 1
  162.         AddListItem STATUSTEXT$, ""
  163.     NEXT i%
  164.     FOR i% = 1 TO 11 STEP 1
  165.         AddListItem DRIVETEXT$, ""
  166.     NEXT i%
  167.     ReplaceListItem DRIVETEXT$, 7, gDest$
  168.     ReplaceListItem DRIVETEXT$, 11, gGroup$
  169.  
  170.     ''Initialize disk requirements for applications
  171.     FOR i% = 1 TO gLastDrive% STEP 1
  172.         AddListItem EXTRAS$, ZERO$
  173.         AddListItem COSTS$, ZERO$
  174.         AddListItem NEEDEDS$, ZERO$
  175.     NEXT i%
  176.  
  177.     gAppSize&  = CalcSectionSize(APPFILES)
  178.     gSampSize& = CalcSectionSize(SAMPDATA)
  179.     SetDriveStatus
  180.     UIPop 1 '' Remove modeless welcome/wait
  181.  
  182. CUSTINST:   '' Custom installation dialog
  183.     s$ = UIStartDlg(CUIDLL$, CUSTINST, "FCustInstDlgProc", APPHELP, HELPPROC$)
  184.  
  185.     ''"Continue" button
  186.     IF s$ = CONTINUE$ THEN
  187.         ''Install
  188.         GOTO INSTALL
  189.     ''"Path" button.  Change installation path.
  190.     ELSEIF s$ = "PATH" THEN
  191.         GOTO GETPATH
  192.  
  193.     ''"Group" button.  Change Program manager group.
  194.     ELSEIF s$ = "GROUP" THEN
  195.         GOTO GETGROUP
  196.  
  197.     ''Applications checkbox.  Determine new disk requirements.
  198.     ELSEIF s$ = "CHK1" THEN
  199.         SetDriveStatus
  200.         GOTO CUSTINST
  201.  
  202.     ''Sample data checkbox.  Determine new disk requirements.
  203.     ELSEIF s$ = "CHK2" THEN
  204.         gSampSize& = CalcSectionSize(SAMPDATA)
  205.         SetDriveStatus
  206.         GOTO CUSTINST
  207.  
  208.     ''"Data Files" button.  Get selected data files.
  209.     ELSEIF s$ = "BTN2" THEN
  210.         GOTO OPTFILES1
  211.  
  212.     ''Redisplay status.
  213.     ELSEIF s$ = REACTIVATE$ THEN
  214.         SetDriveStatus
  215.         GOTO CUSTINST
  216.  
  217.     ''Must be quitting.
  218.     ELSE
  219.         GOSUB ASKQUIT
  220.         GOTO CUSTINST
  221.     END IF
  222.  
  223.  
  224.  
  225. INSTALL:
  226.     UIPop 1
  227.     ClearCopyList
  228.     IF GetListItem(CHECKSTATES$, APPFILES) = KON$ THEN
  229.         AddFilesToCopyList gDest$, APPFILES
  230.     END IF
  231.     IF GetListItem(CHECKSTATES$, SAMPDATA) = KON$ THEN
  232.         AddFilesToCopyList gDest$ + "\" + STARTERDIR$, SAMPDATA
  233.     END IF
  234.     IF GetCopyListCost(EXTRAS$, COSTS$, NEEDEDS$) <> 0 THEN
  235.         GOSUB TOOBIG
  236.         GOTO CUSTINST
  237.     END IF
  238.     CD$ = GetSymbolValue("STF_CWDDIR")
  239.     CreateDir gDest$, cmoNone
  240.     SetRestartDir(gDest$)
  241.     ClearBillboardList
  242.     ReplaceListItem CENTERMODELESS$, 1, "5" '' Center horizontally and put at bottom
  243.     AddToBillboardList "MSCUISTF.DLL", MODLESS, "FModelessDlgProc", 100
  244.     CopyFilesInCopyList
  245.     ClearBillboardList
  246.  
  247.     IF GetListItem(CHECKSTATES$, APPFILES) = KON$ AND LEN(gGroup$) <> 0 THEN
  248.         CreateProgmanGroup gGroup$, "", cmoNone
  249.         ShowProgmanGroup  gGroup$, 1, cmoNone
  250.         CreateProgmanItem gGroup$, ICONNAME$, MakePath(gDest$, APPEXENAME$), "", cmoOverwrite
  251.         CreateProgmanItem gGroup$, UPGICONNAME$, MakePath(gDest$, UPGAPPEXENAME$), "", cmoOverwrite
  252.     END IF
  253.  
  254. RESTARTWIN:
  255.     IF RestartListEmpty() = 0 THEN
  256.         IF gWinVer% >= 31 THEN
  257.             i% = DoMsgBox("Windows system files need to be updated.  This requires that Windows be shut down.  Press OK to continue or Cancel to abort.", "M.Y.O.B. Setup", MB_OKCANCEL+MB_TASKMODAL+MB_ICONINFORMATION)
  258.             IF i% = IDOK THEN
  259.                 i% = ExitExecRestart()
  260.             ELSEIF i% = IDCANCEL THEN
  261.                 GOSUB ASKQUIT
  262.                 GOTO RESTARTWIN
  263.             END IF
  264.         ELSE
  265.             i% = DoMsgBox("Windows system files need to be updated.  To do this, exit windows and execute the batch file _MSSETUP.BAT located in " + CD$, "M.Y.O.B. Setup", MB_OK+MB_TASKMODAL+MB_ICONINFORMATION)
  266.         END IF
  267.     END IF
  268.  
  269.  
  270. QUIT:
  271.     ON ERROR GOTO ERRQUIT
  272.  
  273.     IF ERR = 0 THEN
  274.         dlg% = EXITSUCCESS
  275.     ELSEIF ERR = STFQUIT THEN
  276.         dlg% = EXITQUIT
  277.     ELSE
  278.         dlg% = EXITFAILURE
  279.     END IF
  280. QUITL1:
  281.     s$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  282.     IF s$ = REACTIVATE$ THEN
  283.         GOTO QUITL1
  284.     END IF
  285.     UIPop 1
  286.     IF dlg% = EXITSUCCESS THEN
  287.         s$ = UIStartDlg(CUIDLL$, REGISTER, "FInfo0DlgProc", 0, "")
  288.         UIPop 1
  289.     ENDIF
  290.     END
  291.  
  292. ERRQUIT:
  293.     i% = DoMsgBox("Setup sources were corrupted, call M.Y.O.B. customer support.", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  294.     END
  295.  
  296.  
  297. ''Get user-entered group name
  298. GETGROUP:
  299.     SetSymbolValue "EditTextIn", gGroup$
  300.     SetSymbolValue "EditFocus", KEND$
  301.  
  302. GETGROUPL1:
  303.     s$ = UIStartDlg(CUIDLL$, GROUPNAME, "FEditDlgProc", APPHELP, HELPPROC$)
  304.  
  305.     IF s$ = CONTINUE$ THEN
  306.         gGroup$ = GetSymbolValue("EditTextOut")
  307.         ReplaceListItem DRIVETEXT$, 11, gGroup$
  308.         UIPop 1
  309.         GOTO CUSTINST
  310.     ELSEIF s$ = REACTIVATE$ THEN
  311.         SetDriveStatus
  312.         GOTO GETGROUPL1
  313.     ELSEIF s$ = KEXIT$ THEN
  314.         GOSUB ASKQUIT
  315.         GOTO GETGROUPL1
  316.     ELSE
  317.         UIPop 1
  318.         GOTO CUSTINST
  319.     END IF
  320.  
  321. ''Get user-entered path
  322. GETPATH:
  323.     SetSymbolValue "EditTextIn", gDest$
  324.     SetSymbolValue "EditFocus", KEND$
  325. GETPATHL1:
  326.     s$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", APPHELP, HELPPROC$)
  327.  
  328.     IF s$ = CONTINUE$ THEN
  329.         olddest$ = gDest$
  330.         gDest$ = GetSymbolValue("EditTextOut")
  331.  
  332.         ''Validate new path.
  333.         IF IsDirWritable(gDest$) = 0 THEN
  334.             GOSUB BADPATH
  335.             GOTO GETPATHL1
  336.         END IF
  337.         UIPop 1
  338.  
  339.         ''Truncate display if too long.
  340.         IF LEN(gDest$) > 23 THEN
  341.             ReplaceListItem DRIVETEXT$, 7, MID$(gDest$, 1, 23)+"..."
  342.         ELSE
  343.             ReplaceListItem DRIVETEXT$, 7, gDest$
  344.         END IF
  345.  
  346.         ''Recalc if path changed.
  347.         IF (olddest$ <> gDest$) AND (olddest$ <> gDest$+"\") AND (olddest$+"\" <> gDest$) THEN
  348.             SetDriveStatus
  349.         END IF
  350.  
  351.         olddest$ = ""
  352.         GOTO CUSTINST
  353.     ELSEIF s$ = REACTIVATE$ THEN
  354.         SetDriveStatus
  355.         GOTO GETPATHL1
  356.     ELSEIF s$ = KEXIT$ THEN
  357.         GOSUB ASKQUIT
  358.         GOTO GETPATHL1
  359.     ELSE
  360.         UIPop 1
  361.         GOTO CUSTINST
  362.     END IF
  363.  
  364.  
  365. ''Get selected sample data files
  366. OPTFILES1:
  367.     s$ = UIStartDlg(CUIDLL$, OPTIONS, "FDualListDlgProc", APPHELP, HELPPROC$)
  368.  
  369.     IF s$ = CONTINUE$ THEN
  370.         UIPop 1
  371.         gSampSize& = CalcSectionSize(SAMPDATA)
  372.         SetDriveStatus
  373.         GOTO CUSTINST
  374.     ELSEIF s$ = REACTIVATE$ THEN
  375.         SetDriveStatus
  376.         GOTO OPTFILES1
  377.     ELSEIF s$ = KEXIT$ THEN
  378.         GOSUB ASKQUIT
  379.         GOTO OPTFILES1
  380.     ELSE
  381.         UIPop 1
  382.         newopt$ = ""
  383.         GOTO CUSTINST
  384.     END IF
  385.  
  386.  
  387. ''Not enough space dialog
  388. TOOBIG:
  389.     s$ = UIStartDlg(CUIDLL$, TOOBIG, "FInfo0DlgProc", 0, "")
  390.     IF s$ = REACTIVATE$ THEN
  391.         SetDriveStatus
  392.         GOTO TOOBIG
  393.     END IF
  394.     UIPop 1
  395.     RETURN
  396.  
  397.  
  398. ''Bad path dialog
  399. BADPATH:
  400.     s$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  401.     IF s$ = REACTIVATE$ THEN
  402.         SetDriveStatus
  403.         GOTO BADPATH
  404.     END IF
  405.     UIPop 1
  406.     RETURN
  407.  
  408.  
  409. ''Quit confirmation dialog
  410. ASKQUIT:
  411.     s$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  412.  
  413.     IF s$ = KEXIT$ THEN
  414.         UIPopAll
  415.         ERROR STFQUIT
  416.     ELSEIF s$ = REACTIVATE$ THEN
  417.         GOTO ASKQUIT
  418.     ELSE
  419.         UIPop 1
  420.     END IF
  421.     RETURN
  422.  
  423.  
  424.  
  425.  
  426. '**
  427. '** Purpose:
  428. '**     Sets drive status info according to latest disk space calcs.
  429. '** Arguments:
  430. '**     none.
  431. '** Returns:
  432. '**     none.
  433. '*************************************************************************
  434. SUB SetDriveStatus STATIC
  435.     CursorSave% = ShowWaitCursor()
  436.  
  437.     drive$ = MID$(gDest$, 1, 1)
  438.     ndrive% = ASC(ucase$(drive$)) - ASC("A") + 1
  439.     nWinDrive% = ASC(ucase$(gWinDrive$)) - ASC("A") + 1
  440.     free& = GetFreeSpaceForDrive(drive$)
  441.     freedrive& = free&
  442.     ReplaceListItem DRIVETEXT$, 1, drive$ + ":"
  443.     ReplaceListItem DRIVETEXT$, 3, STR$(free& / 1024) + " K"
  444.  
  445.     IF GetListItem(CHECKSTATES$, APPFILES) = KON$ THEN
  446.         cost& = gAppSize&
  447.     ELSE
  448.         cost& = 0
  449.     END IF
  450.     ReplaceListItem STATUSTEXT$, APPFILES, STR$(cost& / 1024) + " K"
  451.     IF GetListItem(CHECKSTATES$, SAMPDATA) = KON$ THEN
  452.         cost& = gSampSize&
  453.     ELSE
  454.         cost& = 0
  455.     END IF
  456.     ReplaceListItem STATUSTEXT$, SAMPDATA, STR$(cost& / 1024) + " K"
  457.  
  458.  
  459.     ClearCopyList
  460.     IF GetListItem(CHECKSTATES$, APPFILES) = KON$ THEN
  461.         AddFilesToCopyList gDest$, APPFILES
  462.     END IF
  463.     IF GetListItem(CHECKSTATES$, SAMPDATA) = KON$ THEN
  464.         AddFilesToCopyList gDest$ + "\" + STARTERDIR$, SAMPDATA
  465.     END IF
  466.     ReplaceListItem EXTRAS$, nWinDrive%, ZERO$
  467.     l& = GetCopyListCost(EXTRAS$, COSTS$, NEEDEDS$)
  468.     IF GetListItem(CHECKSTATES$, APPFILES) = KON$ THEN
  469.         ''Add extra cost to Windows drive for ini/progman, etc.
  470.         cost& = VAL(GetListItem(EXTRAS$, nWinDrive%))
  471.         IF cost& = 0 THEN
  472.             cost& = WINDRIVECOST
  473.         END IF
  474.         ReplaceListItem EXTRAS$, nWinDrive%, STR$(cost&)
  475.     ELSE
  476.         ReplaceListItem EXTRAS$, nWinDrive%, ZERO$
  477.     END IF
  478.  
  479.     IF ndrive% = nWinDrive% THEN
  480.         ReplaceListItem DRIVETEXT$, 4, ""
  481.         ReplaceListItem DRIVETEXT$, 5, ""
  482.         ReplaceListItem DRIVETEXT$, 6, ""
  483.         nWinDrive% = -1
  484.     ELSE
  485.         cost& = VAL(GetListItem(COSTS$, nWinDrive%)) + VAL(GetListItem(EXTRAS$, nWinDrive%))
  486.         IF cost& = 0 THEN
  487.             ReplaceListItem DRIVETEXT$, 4, ""
  488.             ReplaceListItem DRIVETEXT$, 5, ""
  489.             ReplaceListItem DRIVETEXT$, 6, ""
  490.         ELSE
  491.             free& = GetFreeSpaceForDrive(gWinDrive$)
  492.             ReplaceListItem DRIVETEXT$, 4, gWinDrive$ + ":"
  493.             ReplaceListItem DRIVETEXT$, 5, STR$(cost& / 1024) + " K"
  494.             ReplaceListItem DRIVETEXT$, 6, STR$(free& / 1024) + " K"
  495.         END IF
  496.     END IF
  497.  
  498.     cost& = 0
  499.     FOR i% = 1 to gLastDrive% STEP 1
  500.         IF (i% <> nWinDrive%) THEN
  501.             cost& = cost& + VAL(GetListItem(COSTS$, i%)) + VAL(GetListItem(EXTRAS$, i%))
  502.         END IF
  503.     NEXT i%
  504.     ReplaceListItem DRIVETEXT$, 2, STR$(cost& / 1024) + " K"
  505.     RestoreCursor CursorSave%
  506. END SUB
  507.  
  508.  
  509. '**
  510. '** Purpose:
  511. '**     Appends a file name to the end of a directory path,
  512. '**     inserting a backslash character as needed.
  513. '** Arguments:
  514. '**     sDir$  - full directory path (with optional ending "\")
  515. '**     sFile$ - filename to append to directory
  516. '** Returns:
  517. '**     Resulting fully qualified path name.
  518. '*************************************************************************
  519. FUNCTION MakePath (sDir$, sFile$) STATIC AS STRING
  520.     IF sDir$ = "" THEN
  521.         MakePath = sFile$
  522.     ELSEIF sFile$ = "" THEN
  523.         MakePath = sDir$
  524.     ELSEIF MID$(sDir$, LEN(sDir$), 1) = "\" THEN
  525.         MakePath = sDir$ + sFile$
  526.     ELSE
  527.         MakePath = sDir$ + "\" + sFile$
  528.     END IF
  529. END FUNCTION
  530.  
  531.