使用 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+A
或 Shift+Ctrl+N
或 F2
,这些快捷方式即使菜单未打开也可用。因此,这些是不同的功能。
我将 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+A
或 Shift+Ctrl+N
或 F2
,这些快捷方式即使菜单未打开也可用。因此,这些是不同的功能。