使用 CompareText() 和 AdvPopupMenu

Using CompareText() and AdvPopupMenu

我将 C++Builder 10.3 与 Windows 的 VCL 应用程序一起使用。我试图通过遍历项目标题并使用 CompareText() 将标题与我的搜索文本进行比较来识别 AdvPopupMenu 中的特定项目。字幕在字幕文本中有一个“&”,我认为这是 ShortCut 功能的一部分。这似乎在比较文本时阻止了匹配。

我已经尝试通过两种方式设置菜单项来尝试删除“&”。

//--#1 Menu Setup-- 
TMenuItem *NewMenuItem;
NewMenuItem = new TMenuItem(MainForm->AdvPopupMenu1);
TShortCut sc2;
sc2 = TextToShortCut("(None)");
NewMenuItem->Caption = "Google";
NewMenuItem->ShortCut = sc2;


//--#2 Menu Setup-- 
TMenuItem *NewMenuItem;
NewMenuItem = new TMenuItem(MainForm->AdvPopupMenu1);
NewMenuItem->Caption = "Google";
NewMenuItem->ShortCut = NULL; 

下面是我搜索 AdvPopupMenu 项的循环。

UnicodeString SearchFor = "Google";  
UnicodeString TestCaption;

for(int i=0; i<MainForm->AdvPopupMenu1->Items->Count; i++){
  TestCaption= MainForm->AdvPopupMenu1->Items->Items[i]->Caption;

  if(CompareText(SearchFor , TestCaption)==0 ){
    //This CompareText always fails
    //TestCaption looks like this "&Google" or this "G&oogle"
  }
}

如何设置 AdvPopupMenu 标题不包含“&”并使 CompareText 工作?

&很重要。没有这些,像我这样的键盘用户会发现您的应用程序更难使用。

我认为最好的解决方案是在将标题传递给 CompareText 之前,使用 Vcl.Menus 单元中的 StripHotkey 函数删除与符号字符。 (另外,与其测试if CompareText returns 0,不如使用SameText函数。)

也就是说,不要尝试创建没有“&”字符的菜单项,也不要尝试将其从菜单项中删除。仅从传递给比较函数的字符串中删除字符。


另请注意,与号字符与 ShortCut 属性 无关。 & 字符使菜单项标题中的下一个字符带有下划线,告诉用户他或她可以按下该键来激活菜单项,但仅限于菜单打开时。另一方面,ShortCut 属性 向菜单项添加 right-aligned 文本,如 Ctrl+AShift+Ctrl+NF2,这些快捷方式即使菜单未打开也可用。因此,这些是不同的功能。