Как конвертировать простой RichText в HTML-теги в Delphi?
Вы можете сказать, что в stackOverflow существует множество дискуссий по этому поводу, но большинство из них более сложны, чем мне нужно, и в основном для других языков.
У меня есть удаленная база данных MySQL, в которой у меня есть таблица "Справка" с кодом для заполнения страниц справки динамического веб-сайта, который использует эту базу данных.
Я решил создать приложение Delphi для управления этим сайтом вместо того, чтобы заниматься самим сайтом для большей скорости и безопасности.
Я хочу поставить TRichEdit
чтобы сделать этот текст справки и использовать простые вещи, такие как выравнивание, полужирный, курсив и подчеркнутые стили. Я не хочу использовать картинки и шрифты.
Как выбрать этот форматированный текст и преобразовать его в HTML, чтобы поместить в мое поле BLOB в удаленной базе данных, а затем снова преобразовать в форматированный текст, если я захочу снова его отредактировать?
2 ответа
Попробовав множество разных решений, которые не дали точных результатов, я был вдохновлен этим решением: конвертировать RTF в HTML и HTML в RTF.
Идея в том, что TWebBrowser
Элемент управления (в режиме дизайна / редактирования) может правильно обрабатывать и преобразовывать формат Rich text, когда он был вставлен из буфера обмена.
uses SHDocVw, MSHTML;
function ClipboardToHTML(AParent: TWinControl): WideString;
var
wb: TWebBrowser;
function WaitDocumentReady: Boolean;
var
StartTime: DWORD;
begin
StartTime := GetTickCount;
while wb.ReadyState <> READYSTATE_COMPLETE do
begin
Application.HandleMessage;
if GetTickCount >= StartTime + 2000 then // time-out of max 2 sec
begin
Result := False; // time-out
Exit;
end;
end;
Result := True;
end;
begin
Result := '';
wb := TWebBrowser.Create(nil);
try
wb.Silent := True;
wb.Width := 0;
wb.Height := 0;
wb.Visible := False;
TWinControl(wb).Parent := AParent;
wb.HandleNeeded;
if wb.HandleAllocated then
begin
wb.Navigate('about:blank');
(wb.Document as IHTMLDocument2).designMode := 'on';
if WaitDocumentReady then
begin
(wb.Document as IHTMLDocument2).execCommand('Paste', False, 0);
Result := (wb.Document as IHTMLDocument2).body.innerHTML;
end;
end;
finally
wb.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.SelectAll;
RichEdit1.CopyToClipboard;
ShowMessage(ClipboardToHTML(Self));
end;
Если вы действительно хотите создавать RTF-контент, используя TRichEdit
, тогда вы должны сохранить собственный RTF, который он генерирует вместе с преобразованным HTML. Если единственная причина, по которой вы используете TRichEdit
так что вы можете иметь простые возможности форматирования, тогда вам, вероятно, лучше использовать элемент управления HTML, который генерирует нативный HTML-контент.
Независимо от того, в каком направлении вы идете, лучше всего сохранить собственный формат для пользователей, чтобы редактировать контент, и конвертировать его по мере необходимости в другие форматы (вместо того, чтобы конвертировать его в обоих направлениях).
Если вы используете TRichEdit
, тогда вы можете легко передавать содержимое RTF в и из-под контроля, хотя я рекомендую TJvRichEdit
над TRichEdit
:
procedure GetRTFData(MS: TMemoryStream; RTF: TRichEdit);
begin
MS.Clear;
RTF.Lines.SaveToStream(MS);
MS.Position := 0;
end;
procedure SetRTFData(MS: TMemoryStream; RTF: TRichEdit);
begin
MS.Position := 0;
RTF.StreamFormat := sfRichText;
RTF.Lines.LoadFromStream(MS);
end;
Ручное преобразование RTF в HTML - непростая задача. Существуют особенности символов Юникода, стили шрифтов, коды шрифтов, форматирование абзацев, нумерованные списки, специальные символы HTML и многое другое. Несмотря на то, что вам нужно только поддерживать простое форматирование, пользователи часто используют другие функции, которые вызывают головную боль при преобразовании - например, копирование содержимого из MSWord и вставка его в ваше приложение со всеми видами форматирования и стилями шрифтов.
JvRichEditToHtml
выполняет приличную работу по преобразованию RTF в HTML, но мы закончили тем, что написали наш собственный модуль преобразования, потому что мы делаем намного больше с RTF, чем простое форматирование. JvRichEditToHtml
должно легко обрабатывать то, что вы описали, пока пользователи не вводят сложный контент с помощью копирования / вставки или используют сочетания клавиш для форматирования содержимого (например, bullets = ctrl+shft+L, indent = ctrl+M, так далее.).
Есть также несколько хороших элементов управления редактированием HTML для Delphi, если вы хотите обойти сложности разработки в RTF и конвертации в HTML:
Результаты Google:: Delphi, HTML, редактор, компонент
- Редактор HTML для CBuilder / Delphi
- WYSIWYG HTML-редактор для Delphi
- Квест для HTML-редактора VCL control
Переполнение стека:: Delphi, HTML, редактор, компонент
- Delphi с интерфейсом HTML/CSS
- (и много других!)
Мы используем TRichView
из-за его обширных возможностей. Он может загружать / создавать RTF и экспортировать HTML. Это не бесплатно, однако. Если вы ищете что-то бесплатное, TJvRichView
а также JvRichEditToHtml
хорошие варианты.
Это действительно хорошо работает для меня. без TWebBrowser.
но от html к richedit.
https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=989&lngWId=7
надеюсь, кому-то это пригодится.