Вот полноценный пример создания своего контекстного меню.

## Код:
```
MODULE TestViews;

   IMPORT
      Log := StdLog,
      Dialog,
      Properties, Controllers, Views, Ports, HostPorts, HostMenus;

   TYPE View = POINTER TO RECORD (Views.View) END;

   PROCEDURE (v: View)  Restore (f: Views.Frame; l, t, r, b: INTEGER);
   BEGIN
      f.DrawRect(l, t, r, b, Ports.fill, Ports.red)
   END Restore;

   PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message);
   BEGIN
      WITH msg: Properties.FocusPref DO
         msg.setFocus := TRUE
      ELSE
      END
   END HandlePropMsg;

   PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View);
      VAR res: INTEGER;
   BEGIN
      WITH msg: Controllers.PollOpsMsg DO
         msg.type := 'TestViews'
      | msg: Controllers.TrackMsg DO
         IF HostPorts.right IN msg.modifiers THEN
            (* после вызова контекстного меню не должно быть никакого трекинга, иначе клик по пункту меню попадёт в обработку TrackMsg *)
            HostMenus.PopupMenu
         ELSE
            Log.String('нажал ЛКМ'); Log.Ln;
         END
      ELSE
      END
   END HandleCtrlMsg;

   PROCEDURE Deposit*;
      VAR v: View;
   BEGIN
      NEW(v); Views.Deposit(v)
   END Deposit;
   
END TestViews.

 ^TestViews.Deposit; StdCmds.Open"
```


Кроме этого, надо в ресурсном файле Menus.odc задать соответствующие строчки:

MENU "*" ("TestViews")
"Вывод в лог"	""	"StdLog.String('TestViews.View пункт контекстного меню');StdLog.Ln"	""
END


Но написал я сюда не поэтомуГенерировать контекстное меню куда интереснее, чем задавать его напрямую в Menus. Но - не получается. Пытаюсь сделать так:

## Код:
```
PROCEDURE InitContextMenu;
      VAR item: HostMenus.Menu;
      PROCEDURE Valid(i: HostMenus.Menu): BOOLEAN;
      BEGIN
         RETURN (i.menu = '*') & (i.type = 'MyView')
      END Valid;
   BEGIN
      item := HostMenus.FirstMenu();
      (* найти меню с именем '*' и типом 'MyView' *)
      WHILE (item # NIL) & ~Valid(item) DO item := item.next END;
      IF (item # NIL) & Valid(item) THEN
         StdDialog.AddItem(item.firstItem, '111', '222', '', '');
      END
   END InitContextMenu;
```


Оно вроде бы подменяет первый пункт в контекстном меню, но визуально изменений никаких. Что-нибудь кто-нибудь знает про это?