;MailRun v2.11: Part A, Main body of script ;1992-1993 Gerald P. Sully, all rights reserved. #comment ************************************************************************** ************************************************************************** * * This file serves as "home base" for the rest of the script. * All other scripts will return to this one if they are * exited normally. It initializes MailRun, creates the * user interface, and then waits for action on the part of the * user. If the user executes a mailrun, this section is also * responsible for taking care of scheduling. * * Elements of the user interface are contained in the header * file (MRUN211.H). Menu selections are fielded by parsemenu() * and the toolbar is controlled by parseobject(). The routines * associated with menu items are contained in the header file * immediately following parsemenu() and parseobject(). Some of * these in turn call routines in other script modules through * the callscript() procedure. Where necessary, a FLAG is set to * inform the target module which routines to execute. * * The code for the interface is #included in every module of * MailRun so that any part of the script may be called from any * other part. Other script modules are called by MRUN211A and * MRUN211G (the module responsible for executing the mailrun) * using the "execute" command. When a module is called from * MRUN211B-F, a "chain" command is used. * ************************************************************************** ************************************************************************** #endcomment #define MRUN211A #define MRUN211AG #define MRUN211AB string MainBoxTabs integer RingInterrupt, AutoRun integer MailRunMenu, RunningMenu, FileMenu, ConfigMenu, AddMenu integer DefaultsMenu, ExecuteMenu, HelpMenu, EditMenu #include "mrun211.h" #define HAVEYOUPAID;YOURFIFTEENDOLLARSYET #comment ********************************************************************* * * MAIN() * * Calls checkchild(), initialize(), maketasklist(), * makemailrunlist(), runmenu(), mrunmenu(), mrunwin(), * getfirstitem(), helpabout(), parsedialog(), parsekeystate(), * interfaceon(), executor(), makefullname() * * Main first calls the initialization routines, then puts * up the main dialog box and waits for user action. * ********************************************************************* #endcomment proc main string MRunIcons checkchild() initialize() runmenu() mrunmenu() mrunwin() makemailrunlist() maketasklist() getfirstitem() showmenu MailRunMenu if AutoRun == 1 filereset() FLAGS |= RUNNING GoWait = 1 PostRun = 3 pause 2 else #ifdef HAVEYOUPAID;YOURFIFTEENDOLLARSYET helpabout() #else mailrunbox() #endif endif interfaceon() MRunIcons = makefullname(MailRunDir, "MRUNICON.DLL") when dialog call parsedialog while 1 if FLAGS & RUNNING copyfile MRunIcons "C:\MRUNICON.DLL" switch $XPIXELS case 1280 iconbutton 1 25 0 "" "C:\MRUNICON.DLL" 16 userwin endcase case 1024 iconbutton 1 30 0 "" "C:\MRUNICON.DLL" 16 userwin endcase case 800 iconbutton 1 40 0 "" "C:\MRUNICON.DLL" 16 userwin endcase default iconbutton 1 50 0 "" "C:\MRUNICON.DLL" 16 userwin endcase endswitch paint delfile "C:\MRUNICON.DLL" showmenu RunningMenu executor() copyfile MRunIcons "C:\MRUNICON.DLL" switch $XPIXELS case 1280 iconbutton 1 25 0 "" "C:\MRUNICON.DLL" 0 userwin endcase case 1024 iconbutton 1 30 0 "" "C:\MRUNICON.DLL" 0 userwin endcase case 800 iconbutton 1 40 0 "" "C:\MRUNICON.DLL" 0 userwin endcase default iconbutton 1 50 0 "" "C:\MRUNICON.DLL" 0 userwin endcase endswitch paint delfile "C:\MRUNICON.DLL" showmenu MailRunMenu endif endwhile endproc #comment ********************************************************************* * * INITIALIZE() * * Called by main() * * Calls cleardir(), makemrn(), makefullname(), checkfile() * * Saves system state and initializes global variables. * ********************************************************************* #endcomment proc initialize string LastRun, env, temp , CleanupFile string StateCapPath, StateCapFile, StateDnldPath, StateUpldPath integer StateAutoDL, StateActionBar, StateMetaKeys integer blank = 0 ;Create the working directory getenv "TEMP" env if NULLSTR env TempDir = makefullname($PWTASKPATH, "MRUNTEMP") else TempDir = makefullname(env, "MRUNTEMP") endif FLAGS = 0 MailRunIni = makefullname($WINPATH, "MAILRUN.INI") profilerd MailRunIni "MailRun" "MailRun" MailRunTrunc profilerd MailRunIni "MailRun" "MailRunDir" MailRunDir profilerd MailRunIni "MailRun" "AutoRun" AutoRun ;Save the current state of PCPlus/Win fetch autodnld StateAutoDL fetch capture path StateCapPath fetch capture file StateCapFile fetch dnldpath StateDnldPath fetch upldpath StateUpldPath StateActionBar = $ACTIONBAR StateMetaKeys = $METAKEYS ;Save the system state in the cleanup file cleanupfile = makefullname(TempDir, "CLEANUP.TMP") profilewr CleanupFile "Cleanup" "StateAutoDL" StateAutoDL profilewr CleanupFile "Cleanup" "StateCapPath" StateCapPath profilewr CleanupFile "Cleanup" "StateCapFile" StateCapFile profilewr CleanupFile "Cleanup" "StateDnldPath" StateDnldPath profilewr CleanupFile "Cleanup" "StateUpldPath" StateupldPath profilewr CleanupFile "Cleanup" "StateActionBar" StateActionBar profilewr CleanupFile "Cleanup" "StateMetaKeys" StateMetaKeys ;Change the settings set capture path MailRunDir set capture query OFF set autodnld OFF set aspect rangechk OFF metakeys OFF actionbar OFF ;If the mailrun in MAILRUN.INI doesn't exist, create it if NULLSTR MailRunTrunc blank = 1 else LastRun = makefullname(MailRunDir, MailRunTrunc) endif if !(checkfile(LastRun)) || blank temp = makefullname(MailRunDir, "*.MRN") findfirst temp if FOUND MailRunTrunc = $FILENAME LastRun = makefullname(MailRunDir, MailRunTrunc) else MailRunTrunc = "mailrun.mrn" MailRunList = "mailrun.mrn" makemrn() LastRun = MailRun endif endif ;Copy the mailrun to the temp directory MailRun = makefullname(TempDir, MailRunTrunc) TaskList = makefullname(TempDir, "TASKLIST.TMP") copyfile LastRun MailRun profilerd MailRun "MailRun" "Archiver" Archiver profilerd MailRun "MailRun" "QWKReader" QWKReader profilerd MailRun "MailRun" "LogViewer" LogViewer endproc #comment ********************************************************************* * * EXECUTOR() * * Called by main() * * Calls schedulebox(), mailrunbox(), checktime(), fileexit(), * scheduler(), domailrun(), makefullname(), filereset(), * maketasklist() * * Executes MRUN211G * * Puts up the MailRun Scheduling box and parses the result. * ********************************************************************* #endcomment proc executor string HH, MM, SS, temp, LogFile, domailrun integer Hour, Minute, Second integer dialogstatus, boxstatus domailrun = makefullname(MailRunDir, "MRUN211G") findfirst MailRun LogFile = $FNAME strcat LogFile ".CAP" if AppendLog == 0 ;if user does not want to append to existing log file temp = makefullname(MailRunDir, LogFile) delfile temp endif set capture file LogFile profilerd MailRun "MailRun" "RingInterrupt" RingInterrupt if AutoRun == 0 profilerd MailRun "MailRun" "ExecTime" ExecTime profilerd MailRun "MailRun" "PostRun" PostRun profilerd MailRun "MailRun" "GoWait" GoWait schedulebox() if GoWait == 1 disable CTRL 230 endif endif ;boxstatus indicates whether or not mailrunbox is showing boxstatus = 0 ;turn off parsedialog() for parsing contols clearwhen dialog while (FLAGS & RUNNING) && (AutoRun == 0) dialogstatus = $DIALOG switch dialogstatus case 1 ;User selected "Cancel" FLAGS &= IDLE mailrunbox() boxstatus = 1 ;turn back on parsedialog() for parsing controls when dialog call parsedialog return endcase case 10 ;User selected "OK" if GoWait == 2 ;if the scheduler is turned on... ;parse the entered time strextract HH ExecTime ":" 0 strextract MM ExecTime ":" 1 strextract SS ExecTime ":" 2 Hour = checktime(HH) Minute = checktime(MM) Second = checktime(SS) if ((Hour < 0) || (Hour > 23)) || ((Minute < 0) || \ (Minute > 59)) || ((Second < 0) || (Second > 59)) usermsg "The time must be in 24 hour format!" ExecTime = "HH:MM:SS" updatedlg 128 dialogstatus = $DIALOG loopwhile endif profilewr MailRun "MailRun" "ExecTime" ExecTime endif profilewr MailRun "MailRun" "RingInterrupt" RingInterrupt profilewr MailRun "MailRun" "PostRun" PostRun profilewr MailRun "MailRun" "GoWait" GoWait exitwhile endcase case 50 ;User changed Now/Later status if GoWait == 2 enable CTRL 230 else disable CTRL 230 endif endcase endswitch endwhile while FLAGS & RUNNING if AutoRun == 1 profilewr MailRunIni "MailRun" "AutoRun" 0 endif if GoWait == 2 ;if user has scheduled for a later time... mailrunbox() boxstatus = 1 disable CTRL 170 when dialog call parsedialog scheduler() endif if FLAGS & RUNNING ;if the user has not terminated the mailrun, execute it execute domailrun boxstatus = 0 if PostRun == 2 ;if post-mailrun activity is "Restart", reset the mailrun filereset() elseif PostRun == 3 ;if post-mailrun activity is "Shut Down", do so fileexit() else ;if post-mailrun activity is "Remain Idle", reset RUNNING flag FLAGS &= IDLE endif endif endwhile if boxstatus == 0 ;if mailrunbox is not displayed, show it mailrunbox() when dialog call parsedialog endif if GoWait == 2 ;if the scheduler was used, enable the combobox enable CTRL 170 endif statmsg "" maketasklist() updatedlg 80 endproc #comment ********************************************************************* * * SCHEDULER() * * Called by executor() * * Waits until the scheduled time before executing the * mailrun. * ********************************************************************* #endcomment proc scheduler long LExecTime updatedlg 64 ;get the system time for execution strsltime $DATE ExecTime LExecTime if LExecTime <= $LTIME ;if the time of execution is earlier than the current time ;increment the time of execution by 24 hours. LExecTime += 86400 endif strupr MailRunTrunc while (LExecTime > $LTIME) && (FLAGS & RUNNING) ;wait until the designated time is reached statmsg "%s will execute at %s Current time is %s" \ MailRunTrunc ExecTime $TIME24 pause 1 endwhile strlwr MailRunTrunc endproc #comment ********************************************************************* * * CHECKTIME() * * Called by executor() * * Converts a string into an integer time value. Returns * a value of 60 if a non-numeric character is received. * ********************************************************************* #endcomment func checktime : integer strparm TimeString integer TimeInteger atoi TimeString TimeInteger if TimeInteger == 0 if not strcmpi TimeString "00" TimeInteger = 60 endif endif return TimeInteger endfunc #comment ********************************************************************* * * MRUNMENU() * * Called by main() * * Creates the MailRun menu bar. * ********************************************************************* #endcomment proc mrunmenu menubar MailRunMenu menupopup MailRunMenu "&File" FileMenu menuitem FileMenu 1 "&New" menuitem FileMenu 2 "&Save" menuitem FileMenu 3 "Save &As" menuitem FileMenu SEPARATOR menuitem FileMenu 4 "&Reset mailrun" menuitem FileMenu 5 "&Delete mailrun" menuitem FileMenu SEPARATOR menuitem FileMenu 6 "&Create AutoRun" menuitem FileMenu SEPARATOR menuitem FileMenu 7 "E&xit" menupopup MailRunMenu "&Edit" EditMenu menuitem EditMenu 8 "Cu&t" menuitem EditMenu 9 "&Copy" menuitem EditMenu 10 "&Paste" menuitem EditMenu SEPARATOR menuitem EditMenu 11 "De&lete" menupopup MailRunMenu "&Configure" ConfigMenu menuitem ConfigMenu 12 "&Mailrun Settings" menuitem ConfigMenu 13 "&BBS Settings" menuitem ConfigMenu 14 "BBS &Prompts" menuitem ConfigMenu 15 "BBS Mail &Door" menupopup ConfigMenu "De&faults" DefaultsMenu menuitem DefaultsMenu 16 "&MailRun" menuitem DefaultsMenu 17 "&BBS" menuitem DefaultsMenu 18 "&Prompts" menuitem DefaultsMenu 19 "Mail &Door" menupopup MailRunMenu "&Add" AddMenu menuitem AddMenu 20 "&New BBS" menuitem AddMenu 21 "&Get/Send Mail" menuitem AddMenu 22 "&Upload File" menuitem AddMenu 23 "&Download File" menuitem AddMenu 24 "Send &Command" menuitem AddMenu 25 "Execute &Script" menupopup MailRunMenu "&Execute" ExecuteMenu menuitem ExecuteMenu 26 "&Execute MailRun" menuitem ExecuteMenu 27 "&QWK Reader" menuitem ExecuteMenu 28 "&Archiver" menuitem ExecuteMenu 29 "&View Log File" menupopup MailRunMenu "&Help" HelpMenu menuitem HelpMenu 30 "&Contents" menuitem HelpMenu 31 "&On current window..." menuitem HelpMenu SEPARATOR menuitem HelpMenu 32 "&About MailRun" endproc #comment ********************************************************************* * * RUNMENU() * * Called by main() * * Creates the menu bar used while a mailrun is executing. * ********************************************************************* #endcomment proc runmenu menubar RunningMenu menupopup RunningMenu "&File" FileMenu menuitem FileMenu 1 "&New" menuitem FileMenu 2 "&Save" menuitem FileMenu 3 "Save &As" menuitem FileMenu SEPARATOR menuitem FileMenu 4 "&Reset mailrun" menuitem FileMenu 5 "&Delete mailrun" menuitem FileMenu SEPARATOR menuitem FileMenu 6 "&Create AutoRun" menuitem FileMenu SEPARATOR menuitem FileMenu 7 "E&xit" menupopup RunningMenu "&Edit" EditMenu menuitem EditMenu 8 "Cu&t" menuitem EditMenu 9 "&Copy" menuitem EditMenu 10 "&Paste" menuitem EditMenu SEPARATOR menuitem EditMenu 11 "De&lete" menupopup RunningMenu "&Configure" ConfigMenu menuitem ConfigMenu 12 "&Mailrun Settings" menuitem ConfigMenu 13 "&BBS Settings" menuitem ConfigMenu 14 "BBS &Prompts" menuitem ConfigMenu 15 "BBS Mail &Door" menupopup ConfigMenu "De&faults" DefaultsMenu menuitem DefaultsMenu 16 "&MailRun" menuitem DefaultsMenu 17 "&BBS" menuitem DefaultsMenu 18 "&Prompts" menuitem DefaultsMenu 19 "Mail &Door" menupopup RunningMenu "&Add" AddMenu menuitem AddMenu 20 "&New BBS" menuitem AddMenu 21 "&Get/Send Mail" menuitem AddMenu 22 "&Upload File" menuitem AddMenu 23 "&Download File" menuitem AddMenu 24 "Send &Command" menuitem AddMenu 25 "Execute &Script" menupopup RunningMenu "&Execute" ExecuteMenu menuitem ExecuteMenu 26 "T&erminate MailRun" menuitem ExecuteMenu 27 "&QWK Reader" menuitem ExecuteMenu 28 "&Archiver" menuitem ExecuteMenu 29 "&View Log File" menupopup RunningMenu "&Help" HelpMenu menuitem HelpMenu 30 "&Contents" menuitem HelpMenu 31 "&On current window..." menuitem HelpMenu SEPARATOR menuitem HelpMenu 32 "&About MailRun" endproc #comment ********************************************************************* * * MRUNWIN() * * Called by main() * * Calls makefullname() * * Creates the MailRun icon bar. The DLL containing the * icons is copied to the C: root directory because the * iconbutton function will not accept variables as file * names. C:\ is used because it is fairly certain to exist. * ********************************************************************* #endcomment proc mrunwin string MRunIcons MRunIcons = makefullname(MailRunDir, "MRUNICON.DLL") copyfile MRunIcons "C:\MRUNICON.DLL" defuserwin TOP PIXELS 34 192 192 192 bitmap switch $XPIXELS case 1280 iconbutton 1 25 0 "" "C:\MRUNICON.DLL" 0 userwin iconbutton 2 300 0 "" "C:\MRUNICON.DLL" 1 userwin iconbutton 3 575 0 "" "C:\MRUNICON.DLL" 2 userwin iconbutton 4 850 0 "" "C:\MRUNICON.DLL" 3 userwin iconbutton 5 1250 0 "" "C:\MRUNICON.DLL" 4 userwin iconbutton 6 1525 0 "" "C:\MRUNICON.DLL" 5 userwin iconbutton 7 1800 0 "" "C:\MRUNICON.DLL" 6 userwin iconbutton 8 2075 0 "" "C:\MRUNICON.DLL" 7 userwin iconbutton 9 2350 0 "" "C:\MRUNICON.DLL" 8 userwin iconbutton 10 2625 0 "" "C:\MRUNICON.DLL" 9 userwin iconbutton 11 2900 0 "" "C:\MRUNICON.DLL" 10 userwin iconbutton 12 3300 0 "" "C:\MRUNICON.DLL" 11 userwin iconbutton 13 3575 0 "" "C:\MRUNICON.DLL" 12 userwin iconbutton 14 3850 0 "" "C:\MRUNICON.DLL" 13 userwin iconbutton 15 4250 0 "" "C:\MRUNICON.DLL" 14 userwin iconbutton 16 4650 0 "" "C:\MRUNICON.DLL" 15 userwin endcase case 1024 iconbutton 1 30 0 "" "C:\MRUNICON.DLL" 0 userwin iconbutton 2 374 0 "" "C:\MRUNICON.DLL" 1 userwin iconbutton 3 718 0 "" "C:\MRUNICON.DLL" 2 userwin iconbutton 4 1062 0 "" "C:\MRUNICON.DLL" 3 userwin iconbutton 5 1562 0 "" "C:\MRUNICON.DLL" 4 userwin iconbutton 6 1906 0 "" "C:\MRUNICON.DLL" 5 userwin iconbutton 7 2250 0 "" "C:\MRUNICON.DLL" 6 userwin iconbutton 8 2594 0 "" "C:\MRUNICON.DLL" 7 userwin iconbutton 9 2938 0 "" "C:\MRUNICON.DLL" 8 userwin iconbutton 10 3282 0 "" "C:\MRUNICON.DLL" 9 userwin iconbutton 11 3626 0 "" "C:\MRUNICON.DLL" 10 userwin iconbutton 12 4126 0 "" "C:\MRUNICON.DLL" 11 userwin iconbutton 13 4470 0 "" "C:\MRUNICON.DLL" 12 userwin iconbutton 14 4814 0 "" "C:\MRUNICON.DLL" 13 userwin iconbutton 15 5314 0 "" "C:\MRUNICON.DLL" 14 userwin iconbutton 16 5814 0 "" "C:\MRUNICON.DLL" 15 userwin endcase case 800 iconbutton 1 40 0 "" "C:\MRUNICON.DLL" 0 userwin iconbutton 2 480 0 "" "C:\MRUNICON.DLL" 1 userwin iconbutton 3 920 0 "" "C:\MRUNICON.DLL" 2 userwin iconbutton 4 1360 0 "" "C:\MRUNICON.DLL" 3 userwin iconbutton 5 2000 0 "" "C:\MRUNICON.DLL" 4 userwin iconbutton 6 2440 0 "" "C:\MRUNICON.DLL" 5 userwin iconbutton 7 2880 0 "" "C:\MRUNICON.DLL" 6 userwin iconbutton 8 3320 0 "" "C:\MRUNICON.DLL" 7 userwin iconbutton 9 3760 0 "" "C:\MRUNICON.DLL" 8 userwin iconbutton 10 4200 0 "" "C:\MRUNICON.DLL" 9 userwin iconbutton 11 4640 0 "" "C:\MRUNICON.DLL" 10 userwin iconbutton 12 5280 0 "" "C:\MRUNICON.DLL" 11 userwin iconbutton 13 5720 0 "" "C:\MRUNICON.DLL" 12 userwin iconbutton 14 6160 0 "" "C:\MRUNICON.DLL" 13 userwin iconbutton 15 6800 0 "" "C:\MRUNICON.DLL" 14 userwin iconbutton 16 7440 0 "" "C:\MRUNICON.DLL" 15 userwin endcase default iconbutton 1 50 0 "" "C:\MRUNICON.DLL" 0 userwin iconbutton 2 600 0 "" "C:\MRUNICON.DLL" 1 userwin iconbutton 3 1150 0 "" "C:\MRUNICON.DLL" 2 userwin iconbutton 4 1700 0 "" "C:\MRUNICON.DLL" 3 userwin iconbutton 5 2500 0 "" "C:\MRUNICON.DLL" 4 userwin iconbutton 6 3050 0 "" "C:\MRUNICON.DLL" 5 userwin iconbutton 7 3600 0 "" "C:\MRUNICON.DLL" 6 userwin iconbutton 8 4150 0 "" "C:\MRUNICON.DLL" 7 userwin iconbutton 9 4700 0 "" "C:\MRUNICON.DLL" 8 userwin iconbutton 10 5250 0 "" "C:\MRUNICON.DLL" 9 userwin iconbutton 11 5800 0 "" "C:\MRUNICON.DLL" 10 userwin iconbutton 12 6600 0 "" "C:\MRUNICON.DLL" 11 userwin iconbutton 13 7150 0 "" "C:\MRUNICON.DLL" 12 userwin iconbutton 14 7700 0 "" "C:\MRUNICON.DLL" 13 userwin iconbutton 15 8500 0 "" "C:\MRUNICON.DLL" 14 userwin iconbutton 16 9300 0 "" "C:\MRUNICON.DLL" 15 userwin endcase endswitch paint delfile "C:\MRUNICON.DLL" endproc #comment ********************************************************************* * * MAILRUNBOX() * * Called by main(), parsedialog(), callscript(), executor(), * sendscript() * * Draws the main MailRun dialog box. * ********************************************************************* #endcomment proc mailrunbox destroydlg MainBoxTabs = "20,30,220,230,233,236,239,242" AttemptNum = "0" HelpPage = 1 dialogbox 8 36 346 181 15 "MailRun" HELPID HelpPage groupbox 10 33 228 135 "Task List" shadow flistbox 15 52 218 102 TaskList MainBoxTabs single TaskItem text 15 153 49 8 left "# = permanent" text 76 153 49 8 left "¤ = temporary" text 140 153 33 8 left "! = error" text 182 153 53 8 left "@ = completed" groupbox 244 33 90 135 "Statistics" shadow text 248 55 62 8 right "BBSs in mailrun:" text 248 69 62 8 right "BBSs completed:" text 248 83 62 8 right "BBSs left to call:" text 248 97 62 8 right "Items in mailrun:" text 248 111 62 8 right "Items completed:" text 248 125 62 8 right "Item errors:" text 248 139 62 8 right "Items remaining:" text 248 153 62 8 right "Dialing Attempt:" vtext 314 55 16 9 left BBSTotal vtext 314 69 16 9 left BBSComplete vtext 314 83 16 9 left BBSRemaining vtext 314 97 16 9 left ItemTotal vtext 314 111 16 9 left ItemComplete vtext 314 125 16 9 left ItemError vtext 314 139 16 9 left ItemRemaining vtext 314 153 16 9 left AttemptNum text 102 14 74 8 right "The current mailrun is:" combobox 180 12 76 41 MailRunList MailRunTrunc sort pushbutton 0 0 0 0 " &t" normal default pushbutton 0 0 0 0 " &u" normal pushbutton 0 0 0 0 " &i" normal enddialog if FLAGS & RUNNING disable CTRL 170 endif endproc #comment ********************************************************************* * * SCHEDULEBOX() * * Called by executor() * * Draws the MailRun Scheduler dialog box. * ********************************************************************* #endcomment proc schedulebox destroydlg HelpPage = 3 dialogbox 55 58 238 120 15 "MailRun Scheduler" HELPID HelpPage groupbox 10 14 122 67 "Schedule" shadow radiobutton 21 28 90 10 "Execute MailRun Now!" GoWait radiobutton 21 44 90 10 "Execute MailRun Later..." endgroup text 17 62 43 8 right "Execute At:" editbox 64 60 55 12 ExecTime 8 groupbox 142 14 80 67 "When finished... " shadow radiobutton 152 28 60 10 "Remain Idle" PostRun radiobutton 152 44 60 10 "Restart" radiobutton 152 60 60 10 "Shut Down" endgroup checkbox 10 92 116 12 "Interrupt mailrun if phone rings" RingInterrupt pushbutton 132 93 40 14 "&OK" normal default pushbutton 182 93 40 14 "&Cancel" cancel enddialog endproc