Плагин menu.spf [27/08/2015 10:48]

Обсуждение программ nnCron и nnCron LITE

Плагин menu.spf [27/08/2015 10:48]

Postby VoidVolker » Sun, 23 Aug 2015, 20:47

Позволяет создавать любые меню.

Скачать menu.spf

Внутри определения механика работы меню следующая: по сути это обычное слово, везде режим компиляции, между определениями может быть скомпилирован любой код, при этом код в определениях пунктов меню будет выполнен только при клике/вызове соответствующего пункта меню. По сути каждый пункт - это еще одно слово(безымянное) внутри основного определения. SubMenu - отмечает начало и конец подменю, код перед ним и после него будет скомпилирован одинаково и само слово стекового эффекта не имеет. Весь код, скомпилированный между пунктами меню будет выполнен в момент вызова меню словами MenuShow и MenuShowAtCursor.
Коду в самом меню и в пунктах меню разрешается работать со стеком во время выполнения, а так же возвращать какие-то данные на стек — главное, чтобы это делали все пункты меню, в т.ч. блок обработки отмены меню, а после запуска меню можно будет обрабатывать эти данные.
После выполнения всего кода меню на стеке остается хэндл меню и он тут же отправляется WINAPI для создания меню. После того, как меню завершает работу — анализируется идентификатор пункта меню (для упрощения логики идентификатором каждого пункта меню является исполнимый токен соответствующего участка кода) и выполняется код этого пункта меню. Ну это так, если вдруг кому интересно :)

Так же позволяет блокировать пункты меню/подменю, добавлять туда галочки и даже добавлять новый столбец. Т.е. можно сделать все меню в одну строку и несколько столбцов, или вообще в любое количество строк и столбцов.
Разница между ItemCol SubCol и ItemBreak SubBreak в наличии вертикальной черты в первом варианте.

Пример:
Code: Select all
<%
Menu: MyMenu1 \ Горизонтальное меню. Для вертикального - просто не надо использовать ItemCol и SubCol

    Item: "Item 1"
        ." Item 1 run" CR
    ;Item

    \ Делаем следующий пункт меню справа:
    ItemCol
    \ И добавлем ему галочку:
    ItemCheck
    Item: "Item 2"
        ." Item 2 run" CR
    ;Item


    SubMenu(

        Item: "Item 3"
            ." Item 3 run" CR
        ;Item

        \ Добавляем разделитель - горизонтальную черту
        ----

        Item: "Item 4"
            ." Item 4 run" CR
        ;Item

    \ Так же смещаем и подменю вправо:
    SubCol )SubMenu: "Submenu"

    Cancel
        ." Ничего не было выбрано" CR
    ;Cancel

;Menu

Menu: MyMenu2

    FT-CUR FT>DD.MM.YYYY/hh:mm:ss Item
          S" rundll32 shell32,Control_RunDLL timedate.cpl" START-APP
    ;Item

    S" COMSPEC" ENV Item
        S" COMSPEC" ENV START-APP
    ;Item

;Menu

%>

#( Show_my_menu
\ NoActive
SingleInstance
WatchHotKey: "{F3}"
Action:
MyMenu1 MenuShowAtCursor
)#

#( Show_my_menu
\ NoActive
SingleInstance
WatchHotKey: "{F4}"
Action:
MyMenu1 MenuShow
)#

#( Show_my_menu
\ NoActive
SingleInstance
WatchHotKey: "{F5}"
Action:
100 100 MyMenu1 MenuXY!
MyMenu1 MenuShow
)#


Не обязательно за пределами задачи - можно и в разделе до Action:. А вот после Action определять меню уже нельзя - т.к. режим компиляции там.

Вариант два, название меню берется из строки со стека:
Code: Select all
Menu: MyMenu
    \ Тут можно разместить любой код - он будет выполнен в момент вызова меню
    S" Item 1" Item
        \ А это код данного пункта меню - он будет вызван при клике по пункту
        ." Item 1 run" CR
    ;Item

    S" Item 2" Item
        ." Item 2 run" CR
    ;Item

    ----

    SubMenu(    \ Только отмечает начало подменю

        S" Item 3" Item
            ." Item 3 run" CR
        ;Item

        S" Item 4" Item
            ." Item 4 run" CR
        ;Item

    S" Submenu" )SubMenu   \ А это слово отмечает конец подменю и забирает со стека название пункта меню

    S" Submenu 2" SubMenu(   \ Собственно, для наглядности можно и так сделать - но тогда будет не понятно, что строка будет лежать на стеке и заберется только закрывающим словом )SubMenu

        S" Item 5" Item
            ." Item 5 run" CR
        ;Item

        S" Item 6" Item
            ." Item 6 run" CR
        ;Item

    )SubMenu

