【问题标题】:Changing the background color behind a selected substring in a Firemonkey TMemo component更改 Firemonkey TMemo 组件中选定子字符串后面的背景颜色
【发布时间】:2019-11-08 15:00:12
【问题描述】:

我希望通过在子字符串后面绘制黄色背景,以编程方式将焦点设置在 (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;

提前感谢您的任何建议。

【问题讨论】:

    标签: firemonkey tmemo


    【解决方案1】:

    看着 (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 安装目录中的任何文件。在您的项目目录中制作该文件的副本并修改该副本。不利的一面是,对于新的更新版本,您可能需要记住再次复制和修改。

    【讨论】:

    • 谢谢您-您对使用半透明颜色的建议对我的应用来说已经足够了!我想知道在 FMX 图形中是否可以像在 Vcl 图形中那样将 PenMode 设置为 pmNotXor 或任何其他 TPenMode 枚举类型值。使用这个工具可以轻而易举地绘制和取消绘制光标块。
    猜你喜欢
    • 2013-10-02
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2011-08-14
    • 1970-01-01
    • 2014-10-21
    • 2017-04-24
    相关资源
    最近更新 更多