如何在Delphi中将简单的RichText转换为HTML标签?

Ple*_*rds 7 html delphi rtf richedit delphi-2006

您可能会说在stackOverflow中有很多关于此的讨论,但是大多数都比我需要的更复杂,主要用于其他语言.

我有一个MySQL远程数据库,其中我有一个"帮助"表,其中包含用于填充使用此数据库的动态网站的帮助页面的代码.

我决定制作一个Delphi应用程序来管理该网站,而不是通过网站本身来提高速度和安全性.

我想用一个TRichEdit来制作帮助文本并使用简单的东西,如对齐,粗体,斜体和带下划线的样式.我不想使用图片和字体.

如何选择丰富的样式文本并将其转换为HTML以放入远程数据库中的BLOB字段,然后如果我想再次编辑它,则重新转换为富文本

Jam*_* L. 6

如果您确实想使用a生成RTF内容TRichEdit,那么您应该将它生成的本机RTF与转换后的HTML一起存储.如果您使用的唯一原因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;
Run Code Online (Sandbox Code Playgroud)

手动将RTF转换为HTML并非易事.有unicode字符注意事项,字体样式,字体代码,段落格式,编号列表,特殊HTML字符等等.即使您只需要支持简单格式化,用户也经常使用导致转换问题的其他功能 - 例如从MSWord复制内容并将其粘贴到具有各种格式和字体样式的应用程序中.

JvRichEditToHtml在将RTF转换为HTML方面做得不错,但我们最终编写了自己的转换单元,因为我们使用RTF比简单格式化做得更多. JvRichEditToHtml只要用户不通过复制/粘贴引入复杂内容,或使用键盘快捷键格式化内容(例如,bullets = ctrl + shft + L,indent = ctrl + M,就应该轻松处理你所描述的内容)等等.).

如果你想绕过RTF中的创作和转换为HTML的复杂性,还有几个很好的Delphi编辑控件:

Google Results :: Delphi,HTML,Editor,Component

Stack Overflow :: Delphi,HTML,编辑器,组件

我们TRichView因其广泛的功能而使用.它可以加载/创建RTF,并导出HTML.但它不是免费的.如果您正在寻找免费的东西,TJvRichView并且JvRichEditToHtml是很好的选择.


kob*_*bik 5

在尝试了许多不能给出准确结果的不同解决方案后,我受到了这个解决方案的启发:将RTF转换为HTML,将HTML转换为RTF.

我们的想法是,TWebBrowser控件(在设计/编辑模式下)可以在从剪贴板粘贴时正确处理和转换Rich文本格式.

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;
Run Code Online (Sandbox Code Playgroud)