如何转换简单的富文本HTML标记在Delphi?(How to Convert Simple Ric

2019-07-30 23:11发布

你可能会说,现在有很多在StackOverflow的这个讨论,但大部分都是比我需要的,多为其他语言更加复杂。

我有,我有一个“帮助”表,用于填充使用该数据库的动态网站的帮助页面的代码MySQL的远程数据库。

我决定做一个Delphi应用程序来管理,而不是由网站本身做更多的速度和安全性网站。

我想提出一个TRichEdit做出帮助文本并使用简单的事情像对齐,粗体,斜体和下划线样式。 我不想用图片和字体。

如何挑选丰富样式的文本,并将其转换为HTML把我的BLOB字段在远程数据库中,然后再转换成丰富的文本,如果我想再次编辑呢

Answer 1:

想这并没有给出准确的结果,许多不同的解决方案后,我的灵感来自于该解决方案: 转换RTF到HTML和HTML为RTF 。

这个想法是, TWebBrowser控制(设计/编辑模式)可以处理并转换成正确的富文本格式,当它被从剪贴板粘贴。

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;


Answer 2:

如果你真的想使用生成RTF内容TRichEdit ,那么你应该保存它产生沿着转换的HTML原生RTF。 如果您使用的唯一原因TRichEdit是让你可以有简单的格式化功能,那么你可能会更好过使用生成本地HTML内容的HTML编辑控件。

不管你走哪条路,最好是存储用户编辑内容的原始格式,并根据需要为其他格式进行转换(而不是将其转换两个方向)。

如果你使用TRichEdit ,那么你可以很容易地流进出控制的RTF内容,但我建议TJvRichEditTRichEdit

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不是一件容易的事。 有Unicode字符的考虑,字体样式,字体规范,段落格式,编号列表,特殊的HTML字符,和这么多。 即使你只需要支持简单的格式,用户经常使用会使转换头痛等功能 - 如从复制的MSWord内容,并与所有种类的格式和字体样式粘贴到您的应用程序。

JvRichEditToHtml做一份体面的工作转换RTF到HTML,但我们最终编写我们自己的转换单元,因为我们做了很多更与RTF比简单的格式。 JvRichEditToHtml应该很容易处理,只要你所描述什么是用户不通过复制/粘贴介绍复杂的内容,或者使用键盘快捷键的内容(例如,子弹= Ctrl + Shift + L,缩进= CTRL + M格式化等)。

还有德尔福几个不错的HTML编辑控件,如果你想绕过在RTF创作和转换为HTML的复杂性:

谷歌搜索结果::德尔福,HTML,编辑器,组件

  • HTML编辑器的CBuilder /德尔福
  • 所见即所得的HTML编辑器组件德尔福
  • 对于HTML编辑器VCL控制的追求

堆栈溢出::德尔福,HTML,编辑器,组件

  • 德尔福与HTML / CSS界面
  • (和其他许多!)

我们使用TRichView由于其广泛的能力。 它可以加载/创建RTF,出口HTML。 它不是免费的但是。 如果您正在寻找免费的东西, TJvRichViewJvRichEditToHtml都是不错的选择。



文章来源: How to Convert Simple RichText to HTML tags in Delphi?