Как вставить новые неформатированные строки вверху TRichEdit - PullRequest
0 голосов
/ 20 мая 2019

Я использую TRichEdit для хранения тела клиента электронной почты. Я дал пользователю простые возможности форматирования (полужирный, курсив, подчеркивание, выравнивание по левому, центральному и правому абзацам и маркеры. Это хорошо работает для отправки отформатированного текста по электронной почте в виде html, используя Indy, следуя коду Реми здесь .

Я извлекаю текст TRichEdit как HTML, используя

function GetHTML(RichEdit:TRichEdit): string;
var
    htmlstrings : Tstringlist;
    JvRichEditToHtml1  :TJvRichEditToHtml;
begin
 htmlstrings := Tstringlist.create;
 JvRichEditToHtml1 := TJvRichEditToHtml.create(nil);
 try
   JvRichEditToHtml1.ConvertToHtmlStrings(RichEdit,htmlstrings);
   result := htmlstrings.Text;
 finally
   htmlstrings.free ;
   JvRichEditToHtml1.free;
 end;
end;

Непосредственно перед отправкой электронного письма я использую код для вставки строки приветствия в качестве новой верхней строки в TRichEdit, за которой следуют две пустые строки. Это используется системой электронной почты для персонализации электронной почты и также хорошо работает.

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

Как я могу использовать код для вставки строки в верхнюю часть TRichEdit без форматирования абзаца или шрифта и при этом сохранить любое форматирование, которое пользователь мог применить (что было) к первым строкам их ручного ввода?

Код, который я сейчас использую для вставки строки приветствия, приведен ниже, но мое приветствие все еще получает стиль форматирования, который применяет пользователь. (Первоначально у меня было только три строки вставки, но я добавил другой код, следующий за идеями в похожем вопросе здесь ). Идентификаторы в верхнем регистре - это константы, определенные в других местах.

procedure AddRecipientVarableToBody( var Body: TRichEdit);
  begin  
  //remove formatting from the (new) first paragraph
  Thebody.Paragraph.Numbering := nsnone;
  Thebody.Paragraph.Alignment := taLeftJustify;

  //add the three new top lines (two blank plus a recipient)
  //done backwards as we insert a new line zero each time
  TheBody.lines.Insert(0,EMPTY_STRING);  // two blank lines
  TheBody.lines.Insert(0,EMPTY_STRING);
  TheBody.lines.Insert(0,'To: ' + RECIPIENT_VARIABLE_SALUTATION); 

 //Remove any formatting from first three lines
   TheBody.SelStart:=0;
   TheBody.SelLength:= length(TheBody.Lines[0]) + length(TheBody.Lines[1]) + length(TheBody.Lines[2]);
   TheBody.SelAttributes.Style  :=  [];
   end;

Приложение:

Мне удалось обойти обходной путь, чтобы получить желаемый результат, отложив вставку приветствия, пока я не настроил параметры, готовые для передачи в Indy, и добавил весь HTML-код TRichEdit в простую текстовую строку, т.е. вместо

Params.Add('html=' +  GetHTML(body));

Я использовал

Params.Add('html=' +  'To: ' + RECIPIENT_VARIABLE_SALUTATION + GetHTML(body)); 

где тело - TRichEdit.

Однако я все же хотел бы знать, можно ли решить мою проблему с помощью вставки новых строк в TRichEdit напрямую.

1 Ответ

1 голос
/ 20 мая 2019

Вы можете определить DefAttributes для вашего RichEdit. Затем вы можете легко вернуться к использованию этой настройки просто

RE.SelAttributes := RE.DefAttributes;

Итак, вот проверка вашей ситуации. Сначала определяем DefAttributes, например в OnFormCreate():

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Initialize to what you want to return to, or use as default
  RE.DefAttributes.Charset := ANSI_CHARSET;
  RE.DefAttributes.Color := clBlack;
  RE.DefAttributes.Height := -16;
  RE.DefAttributes.Name := 'Segoe UI';
  RE.DefAttributes.Size := 12;
  RE.DefAttributes.Style := [];
end;

Обратите внимание, что выше не относится к пулям, они обрабатываются отдельно.

В следующем коде мы моделируем то, что мог написать пользователь ...

procedure TForm1.Button1Click(Sender: TObject);
begin
  RE.Lines.Add('Final reminder');
  RE.Lines.Add('Please, fill the form below, and send it immediately.');

  RE.SelStart := 0;
  RE.SelLength := Length(RE.Lines[0]);
  RE.SelAttributes.Color := clRed;
  RE.SelAttributes.Name := 'Algerian';
  RE.SelAttributes.Size := 15;

  RE.SelStart :=  Length(RE.Lines[0]);
  RE.SelLength :=  Length(RE.Lines[1]);
  RE.SelAttributes := RE.DefAttributes;
end;

... и какие специальные атрибуты Bold, Italic, Underline и Strikeout они могли бы добавить, а также маркер для первой строки. Они добавлены с помощью кнопок в моей тестовой форме.

enter image description here

Наконец, как добавить три строки в начало и обеспечить независимое форматирование.

procedure AltAddRecipientVarableToBody( var RE: TRichEdit);
begin
  RE.lines.Insert(0,EMPTY_STRING);  // two blank lines
  RE.lines.Insert(0,EMPTY_STRING);
  RE.lines.Insert(0,'To: ' + RECIPIENT_VARIABLE_SALUTATION);

  // Select
  RE.SelStart := 0;
  RE.SelLength:= length(RE.Lines[0]) + 1
               + length(RE.Lines[1]) + 1
               + length(RE.Lines[2]) + 1;
  // Clear attributes
  RE.SelAttributes := RE.DefAttributes;
  // Clear bullets
  RE.Paragraph.Numbering := nsNone;
end;

Добавление 1 символа в строке для символов новой строки. Обратите внимание, что, поскольку маркеры являются свойствами абзацев, они не могут быть определены в DefAttributes и должны рассматриваться отдельно.

enter image description here

И результат, с тремя добавленными строками, отформатированными с DefAttributes и исходным текстом, поддерживающим любое форматирование.

...