如何在Delphi备忘录上进行Unicode装饰

时间:2020-08-22 17:46:40

标签: delphi delphi-10.3-rio

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

我正在尝试提供一些格式化选项,如本网站提供的内容:

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

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

例如,我希望有一个快速按钮将'circle'格式应用于当前TMemo选定的文本:用户选择一个文本,单击此快捷按钮,然后选定的文本将获得'circled'格式。

enter image description here

1 个答案:

答案 0 :(得分:4)

这很容易。如果查看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;

您将获得所需的行为:

Screenshot of a TMemo with letters and digits transformed into their encircled versions.