2012-08-14 7 views
7

Si può dire che ci sono molte discussioni su questo in stackOverflow, ma la maggior parte di esse sono più complicate di quelle di cui ho bisogno e soprattutto per altre lingue.Come convertire semplici tag RichText in HTML in Delphi?

Ho un database remoto MySQL in cui ho una tabella "Help" con il codice per riempire le pagine di aiuto del sito web dinamico che utilizza questo database.

Ho deciso di creare un'applicazione Delphi per gestire quel sito Web anziché eseguire lo stesso sito Web per maggiore velocità e sicurezza.

Voglio mettere un TRichEdit per fare quel testo di aiuto e usare cose semplici come gli stili di allineamento, grassetto, corsivo e sottolineato. Non voglio usare immagini e caratteri.

Come scegliere quella ricca di testo in stile e convertirlo in HTML di mettere al mio campo BLOB nel database remoto e quindi riconvertire in testo ricco se voglio modificare di nuovo?

+1

C'è uno spot, facile da usare RTF per HTML/RTF alla libreria convertitore XHTML per Delphi chiamato ScroogeXHTML, che può essere configurato per elaborare solo le proprietà di base dei font. (disclaimer: io sono l'autore di questa libreria) – mjn

+1

E quanto costa questa libreria? – PSyLoCKe

+0

Puoi trovarlo su ['questa pagina'] (http://www.habarisoft.com/scroogexhtml_delphi.html) ;-) – TLama

risposta

5

Dopo aver provato molte soluzioni diverse che non hanno fornito risultati accurati, mi sono ispirato a questa soluzione: Convert RTF to HTML and HTML to RTF.

L'idea è che il controllo TWebBrowser (in modalità di progettazione/modifica) sia in grado di gestire e convertire correttamente il formato RTF quando è stato incollato dagli Appunti.

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; 
6

Se si desidera generare contenuto RTF utilizzando uno TRichEdit, è necessario memorizzare il formato RTF nativo generato insieme al codice HTML convertito. Se l'unica ragione per cui stai usando TRichEdit è che puoi avere semplici capacità di formattazione, probabilmente stai meglio usando un controllo di modifica HTML che genera contenuto HTML nativo.

Indipendentemente dal modo in cui si va, è meglio memorizzare il formato nativo per gli utenti per modificare il contenuto e convertirlo secondo necessità in altri formati (invece di convertirlo in entrambe le direzioni).

Se si utilizza TRichEdit, allora si può facilmente lo streaming del contenuto RTF dentro e fuori del controllo, anche se vi consiglio TJvRichEdit oltre 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; 

manualmente la conversione di formato RTF in HTML non è un compito facile. Esistono considerazioni sui caratteri unicode, stili di caratteri, codici di caratteri, formattazione di paragrafi, elenchi numerati, caratteri HTML speciali e molto altro ancora. Anche se hai solo bisogno di supportare la semplice formattazione, gli utenti spesso usano altre funzionalità che causano mal di testa nelle conversioni, come copiare i contenuti da MSWord e incollarli nell'app con tutti i tipi di formattazione e stili di carattere.

JvRichEditToHtml fa un lavoro decente convertendo RTF in HTML, ma abbiamo finito per scrivere la nostra unità di conversione perché facciamo molto di più con RTF rispetto alla semplice formattazione. JvRichEditToHtml dovrebbe gestire facilmente ciò che hai descritto purché gli utenti non introducano contenuti complessi tramite copia/incolla, o utilizzare le scorciatoie da tastiera per formattare il contenuto (ad esempio, punti elenco = ctrl + shft + L, indent = ctrl + M , eccetera.).

Ci sono anche molti buoni controlli di modifica HTML per Delphi, se si desidera ignorare le complessità di authoring in formato RTF e la conversione in HTML:

Google Results :: Delphi, HTML, Editor, Component

Stack Overflow :: Delphi, HTML, Editor, Component

Usiamo TRichView a causa delle sue ampie capacità. Può caricare/creare RTF ed esportare HTML. Non è comunque libero. Se stai cercando qualcosa di gratuito, TJvRichView e JvRichEditToHtml sono buone opzioni.

+0

Ho faticato con quegli editor HTML. Non sono neanche mezzi decenti/completi. Anche le soluzioni commerciali sono sciatte. – Ampere