Изменение цвета фона за выбранной подстрокой в ​​компоненте Firemonkey TMemo - PullRequest
0 голосов
/ 08 ноября 2019

Я хочу программно установить фокус на определенную подстроку в компоненте Firemonkey TMemo (Delphi 10.3.1), нарисовав желтый фон за подстрокой. Код ниже закрашивает желтый прямоугольник в правильном положении, но кажется, что прямоугольник накладывается на текст, скрывая его. Есть ли свойство 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;

Заранее благодарим вас за любые предложения.

1 Ответ

1 голос
/ 09 ноября 2019

Глядя на (XE7) FMX.Memo.pas procedure TMemo.DoContentPaint(), можно подумать, что порядок рисования неправильный. С другой стороны, это может быть преднамеренным, может быть, я просто не понимаю, почему.

Сначала рисуется текст, затем выделение и, наконец, выделение заклинаний. Стандартный цвет выбора - $7F3399FF. Обратите внимание на альфа-канал (7F). Это делает его наполовину прозрачным, и поэтому текст просвечивает, даже если цвет текста отображается поверх текста.

enter image description here

Решение вашей проблемыпоэтому, чтобы определить цвет, чтобы быть частично прозрачным, f.ex.:

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

Эффект этого состоит в том, однако, что текст больше не черный (как это не с оригинальным цветом выделения).

enter image description here

Тестирование с копией файла FMX.Memo.pas Я переставил procedure TMemo.DoContentPaint() так, чтобы появился кодовый блок, отмеченный // selectionдо блока // text. В этом случае для выбора можно использовать полностью непрозрачный цвет.

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

enter image description here

Но никогда не изменяйте никакие файлы в исходном каталоге установки Delphi(ы) . Сделайте копию файла в каталоге вашего проекта и измените эту копию. Недостатком является то, что с новыми обновленными версиями вам, возможно, придется помнить, чтобы копировать и изменять снова.

...