htmldelphirtfdelphi-2006richedit

How to Convert Simple RichText to HTML tags in Delphi?


You may say that there are lots of discussions about this in stackOverflow, but most of them are more complicated than what I need and mostly for other languages.

I have a MySQL remote database in which I have a "Help" table with the code for filling the help pages of the dynamic web site that uses this database.

I decided to make a Delphi application to manage that website instead of doing by the web site itself for more speed and security.

I want to put a TRichEdit to make that help text and use simple things like alignment, bold, italic and underlined styles. I don't want to use pictures and fonts.

How to pick that rich styled text and convert it to HTML to put to my BLOB field in the remote database and then reconvert to rich text if I want to edit it again?


Solution

  • After trying many different solutions which did not gave accurate results, I was inspired by this solution: Convert RTF to HTML and HTML to RTF.

    The idea is that TWebBrowser control (in design/edit mode) can handle and convert correctly Rich text format when it was pasted from the clipboard.

    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;