;Menu
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин menu.spf [23/08/2015 20:35]

Postby dothen » Mon, 24 Aug 2015, 14:58

Отлично!

Жаль что названия пунктов меню нельзя формировать налету.
Code: Select all
Menu: MyMenu

    Item: FT-CUR FT>DD.MM.YYYY/hh:mm:ss
          S" rundll32 shell32,Control_RunDLL timedate.cpl" START-APP
    ;Item

    Item: " %COMSPEC%"
          " %COMSPEC%" START-APP
    ;Item
;Menu
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Плагин menu.spf [24/08/2015 16:32]

Postby VoidVolker » Mon, 24 Aug 2015, 16:58

Ап! Добавлены слова Item и )SubMenu, которые берут название пунктов со стека.

Code: Select all
Menu: MyMenu2

    FT-CUR FT>DD.MM.YYYY/hh:mm:ss Item
          S" rundll32 shell32,Control_RunDLL timedate.cpl" START-APP
    ;Item

    S" COMSPEC" ENV Item
        S" COMSPEC" ENV START-APP
    ;Item
   
;Menu

Image
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин menu.spf [24/08/2015 16:32]

Postby dothen » Mon, 24 Aug 2015, 18:32

Вот, спасибо.

Ещё вопрос.
Как узнать после закрытия меню, что ни один пункт не выбран.
Может стоит добавить флаг выбран\не выбран.

Например для такого меню.
Code: Select all
<%

Menu: MyMenu

    Item: Item 1
        100
    ;Item

    Item: Item 2
        200
    ;Item

;Menu

%>

#( Show_my_menu
\ NoActive
SingleInstance
WatchHotKey: "{F3}"
Action:
MyMenu MenuShowAtCursor
N>S MsgBox
)#
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Плагин menu.spf [24/08/2015 19:28]

Postby VoidVolker » Mon, 24 Aug 2015, 19:34

Ап! Добавлен блок кода для случая, если ни один из элементов не был выбран:
Code: Select all
Menu MyMenu

    Cancel
        ." Ничего не было выбрано" CR
    ;Cancel
   
;Menu
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин menu.spf [24/08/2015 19:28]

Postby VoidVolker » Mon, 24 Aug 2015, 23:00

Ап! Мелкое исправление.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин menu.spf [24/08/2015 19:28]

Postby dothen » Tue, 25 Aug 2015, 09:37

Вот меню в котором используется флаг выбран/не выбран.
Code: Select all
<%

VARIABLE flagitem

Menu: MyMenu0
    TRUE flagitem !

    Item: 2 x 2 =
          MyMenu0 MenuShow \ Вызываем это же меню
          FALSE flagitem ! \ и что?... флаг то глобальный
    ;Item
    ----
    Item: 2
          2
    ;Item
    ----
    Item: 4
          4
          S" Это правильный ответ!" MsgBox
    ;Item
    ----
    Item: 5
          QUERY: "Вы уверены?" 0=
          IF
          MyMenu0 MenuShow \ Вызываем это же меню
          FALSE flagitem !
          ELSE 5
          THEN
    ;Item
    ----
    Item: 22
          22
    ;Item

    Cancel
        FALSE flagitem !
    ;Cancel

;Menu

%>

#( Show_my_menu1
\ NoActive
SingleInstance
WatchHotKey: "{F11}"
Action:
MyMenu0 MenuShowAtCursor
flagitem @
IF
N>S MsgBox
THEN
)#

Такой флаг очень не удобный для меню, и его не всегда можно использовать.

Предлагаю добавить парочку слов.

Например:

Добавить слово Item* - Пункт при нажатии на который меню не закрывается,
а код в пункте, если он(код) есть выполняется.

Изменить слово ;Item - изменяет внутренний флаг(которого сейчас нет) выбран/невыбран.

Добавить слово ;Item* - не изменяет внутренний флаг меню выбран/невыбран.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Плагин menu.spf [24/08/2015 19:28]

Postby VoidVolker » Tue, 25 Aug 2015, 10:56

dothen wrote:Добавить слово Item* - Пункт при нажатии на который меню не закрывается,а код в пункте, если он(код) есть выполняется.

Меню отрисовывается и полностью контролируется WINAPI - так что изменить поведение нельзя. Можно конечно попробовать расковырять меню и посмотреть документацию на используемые вызовы - возможно есть какие-то дополнительные опции.
dothen wrote:Изменить слово ;Item - изменяет внутренний флаг(которого сейчас нет) выбран/невыбран.
Добавить слово ;Item* - не изменяет внутренний флаг меню выбран/невыбран.

