如何转义加速器字符?

How to escape the accelerator characters?

我正在将一些字符串设置为 TLabel 控件的 Caption 属性 的值。

我从外部接收这些值,有时它们包含 '&' 键,该键被解释为快捷键。

例如:

var
  NewCaption : string;
begin
  NewCaption := 'B&B';
  MyLabel.Caption := MyNewCaption;
end;

在运行时,显示为'BB',第二个字母加下划线:

我想改为显示 'B&B'


我知道 Vcl.Menus.StripHotkey 删除加速字符标记的功能...

function StripHotkey(const Text: string): string;
var
  I: Integer;
begin
  Result := Text;
  I := 1;
  while I <= Length(Result) do
  begin
{$IF NOT DEFINED(CLR)}
    if IsLeadChar(Result[I]) then
      Inc(I)
    else
{$ENDIF}
    if Result[I] = cHotkeyPrefix then
      if SysLocale.FarEast and
        ((I > 1) and (Length(Result)-I >= 2) and
         (Result[I-1] = '(') and (Result[I+2] = ')')) then
        Delete(Result, I-1, 4)
      else
        Delete(Result, I, 1);
    Inc(I);
  end;
end;

...但我不知道转义加速器字符的任何特定函数,以便它在 Caption 中显示为原始字符串 ('B&B').

我找到的唯一方法是简单地将 '&' 字符加倍,但没有找到用于此目的的任何特定函数:

uses
  System.SysUtils, Vcl.Menus;

...

var
  NewCaption : string;
begin
  NewCaption := 'B&B';
  MyLabel.Caption := StringReplace(MyNewCaption, cHotkeyPrefix, cHotkeyPrefix + cHotkeyPrefix, [rfReplaceAll]);
end;

想知道有没有更好的方案

为了不在 TLabel 上显示加速器字符,您只需将其 ShowAccelChar 属性 设置为 False

编辑:TStaticText 组件也是如此。