更改 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.pas
procedure 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 安装目录中的任何文件。在您的项目目录中复制该文件并修改该副本。缺点是使用新的更新版本,您可能需要记住再次复制和修改。
我希望以编程方式将焦点设置在 (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.pas
procedure 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 安装目录中的任何文件。在您的项目目录中复制该文件并修改该副本。缺点是使用新的更新版本,您可能需要记住再次复制和修改。