0

我有一个旧的视觉序言项目,我必须在运行时更改菜单的文本。
这是我为更改文本所做的:

menu_setText(Win, id_menu, NewMenuText)

这很好用,但是,当我想启用/禁用此菜单时,以下内容不起作用(意味着菜单项不会更改其状态):

menu_Enable(Win, id_menu, b_true)

经过一番搜索,我发现:

在 MS-Windows 下,资源标识符不能引用子菜单。如果子菜单的菜单条目需要启用、禁用、检查或更改文本。有必要使用menu_Enablemenu_Checkmenu_SetText谓词的特殊版本,它们指定菜单条目的文本而不是常量。
menu_Enable(WinHandle, String, BOOLEAN)
menu_Check(WinHandle, String, BOOLEAN)
menu_SetText(WinHandle, String, NewString)

奇怪的是,在我的情况下,与需要文本本身menu_setText的常量一起工作得很好。menu_Enable(是的,我menu_Enable使用菜单项的初始文本进行了测试,但是当文本更改时,一切都会中断)

我的问题来了:

当我知道菜单的 ID 但不知道其名称时,如何启用/禁用菜单?
如果不可能直接,当我知道菜单的 ID 时,如何获取菜单的当前名称?

万一这有帮助,这个项目是用 VIP52 打开和编译的(从 2001 年开始)。

4

1 回答 1

0

我终于找到了解决我的问题的解决方法,但我仍然不是很满意,所以如果有人提出更好的答案,我会接受!

我宣布:

txt_menu(menu_tag,string)

然后调用:

txt_menu(id_menu, MenuText),
menu_setText(Win, MenuText, NewText),
retractAll(txt_menu(id_menu,_)),
assert(txt_menu(id_menu,NewText)),
menu_Update(Win)

每当我必须更改菜单项的文本时,这可以很容易地转换为menu_setTextById谓词,如下所示:

menu_setTextById(Win, MenuId, NewText):-
    txt_menu(MenuId, MenuText),
    menu_setText(Win, MenuText, NewText),
    retractAll(txt_menu(MenuId,_)),
    assert(txt_menu(MenuId, NewText)),
    menu_Update(Win).

用法:

menu_setTextById(Win, id_menu, "My new text menu").

请注意,如果我需要有几个带有菜单的窗口,我将不得不将 Window Id 添加到我的txt_menu子句中。


这个解决方法的主要问题是我不能&在新的文本菜单中使用,因为如果我的菜单有“&Menu”作为文本(这意味着M它将被加下划线),那么尝试使用menu_setText(Win,"&Menu","New Menu")将会中断,因为“&Menu”没有找到。

因此,在尝试在此类谓词中使用它之前,我需要从字符串中删除任何&符号。

于 2018-02-14T09:30:21.827 回答