Contributor: LARS FOSDAL LARS FOSDAL > Hi all. I've got a little Program that brings up a Window and several > buttons in TP 7. The buttons have the names of Various batch Files on them > which are executed when they are pressed. The batch Files start up Various > other Programs. This launchpad requires about 100K of RAM as currently > written, and I'm wondering about ways to reduce this amount significantly. > According to the BP 7 manual resource Files can be used to reduce RAM by 8- > 10%. Right now the Various buttons' Labels and commands are stored in > simple Arrays, which are not the most efficient memory-wise, but I don't > think that making them Records will significantly reduce RAM need. I'd like > to reduce RAM usage an order of magnitude, to about 10K. Any chance of > doing this? There is a dirty way of doing this, and it works With every Dos / command-interpreter that I've tried it under, including Dos 6.0 in a Window under Windows, and 4Dos. The Really nice thing about this way to do it, is that you can even load TSR's etc. since the menu Program is not in memory at all and there is no secondary command interpreter when the user executes his choice. The trick is that you run your Program from a "self-modifying" batchFile. --- MENU.BAT --- :StartAgain SET MENU=C:\Dos\MENU.BAT ; Check this environment Var from your menu-prog GOMENU.EXE ; and abort if it is not set SET MENU= ---------------- Lets say you want to run another batchFile from a menu choice f.x MY.BAT. Let your Program modify the MENU.BAT to: --- :StartAgain SET MENU=C:\Dos\MENU.BAT GOMENU.EXE SET MENU= CALL MY.BAT GOTO StartAgain --- When you want to terminate your menu-loop, simply modify the MENU.BAT back to it's original state. The menu Program can be shared from a network server. There is no limitations at all. You can do Dos commands from the menu Without having to load a second shell. Following my .sig there is a short example Program. It can't be run directly since it Uses some libraries of mine, but you'll get an idea of how to do it. Program HitAndRun; {Menusystem} Uses Dos, Crt, LFsystem, LFCrt, LFinput; { Written by Lars Fosdal May 5th, 1991 Released to the public domain, May 15th, 1993 } Const HitAndRunMsg = 'Written by Lars Fosdal '; Prog = 'HIT&RUN'; Var path : String; {----------------------------------------------------------------------------} Procedure Message(MessageIndex : Integer); begin Writeln(Output); Writeln(Output, Prog, ' - ', HitAndRunMsg); Write(Output, 'Error: '); Case MessageIndex OF -1 : begin Write(Output, Prog, ' must be started from '); Writeln(Output,Path + 'MENU.BAT'); end; end; Write(Output,^G); end; Procedure BuildBatchFile(Execute : String); Var BatchFile : Text; begin Assign(BatchFile, Path + 'MENU.BAT'); ReWrite(BatchFile); Writeln(BatchFile, '@ECHO OFF'); Writeln(BatchFile, 'REM ' + Prog + ' Menu Minder'); Writeln(BatchFile, 'REM ' + HitAndRunMsg); Writeln(BatchFile, ':HitAgain'); Writeln(BatchFile, 'SET H&R=BATCH'); Writeln(BatchFile, path + 'HIT&RUN'); if Execute<>'' then begin Writeln(BatchFile, Execute); Writeln(BatchFile, 'GOTO HitAgain'); end else Writeln(BatchFile, 'SET H&R='); Close(BatchFile); end; Function InitOK : Boolean; Var OK : Boolean; begin path := BeforeLast('\', ParamStr(0)) + '\'; OK := GetEnv('H&R') = 'BATCH'; InitOK := OK; end; Procedure HitAndRunMenu; Var Mnu : aMenu; win : aWindow; begin wDef(Win, 70, 1, 80, 25, 1, Col(Blue, LightGray), Col(Blue, White)); ItemSeparator:= '`'; mBarDefault := Red * 16 + Yellow; mNew(Mnu, 'Pick an item to run', 'Quit Menu`COMMAND`DIR /P`D:\BIN\NI' + '`D:\BIN\MAPMEM`D:\BIN\X3\XTG' + '`D:\BIN\LIST C:\Dos\MENY.BAT'); Menu(Win, Mnu); Case Mnu.Entry OF 1 : BuildBatchFile(''); else BuildBatchFile(Mnu.Items[Mnu.Entry]^); end; end;{HitAndRunMenu} begin if InitOK then HitAndRunMenu else begin Message(-1); BuildBatchFile(''); end; Writeln(OutPut); end.