PDA

Visualizza la versione completa : [DELPHI] Creare un editor WYSIWYG


firefox88
11-11-2006, 17:35
Salve a tutti,

sto cercando un componente VCL che faccia da semplice editor WYSIWYG per un documento RTF.

E' sufficiente che gestisca l'allineamento del testo, il grassetto, il corsivo, il sottolineato, i collegamenti ipertestuali (molto importante) e delle semplicissime tabelle.

Su Internet trovo solo strumenti troppo costosi e sofisticati, come WPTools. Quello che mi serve è molto, ma molto di meno.


Grazie,
Giacomo

alka
12-11-2006, 15:49
Hai già dato un'occhiata su Torry Delphi's Pages (http://www.torry.net)?

In ogni caso, la problematica che affronti non è di semplice soluzione, ed è per questo motivo che i componenti di terze parti individuati hanno un certo costo.

Potresti tentare la strada alternativa della costruzione di un editor WYSIWYG interagendo con il componente WebBrowser (wrapper di Internet Explorer) e adoperando le interfacce fornite dal componente, ma è senz'altro una attività tendenzialmente complessa.

Inoltre, le interfacce che consentono l'editing HTML con Internet Explorer sono probabilmente soggette a cambiamenti con l'imminente versione 7.

Ciao! :ciauz:

firefox88
12-11-2006, 18:52
Ho trovato un buon editor WYSIWYG javascript: TinyMCE (http://tinymce.moxiecode.com/).
E' completamente gratuito e compatibile con MSIE 7.

Ora la mia idea è di includere un componente TWebBrowser in un form, con Location una pagina HTML contenente TinyMCE. E questo l'ho già fatto.
L'unico problema è che Delphi dovrebbe essere in grado di leggere il codice HTML all'interno di una <textarea>, "estrapolandolo" da una pagina web non salvata.
Sono sicuro che questo è possibile, il punto è: come?

Qualcuno mi saprebbe aiutare?

firefox88
14-11-2006, 12:15
L'unico problema è che Delphi dovrebbe essere in grado di leggere il codice HTML all'interno di una <textarea>, "estrapolandolo" da una pagina web non salvata.
Sono sicuro che questo è possibile, il punto è: come?

Nessuno ha qualche idea al riguardo? :(

alka
14-11-2006, 12:31
Originariamente inviato da firefox88
Nessuno ha qualche idea al riguardo? :(
Dovresti sfruttare le interfacce di programmazione COM messe a disposizione dal controllo per eseguire comandi, come ottenere il riferimento alla TEXTAREA in oggetto, e da lì risalire al suo contenuto.

Prova a ricercare WebBrowser all'interno di Torry Delphi's Pages (http://www.swissdelphicenter.ch/torry/tipsuchen.php) per alcuni esempi.

Ciao! :ciauz:

firefox88
14-11-2006, 12:48
Originariamente inviato da alka
Dovresti sfruttare le interfacce di programmazione COM messe a disposizione dal controllo per eseguire comandi, come ottenere il riferimento alla TEXTAREA in oggetto, e da lì risalire al suo contenuto.

Prova a ricercare WebBrowser all'interno di Torry Delphi's Pages (http://www.swissdelphicenter.ch/torry/tipsuchen.php) per alcuni esempi.

Ciao! :ciauz:

OK, mi sembra che ci sia un bel po' di roba, ti farò sapere...

alka
14-11-2006, 13:10
Originariamente inviato da firefox88
OK, mi sembra che ci sia un bel po' di roba, ti farò sapere...
Grazie. Sono curioso di sapere i risultati. :)

firefox88
19-11-2006, 10:29
Originariamente inviato da alka
Grazie. Sono curioso di sapere i risultati. :)

Una volta tanto, posso dirti di aver conseguito un ottimo risultato.

L'editor TinyMCE non è un gran che, ma è gratuito e perlomeno funziona. Ecco come inserirlo in Delphi come editor WYSIWYG:




var
Document : IHTMLDocument2;
elem : IHTMLTextAreaElement;

[...]
WebBrowser1.Navigate(ExtractFilePath(Application.E xeName) + 'index.html');
Screen.Cursor := crAppStart;
try
while WebBrowser1.Busy do
begin
Application.ProcessMessages;
Sleep(50);
end;
repeat
Application.ProcessMessages;
Sleep(50);
until WebBrowser1.ReadyState = 4;
// ^ Il ciclo serve ad evitare che Delphi interagisca con Internet Explorer
// prima che abbia terminato di caricare la pagina, con conseguenze disastrose.
finally
Screen.Cursor := crDefault;
Document := WebBrowser1.Document as IHTMLDocument2;
elem := Document1.all.item('htmlbox', 0) as IHTMLTextAreaElement;
elem.value := UnaStringaQualsiasi;
Document.parentWindow.ExecScript('tinyMCE.updateCo ntent(''htmlbox'')', 'javascript');
end;


Quindi, per richiamare il codice HTML scritto dall'utente:



Document := WebBrowser1.Document as IHTMLDocument2;
Document.parentWindow.ExecScript('tinyMCE.triggerS ave()', 'javascript');
elem := Document.all.item('htmlbox', 0) as IHTMLTextAreaElement;
HTMLText := elem.value;
if HTMLText = '

</p>' then HTMLText := '';


Il documento index.html deve contenere una <textarea> con id "htmlbox", e ovviamente un richiamo a TinyMCE come specificato nei manuali dello stesso.

Per togliere le barre di scorrimento, il menu di contesto e la selezione del testo da TWebBrowser, consiglio TWBContainer (http://www.delphidabbler.com/articles?article=18&part=1).

alka
19-11-2006, 14:58
Ottimo lavoro, e a buon rendere! :)

Dovrei cimentarmi anche io, prossimamente, ad implementare qualcosa del genere, quindi se ci saranno ulteriori sviluppi e miglioramenti provvederò a riportarle in questo thread integrando le informazioni che hai già fornito.

Ciao! :ciauz:

Loading