Как конвертировать простой 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, редактор, компонент

Переполнение стека:: Delphi, HTML, редактор, компонент

Мы используем TRichView из-за его обширных возможностей. Он может загружать / создавать RTF и экспортировать HTML. Это не бесплатно, однако. Если вы ищете что-то бесплатное, TJvRichView а также JvRichEditToHtml хорошие варианты.

Это действительно хорошо работает для меня. без TWebBrowser.

но от html к richedit.

https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=989&lngWId=7

надеюсь, кому-то это пригодится.

Другие вопросы по тегам