更改 Firemonkey TMemo 组件中选定子字符串后面的背景颜色

Changing the background color behind a selected substring in a Firemonkey TMemo component

我希望以编程方式将焦点设置在 (Delphi 10.3.1) Firemonkey TMemo 组件中的特定子字符串上,方法是在子字符串后面绘制黄色背景。下面的代码在正确位置绘制了一个黄色矩形,但该矩形似乎叠加在文本上,从而隐藏了它。是否有一些 TMemo 属性 可以用来避免这种情况?如果不是,建议的修复方法是什么?

procedure TTextGUIMemo.SetFocusOnHit(HitIndex: integer);
var
  LineIndex: integer;
  GlobalHitInterval: TIntegerArray2;
begin
  FFileCptHitsExpd.FileCptHits.GetHitSubstringGlobal(HitIndex, {=>}LineIndex,
                GlobalHitInterval);
  FMemo.SetFocus;
  FMemo.SelStart:= GlobalHitInterval[0];
  FMemo.SelLength:= GlobalHitInterval[1];
  FMemo.SelectionFill.Color := TAlphaColorRec.Yellow; 
  FMemo.FontColor:= TAlphaColorRec.Black;
  FMemo.Repaint;
end;

提前感谢您的任何建议。

看(XE7)FMX.Memo.pasprocedure TMemo.DoContentPaint()可能会觉得画的顺序错了。另一方面,这可能是故意的,也许我只是不明白为什么。

首先绘制文本,然后选择,最后拼写突出显示。标准选择颜色是F3399FF。注意 alpha 通道 (7F)。这使得它半透明,因此文本显示出来,即使选择颜色绘制在文本上也是如此。

因此,您的问题的解决方案是将颜色定义为部分透明,f.ex。:

FMemo.SelectionFill.Color := FFFFF00; // or perhaps even more transparent FFFFF00

然而,这样做的效果是文本不再是黑色(就像它不是原始选择颜色一样)。

使用 FMX.Memo.pas 文件的副本进行测试,我重新排列了 procedure TMemo.DoContentPaint(),以便标有 // selection 的代码块出现在 // text 块之前。在这种情况下可以使用完全不透明的颜色进行选择。

FMemo.SelectionFill.Color := $FFFFFF00; // alpha = $FF

但切勿修改原始 Delphi 安装目录中的任何文件。在您的项目目录中复制该文件并修改该副本。缺点是使用新的更新版本,您可能需要记住再次复制和修改。