firemonkey - 更改 Firemonkey TMemo 组件中选定子字符串后面的背景颜色
问题描述
我希望通过在子字符串后面绘制黄色背景,以编程方式将焦点设置在(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()
可能会认为绘制顺序是错误的。另一方面,它可能是故意的,也许我只是不明白为什么。
首先绘制文本,然后是选择,最后是拼写突出显示。标准选择颜色是$7F3399FF
。注意 Alpha 通道 ( 7F
)。这使它半透明,因此文本显示出来,即使选择颜色绘制在文本上。
因此,您的问题的解决方案是将颜色定义为部分透明,例如:
FMemo.SelectionFill.Color := $7FFFFF00; // or perhaps even more transparent $4FFFFF00
然而,这样做的效果是,文本不再是黑色(就像它不是原始选择颜色一样)。
FMX.Memo.pas
使用我重新排列的文件副本进行测试,procedure TMemo.DoContentPaint()
以便标记的代码块// selection
位于该块之前// text
。在这种情况下,可以使用完全不透明的颜色进行选择。
FMemo.SelectionFill.Color := $FFFFFF00; // alpha = $FF
但切勿修改原始 Delphi 安装目录中的任何文件。在您的项目目录中制作该文件的副本并修改该副本。不利的一面是,对于新的更新版本,您可能需要记住再次复制和修改。
推荐阅读
- java - 您如何更新文档中的文档?MongoDB Java
- reactjs - 如何在将道具值传递给另一个组件时避免箭头功能?
- php - 如何从 Codeigniter 3.1.9 的 url 中删除 index.php
- node.js - Node.js 和 amcharts4 - 使用 TypeSript 或 ES6 导入错误“意外令牌导出”
- c++ - 更简洁的方式来声明高维向量
- java - 使用 java cv 时在 android studio 上出现构建错误
- reactjs - 在我的反应原生项目中显示没有互联网连接
- angular - Angular 5:新数据与旧数据合并
- r - 警告:`pkgname` 既不是文件也不是目录,跳过
- php - 使用带有 set_time_limit 和 sleep 的 phpmailer 批量发送电子邮件