我正在将C ++ Builder 10.3和用于Windows的VCL应用程序一起使用。我试图通过遍历Items Caption并使用CompareText()将Caption与我的搜索文本进行比较来识别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工作?
&
很重要。没有这些,像我这样的键盘用户将发现您的应用程序更难以使用。
[我认为您最好的解决方案是在将标题传递给StripHotkey
之前,使用Vcl.Menus
单元中的CompareText
函数删除与号字符。 (此外,最好不要使用CompareText
函数来测试0
是否返回SameText
。)
也就是说,请勿尝试创建没有&符号的菜单项,也不要尝试将其从菜单项中删除。仅从传递给比较函数的字符串中删除字符。
还请注意,与号字符与ShortCut
属性无关。 “&”字符使菜单项标题中的下一个字符带有下划线,告诉用户可以按该键激活菜单项,但仅当菜单打开时。另一方面,ShortCut
属性在菜单项中添加了一个右对齐的文本,例如Ctrl+A
或Shift+Ctrl+N
或F2
,即使菜单未打开,这些快捷方式仍然可用。因此,这些是不同的功能。