Я использую 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 напрямую.