Search code examples
delphidelphi-xe7

Insert colored line at the top of TRichEdit


I'm using a TRichEdit in order to show the last operations that have been done in my application. The first line of my TRichEdit should be the last operation. If the operation failed, I would like to put this line in red.

My problem is that I am not able to insert a colored line at the top of my TRichEdit. Here is what I've tried:

RichEditLog.SelAttributes.Color := clBlack;
RichEditLog.Lines.Insert(0, 'Operation 1 OK');
// RichEditLog.Lines.Add('Operation 1 OK');

RichEditLog.SelAttributes.Color := clRed;
RichEditLog.Lines.Insert(0, 'Operation 2 failed');
// RichEditLog.Lines.Add('Operation 2 failed');

RichEditLog.SelAttributes.Color := clRed;
RichEditLog.Lines.Insert(0, 'Operation 3 failed');
// RichEditLog.Lines.Add('Operation 3 failed');

RichEditLog.SelAttributes.Color := clBlack;
RichEditLog.Lines.Insert(0, 'Operation 4 OK');
// RichEditLog.Lines.Add('Operation 4 OK');

The problem is that my TRichEdit only apply the first change of color and keep it for all the lines. If I use Add() instead of Insert(), the colors are changing but the line are inserted at the end of my TRichEdit.

My question is : Is there an easy way to get the results I'm looking for ?


Solution

  • You need to set the selected start and length to 0 if you want to insert at the beginning:

    RichEditLog.SelStart := 0;
    RichEditLog.SelLength := 0;
    RichEditLog.SelAttributes.Color := clBlack;
    RichEditLog.Lines.Insert(0, 'Operation 1 OK');
    

    Alternatively, instead of RichEditLog.Lines.Insert() you can assign the text to RichEdit.SelText, but then you need to add the new line characters yourself, f.ex.:

    RichEditLog.SelText := 'Operation 1 OK'+sLineBreak;
    

    Either way, when applied to your test code the result is:

    enter image description here