Зачем эти флаги-то? Можно же просто оставить значение на стеке (можно оставить все что угодно в любом количестве):
Code: Select all
Menu: MyMenu
    Item: Item 1
          1
    ;Item
   
    Item: Item 2
          2
    ;Item
   
    Item: Item 3
          3
    ;Item

    Cancel
        0
    ;Cancel

;Menu

Code: Select all
MyMenu MenuShowAtCursor . CR

И никакие глобальные флаги не нужны. Смысл всего этого плагина как раз в том, чтобы никаких глобальных флагов не использовать - а сразу писать код для каждого пункта и не думать о флагах.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин menu.spf [24/08/2015 19:28]

Postby dothen » Tue, 25 Aug 2015, 13:36

VoidVolker wrote:Меню отрисовывается и полностью контролируется WINAPI - так что изменить поведение нельзя. Можно конечно попробовать расковырять меню и посмотреть документацию на используемые вызовы - возможно есть какие-то дополнительные опции.


Возможно что есть, ведь при нажатии на заголовок подменю, реакции нет.

VoidVolker wrote:И никакие глобальные флаги не нужны. Смысл всего этого плагина как раз в том, чтобы никаких глобальных флагов не использовать - а сразу писать код для каждого пункта и не думать о флагах.


Понятно. Значит только два варианта:
1) Все пункты меню оставляют значение на стеке.
2) Все пункты меню не оставляют значение на стеке.
Code: Select all
Menu: MyMenu
    Item: Item 1
          1
    ;Item
   
    Item: Item 2
          2
    ;Item
   
    Item: Item 3
          S" notepad.exe" START-APP
          0
    ;Item

    Item: Item 4
          S" clipbrd.exe" START-APP
          0
    ;Item

    Cancel
        0
    ;Cancel

;Menu
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Плагин menu.spf [24/08/2015 19:28]

Postby VoidVolker » Tue, 25 Aug 2015, 14:55

dothen wrote:Возможно что есть, ведь при нажатии на заголовок подменю, реакции нет.

Как раз таки есть реакция - отображение подменю. Посмотрел ман по апи - там можно заблокировать пункт меню, поставить галочку или использовать картинку в качестве элемента меню.
dothen wrote:1) Все пункты меню оставляют значение на стеке.
2) Все пункты меню не оставляют значение на стеке.

Да, именно так. Либо, если надо в каких-то случаях оставлять разное количество параметров на стеке, то можно просто проверять глубину стека словом DEPTH до и после меню.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин menu.spf [24/08/2015 19:28]

Postby dothen » Wed, 26 Aug 2015, 21:45

Запись в одну строку.

Так можно.
Code: Select all
    S" Item 1" Item S" notepad.exe" START-APP ;Item
    S" Item 2" Item S" clipbrd.exe" START-APP ;Item

А так нельзя. Но хочется :)
Code: Select all
    Item: Item 1 S" notepad.exe" START-APP ;Item
    Item: Item 2 S" clipbrd.exe" START-APP ;Item

Да, ещё в плагине слово Item без стекового комментария.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Плагин menu.spf [24/08/2015 19:28]

Postby VoidVolker » Thu, 27 Aug 2015, 09:25

dothen wrote:А так нельзя. Но хочется

А дело в том, что там идет парсинг до конца строки - чтобы можно использовать любые символы.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин menu.spf [27/08/2015 10:15]

Postby VoidVolker » Thu, 27 Aug 2015, 10:30

Ап! Добавлены новые опции для пунктов меню и подменю:
Code: Select all
ItemGrey ItemDisable ItemCheck ItemCol ItemBreak
SubGrey SubDisable SubCheck SubCol SubBreak

Теперь меню можно делать в любое количество столбцов - т.е. оно теперь может быть горизонтальным и с любым количеством строк.
А так же изменен парсинг названия элемента/подменю: теперь это должна быть либо строка в кавычках, либо строка без кавычек и без пробелов. Т.е., если в названии нет пробелов - то кавычки не обязательны. Как и во всех аналогичных словах в ннкроне, которые парсят строку. Это позволяет писать все в одну строку.
Разница между ItemCol SubCol и ItemBreak SubBreak в наличии вертикальной черты в первом варианте.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин menu.spf [27/08/2015 10:48]

Postby Morituruz » Thu, 27 Aug 2015, 23:02

Похоже, мою менюшку можно выкидывать. Где ж вы раньше были :-)
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин menu.spf [27/08/2015 10:48]

Postby VoidVolker » Fri, 28 Aug 2015, 00:01

Эмм... Да тут и был ) В мануале же есть пример - а тут просто красивая обертка. Ну и пару интересных хаков добавил )
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests