【问题标题】:How to do Unicode decoration on a Delphi memo如何在 Delphi 备忘录上进行 Unicode 装饰
【发布时间】:2020-08-22 17:46:40
【问题描述】:

我有一个小的 Delphi 10.3.3 应用程序,它具有一些文本编辑功能,使用用户键入文本的 TMemo。

我正在尝试包含一些格式选项,正如本网站提供的那样:

http://qaz.wtf/u/convert.cgi?text=How%20do%20it%20on%20Delphi

当我从上面的网站复制“带圆圈”的文本并粘贴到我的备忘录上时,它可以工作,显示为“带圆圈”。但我想让我的用户能够在我的应用程序中应用格式。

例如,我想要一个快速按钮来将“圆圈”格式应用到当前 TMemo 选定的文本:用户选择一个文本,单击此快速按钮,然后选定的文本将获得“圆圈”格式。

【问题讨论】:

  • VCL 备忘录不支持格式化。您需要一个 RTF 编辑控件。
  • @DavidHeffernan 怎么能不支持,如果我从上面的站点粘贴格式化文本时,它会显示在备忘录上?
  • @David:你知道这与格式无关吗?这就是用另一个字符替换一个字符。
  • 显然我误解了你想要做什么。
  • @DavidHeffernan 不用担心,无论如何感谢您的帮助。

标签: delphi delphi-10.3-rio


【解决方案1】:

这很容易。如果您查看 enclosed alphanumerics 的 Unicode 图表,您会发现以下映射是有效的:

function EncircleChr(AChr: Char): Char;
begin
  case AChr of
    '0':
      Result := Chr($24EA);
    '1'..'9':
      Result := Chr($2460 + Ord(AChr) - Ord('1'));
    'a'..'z':
      Result := Chr($24D0 + Ord(AChr) - Ord('a'));
    'A'..'Z':
      Result := Chr($24B6 + Ord(AChr) - Ord('A'));
  else
    Result := AChr;
  end;
end;

因此,与

function Encircle(const S: string): string;
var
  i: Integer;
begin
  SetLength(Result, S.Length);
  for i := 1 to S.Length do
    Result[i] := EncircleChr(S[i]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.SelText := Encircle(Memo1.SelText);
end;

你会得到想要的行为:

【讨论】:

  • @delphirules:太好了!当然,你也可以对其他类型的装饰品做同样的事情。
  • 当然可以!再次感谢,周末愉快!
  • 我正在尝试对另一种装饰采用相同的方法,但不知何故它不起作用。例如,我正在尝试应用负圆并在此处获取代码:compart.com/en/unicode/search?q=negative#characters。它适用于 4 位代码(如 $278A),但不适用于 5 位代码(如 $1F150);在这种情况下会出现疯狂的字符。你知道为什么吗 ? :) 我
  • @delphirules:Delphi 的字符类型是两个字节宽(=四个十六进制数字),所以它只支持BMP。就个人而言,我尽量避免使用 BMP 之外的字符,因为它们不太容易使用。此外,无论如何,很少有字体具有 BMP 之外的字符的字形...
  • @delphirules:超出 BMP 的字符表示为两个 Delphi 字符(代理对)。因此,您需要一个 Delphi 字符串来表示这样的字符。你得到这样一个字符串,例如Char.ConvertFromUtf32($1F17F).
猜你喜欢
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多