2012-08-14 11 views
7

Można powiedzieć, że jest dużo dyskusji na ten temat w StackOverflow, ale większość z nich jest bardziej skomplikowana niż to, czego potrzebuję i głównie dla innych języków.Jak konwertować proste RichText na tagi HTML w Delphi?

Mam zdalną bazę danych MySQL, w której mam tabelę "Pomoc" z kodem służącym do wypełniania stron pomocy dynamicznej witryny internetowej, która korzysta z tej bazy danych.

Postanowiłem stworzyć aplikację Delphi do zarządzania tą stroną internetową, zamiast robić to przez samą stronę internetową, aby zwiększyć szybkość i bezpieczeństwo.

Chcę wstawić TRichEdit, aby uzyskać tekst pomocy i użyć prostych rzeczy, takich jak wyrównanie, pogrubienie, kursywa i podkreślenie stylów. Nie chcę używać zdjęć i czcionek.

Jak odebrać tego tekstu sformatowanego tytułowana i konwertować je do formatu HTML umieścić mojego pola BLOB w zdalnej bazy danych a następnie do przestawienia tekstu sformatowanego, jeśli chcę zmienić go ponownie?

+1

Jest handlowych, łatwy w użyciu RTF do HTML/RTF do XHTML kalkulator biblioteki dla Delphi nazywa ScroogeXHTML, które mogą być skonfigurowane tak, aby przetwarzać tylko podstawowe właściwości czcionek. (zrzeczenie się: jestem autorem tej biblioteki) – mjn

+1

A ile kosztuje ta biblioteka? – PSyLoCKe

+0

Można go znaleźć na ['tej stronie'] (http://www.habarisoft.com/scroogexhtml_delphi.html) ;-) – TLama

Odpowiedz

5

Po wypróbowaniu wielu różnych rozwiązań, które nie dały dokładnych wyników, zainspirowało mnie to rozwiązanie: Convert RTF to HTML and HTML to RTF.

Chodzi o to, że kontrola TWebBrowser (w trybie projektowania/edycji) może obsłużyć i przekonwertować poprawnie format RTF, gdy został wklejony ze schowka.

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

Jeśli naprawdę chcesz wygenerować treść RTF przy użyciu TRichEdit, powinieneś przechowywać natywny RTF generowany obok przekonwertowanego HTML. Jeśli jedynym powodem, dla którego używasz TRichEdit, możesz mieć proste możliwości formatowania, prawdopodobnie lepiej jest użyć kontrolki edycji HTML, która generuje natywną treść HTML.

Bez względu na to, w którą stronę się wybierasz, najlepiej jest zapisać macierzysty format, aby użytkownicy mogli edytować zawartość i przekonwertować ją w razie potrzeby na inne formaty (zamiast konwertować w obu kierunkach).

Jeśli używasz TRichEdit, a następnie można łatwo przesyłać strumieniowo zawartość w formacie RTF i poza kontrolą, chociaż polecam TJvRichEdit nad 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; 

Ręcznie konwersji RTF do HTML nie jest łatwym zadaniem. Istnieją rozważania dotyczące znaków Unicode, style czcionek, kody czcionek, formatowanie akapitów, listy numerowane, specjalne znaki HTML i wiele innych. Mimo że potrzebujesz tylko obsługi prostego formatowania, użytkownicy często korzystają z innych funkcji, które powodują bóle głowy związane z konwersją - takich jak kopiowanie zawartości z MSWord i wklejanie jej do aplikacji przy użyciu różnych formatów i stylów czcionek.

JvRichEditToHtml robi przyzwoitą pracę przekształcając RTF na HTML, ale skończyło się na pisaniu własnej jednostki konwersji, ponieważ robimy o wiele więcej z RTF niż proste formatowanie. JvRichEditToHtml powinien z łatwością obsługiwać to, co opisałeś, o ile użytkownicy nie wprowadzają złożonych treści za pomocą funkcji kopiuj/wklej, lub użyj skrótów klawiaturowych do sformatowania treści (np. Punktory = ctrl + shft + L, wcięcie = ctrl + M itp.).

Istnieje również kilka dobrych kontrole edit HTML dla Delphi, jeśli chcesz ominąć zawiłości authoringu w formacie RTF i konwersja do formatu HTML:

Google Results :: Delphi, HTML, Editor, Component

Stack Overflow :: Delphi, HTML, Editor, Component

Używamy TRichView z powodu jego rozległe możliwości. Może ładować/tworzyć RTF i eksportować HTML. Nie jest jednak bezpłatny. Jeśli szukasz czegoś darmowego, dobrym wyborem są TJvRichView i JvRichEditToHtml.

+0

Zmagałem się z edytorami HTML. Nie są nawet w połowie przyzwoite/kompletne. Nawet komercyjne rozwiązania są niechlujstwa. – Ampere

Powiązane problemy