Ple*_*rds 7 html delphi rtf richedit delphi-2006
您可能会说在stackOverflow中有很多关于此的讨论,但是大多数都比我需要的更复杂,主要用于其他语言.
我有一个MySQL远程数据库,其中我有一个"帮助"表,其中包含用于填充使用此数据库的动态网站的帮助页面的代码.
我决定制作一个Delphi应用程序来管理该网站,而不是通过网站本身来提高速度和安全性.
我想用一个TRichEdit来制作帮助文本并使用简单的东西,如对齐,粗体,斜体和带下划线的样式.我不想使用图片和字体.
如何选择丰富的样式文本并将其转换为HTML以放入远程数据库中的BLOB字段,然后如果我想再次编辑它,则重新转换为富文本?
如果您确实想使用a生成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;
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是很好的选择.
在尝试了许多不能给出准确结果的不同解决方案后,我受到了这个解决方案的启发:将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)
| 归档时间: |
|
| 查看次数: |
13802 次 |
| 最近记录: |