Page 1 of 1

MenuOptions

PostPosted: Wed Oct 20, 2010 2:00 pm
by Mark F. Madura
Code: Select all{
DCAL  for Delphi program MenuOptions
}

library MenuOptions;

uses
  UConstants in '..\Header Files\UConstants.pas',
  UInterfaces in '..\Header Files\UInterfaces.pas',
  UInterfacesRecords in '..\Header Files\UInterfacesRecords.pas',
  URecords in '..\Header Files\URecords.pas',
  UVariables in '..\Header Files\UVariables.pas';

{$E dmx}  //dmx is the extension for DCAL Dll's

//The values stored in the records you define here will be rememberd
//between dispatcher calls because they are pushed onto the command stack
type
  MenuOptL = record
    state: asint;
    case byte of
      0: (getp: getpointArg);
  end;
  PMenuOptL = ^MenuOptL;

//Main Function (Re-entrant State Machine)
function MenuOptions_Main(act : action; pl, pargs : Pointer) : wantType;
//The values stored in variables you define here will not be retained
//between dispatcher calls because they are not pushed onto the stack
var
   retval : asint;
   l : PMenuOptL;
begin
   l := PMenuOptL(pl);

   {Section 3: Aagain - Return to menus and wait for input}
   if act = aagain then begin  { Re-entrant section }
      case l.state of { Case }
         1 :
         begin { 1: Main Menu }
            //If a key was pressed or a menu button was selected...
            if l.getp.Result = res_escape then begin
               case l.getp.key of
                  f1 : l.state := 1;  { Option 1.0 }
                  f2 : l.state := 1;  { Option 2.0 }
                  f3 : l.state := 1;  { Option 3.0 }

                  s9 : l.state := 2;  { Options 1 Sub-menu }

                  s0 : l.state := 0;  { Exit - Macro }
               end;  { Which key was pressed? }
            end;  { Was a key pressed or menu selected? }
         end; { 1: Main Menu }
         2 :
         begin { 2: Options 1 Menu }
            //If a key was pressed or a menu button was selected...
            if l.getp.Result = res_escape then begin
               case l.getp.key of
                  f1 : l.state := 2;  { Option 1.1 }
                  f2 : l.state := 2;  { Option 2.1}
                  f3 : l.state := 2;  { Option 3.1 }

                  s9 : l.state := 3;  { Options 2 Sub-menu }

                  s0 : l.state := 1;  { Exit - To previous menu }
               end;  { Which key was pressed }
            end;  { Was a key pressed or menu selected? }
         end; { 2: Options 1 Menu }
         3 :
         begin { 3: Options 2 Menu }
            //If a key was pressed or a menu button was selected...
            if l.getp.Result = res_escape then begin
               case l.getp.key of
                  f1 : l.state := 3;  { Option 1.2 }
                  f2 : l.state := 3;  { Option 2.2 }
                  f3 : l.state := 3;  { Option 3.2 }

                  s9 : l.state := 4;  { Options 3 }

                  s0 : l.state := 2;  { Exit - To previous menu }
               end;  { Which key was pressed }
            end;  { Was a key pressed or menu selected? }
         end; { 3: Options 2 Menu }
         4 :
         begin { 4: Options 3 Menu }
            //If a key was pressed or a menu button was selected...
            if l.getp.Result = res_escape then begin
               case l.getp.key of
                  f1 : l.state := 4;  { Option 1.3 }
                  f2 : l.state := 4;  { Option 2.3 }
                  f3 : l.state := 4;  { Option 3.3 }

                  s0 : l.state := 3;  { Exit - To previous menu }
               end;  { Which key was pressed }
            end;  { Was a key pressed or menu selected? }
         end; { 4: Options 3 Menu }
      else
         l.state := 0;
      end; { Case }
   end;  { Re-entrant Section }

    {Section 2: Afirst - Tasks to perform only once}
    if act = Afirst then begin  //Initialize local state and other variables
      wrterr('Hello World Macro - Version 1.0');
      l.state := 1;
    end

    {Section 4: Alast - If your macro has been interrupted by user action}
    else if act = Alast then begin
      //If you're going to get blown off the stack...
      //(i.e.) the user pressed a hotkey,
      //then this is your last chance to clean up temporary data.
    end

    {Section 1: AlSize - Allocate memory on stack for local variables}
    else if act = AlSize then begin
      SetLocalSize(sizeof(l^));
    end;

    if act <> alsize then begin  { Action section }
      case l.state of
        1 :
        begin  { 1: Main Menu }
          wrtlvl('MenuOptions');  //Set Menu Title
          lblsinit;
          lblset(1, 'Option 1.0', 'Set option one values');
          lblset(2, 'Option 2.0', 'Set option two values');
          lblset(3, 'Option 3.0', 'Set option three values');

          lblset(19, 'Options 1', 'Options Two Menu');
          lblson1;
          getpoint(l.getp, retval);
        end;  { 1: Main Menu }
        2:
        begin  { 2: Options 1 Sub-menu }
          wrtlvl('Options 1');  //Set Menu Title
          lblsinit;
          lblset(1, 'Option 1.1', 'Set option one values');
          lblset(2, 'Option 2.1', 'Set option two values');
          lblset(3, 'Option 3.1', 'Set option three values');

          lblset(19, 'Options 2', 'Options Two Menu');
          lblson1;
          getpoint(l.getp, retval);
        end;  { 2: Options 1 Sub-menu }
        3:
        begin  { 3: Options 2 Sub-menu }
          wrtlvl('Options 2');  //Set Menu Title
          lblsinit;
          lblset(1, 'Option 1.2', 'Set option one values');
          lblset(2, 'Option 2.2', 'Set option two values');
          lblset(3, 'Option 3.2', 'Set option three values');

          lblset(19, 'Options 3', 'Options Two Menu');
          lblson1;
          getpoint(l.getp, retval);
        end;  { 3: Options 2 Sub-menu }
        4:
        begin  { 4: Options 3 Sub-menu }
          wrtlvl('Options 3');  //Set Menu Title
          lblsinit;
          lblset(1, 'Option 1.3', 'Set option one values');
          lblset(2, 'Option 2.3', 'Set option two values');
          lblset(3, 'Option 3.3', 'Set option three values');

          lblson1;
          getpoint(l.getp, retval);
        end;  { 4: Options 3 Sub-menu }
      else
        retval := XDone; //Don't go back to Aagain
      end; { Case }
    end; { Action section }
    Result := retval;
end; { MenuOptions_main }

function Main(dcalstate : asint; act : action; pl, pargs : Pointer) : wantType; stdcall;
begin
   case dcalstate of
      XDcalStateBegin : Result := MenuOptions_main(act, pl, pargs);
         else
            Result := XDone;{Necessary}
   end;
end;
//End of Main Function (Re-entrant State Machine)

exports
   Main;{This is the entry function that will be called by DataCAD.
         All DCAL Dlls will have this function.}

begin

end.

PostPosted: Wed Oct 20, 2010 5:44 pm
by rod_walker
My major stumbling block has been solved.
Thank you Mark.

Rod Walker