Изменение цвета фона за выбранной подстрокой в ​​компоненте Firemonkey TMemo

Я хочу программно установить фокус на определенной подстроке в компоненте 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;

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


person user11935527    schedule 08.11.2019    source источник


Ответы (1)


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

Сначала рисуется текст, затем выделение и, наконец, выделение букв. Стандартный цвет выбора — $7F3399FF. Обратите внимание на альфа-канал (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. Сделайте копию файла в каталоге вашего проекта и измените эту копию. Недостатком является то, что с новыми обновленными версиями вам может потребоваться не забывать копировать и изменять снова.

person Tom Brunberg    schedule 09.11.2019
comment
Спасибо - ваше предложение использовать полупрозрачный цвет более чем достаточно для моего приложения! Мне было интересно, можно ли в графике FMX сделать эквивалент установки PenMode в pmNotXor или любое другое значение перечисляемого типа TPenMode, как в графике Vcl. Использование этого средства упрощает рисование и удаление блока курсора. - person user11935527; 09.11.2019