Независимое изменение цвета текста RichEdit с уже загруженным текстом - PullRequest
1 голос
/ 27 мая 2020

Как я могу изменить цвет текста в Rich Edit построчно? Это зависит от должности. Первая строка должна быть красной, вторая - зеленой и так далее. Проблема в том, что текст Rich Edit уже загружен. Поэтому его необходимо изменить после того, как текст уже находится в элементе управления. Я использую Delphi.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Если содержимое элемента управления richedit не разделено на строки, а скорее переносится по словам на лету в зависимости от размера элемента управления (возможно, изменяясь при изменении размера формы), то вы можете использовать эту процедуру для попеременного окрашивания строк в красный цвет, зеленый, синий:

procedure TForm1.Button1Click(Sender: TObject);
const
  ColorWheel: array[0..2] of TColor = (clRed, clGreen, clBlue);
var
  RowNr, RowStartPos, RowEndPos, C: Integer;
  HasReachedEnd: Boolean;
begin
  HasReachedEnd := False;
  RowStartPos := 0;
  C := 0;
  RowNr := 1;
  repeat
    RowEndPos := RichEdit1.Perform(EM_LINEINDEX, RowNr, 0);
    if RowEndPos = -1 then
    begin
      // Last row reached
      HasReachedEnd := True;
      RowEndPos := RichEdit1.GetTextLen;
    end;
    // Select text
    RichEdit1.SelStart := RowStartPos;
    RichEdit1.SelLength := RowEndPos - RowStartPos;
    // Change selected text colour
    RichEdit1.SelAttributes.Color := ColorWheel[C];
    C := (C + 1) mod 3;
    // Prepare for next row
    RowStartPos := RowEndPos;
    Inc(RowNr);
  until HasReachedEnd;
end;
1 голос
/ 27 мая 2020

Лучше с самого начала загрузить правильные цвета.

Но чтобы ответить на ваш вопрос, быстрое, грязное и довольно уродливое решение - это сделать

function RandomColor: TColor;
begin
  Result := RGB(Random(256), Random(256), Random(256))
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to RichEdit1.Lines.Count - 1 do
  begin
    RichEdit1.CaretPos := Point(0, i);
    RichEdit1.SelLength := RichEdit1.Lines[i].Length;
    RichEdit1.SelAttributes.Color := RandomColor;
  end;
end;
...