{
Menus in TV are instances of class tMenuBar, accessed via Pointer Type
pMenuBar. A Complete menu is a Single-linked list, terminated With a NIL
Pointer. Each item or node is just a Record that holds inFormation on
what the node displays and responds to, and a Pointer to the next menu
node in the list.

I've written out a short bit of TV menu code that you can Compile and
play With, and then you can highlight parts that you don't understand
when you send back your reply.
}

Program TestMenu;

Uses
  Objects, Drivers, Views, Menus, App;

Const
  cmOpen  = 100;  (* Command message Constants *)
  cmClose = 101;

Type
  pTestApp = ^tTestApp;
  tTestApp = Object(tApplication)
    Procedure InitMenuBar; Virtual;    (* Do-nothing inherited method *)
  end;                                 (* which you override          *)

(* Set up the menu by filling in the inherited method *)
Procedure tTestApp.InitMenuBar;
Var
  vRect : tRect;

begin
  GetExtent(vRect);
  vRect.B.Y := vRect.A.Y + 1;
  MenuBar := New(pMenuBar, Init(vRect, NewMenu(
    NewSubMenu('~F~ile', hcNoConText, NewMenu(
      NewItem('~O~pen', 'Alt-O', kbAltO, cmOpen, hcNoConText,
      NewItem('~C~lose', 'Alt-C', kbAltC, cmClose, hcNoConText,
      NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoConText,
      NIL)))),
    NewSubMenu('~E~dit', hcNoConText, NewMenu(
      NewItem('C~u~t', 'Alt-U', kbAltU, cmCut, hcNoConText,
      NewItem('Cop~y~', 'Alt-Y', kbAltY, cmCopy, hcNoConText,
      NewItem('~P~aste', 'Alt-P', kbAltP, cmPaste, hcNoConText,
      NewItem('C~l~ear', 'Alt-L', kbAltL, cmClear, hcNoConText,
      NIL))))),
    NewSubMenu('~W~indow', hcNoConText, NewMenu(
        NewItem('Ca~s~cade', 'Alt-S', kbAltS, cmCascade, hcNoConText,
      NewItem('~T~ile', 'Alt-T', kbAltT, cmTile, hcNoConText,
      NIL))),
    NIL))))
  ))
end;

Var
  vApp : pTestApp;

begin
  New(vApp, Init);
  if vApp = NIL then
    begin
      WriteLn('Couldn''t instantiate the application');
      Exit;
    end;
  vApp^.Run;
  vApp^.Done;
end.
