【问题标题】:Using CompareText() and AdvPopupMenu使用 CompareText() 和 AdvPopupMenu
【发布时间】:2020-04-06 08:22:15
【问题描述】:

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

我尝试了两种设置菜单项的方法来尝试删除“&”。

//--#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 Caption 设置为不包含“&”并使 CompareText 工作?

【问题讨论】:

    标签: delphi c++builder


    【解决方案1】:

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

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

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


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

    【讨论】:

    • 我不知道 StripHoykey 功能。这正是我所需要的。您的解决方案有效。谢谢。
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2010-11-14
    相关资源
    最近更新 更多