Newsgroup: it.comp.lang.delphi
Titolo: TWebBrowser : Regalo di fine anno

Salve a tutti,
questa settimana mi sono imbattuto in un problema che mi ha fatto
letteralmente
diventare pazzo.
Ora ho trovato la soluzione e desidero metterla a disposizione di icld
perchč
nč in questo ng, nč da nessuna altra parte su internet sono riuscito a
trovare
la soluzione specifica pubblicata per intero.
L'unica cosa che ho trovato sono una serie di elementi che, rielaborati e
messi
insieme, mi hanno permesso di arrivare al risultato voluto.
Desidero pubblicare la soluzione anche perchč, cercando su internet, ho
notato
che moltissimi colleghi si sono posti il problema senza perň trovare la
soluzione.
Premetto comunque che per me il problema č stato particolarmente complicato
forse
perchč non avevo mai utilizzato il componente TWebBrowser e quindi ero del
tutto
privo di esperienza.
PROBLEMA
Ho sostituito il popupmenů contestuale del WebBrowser con un popupmenů
personalizzato.
Per farlo ho utilizzato il seguente codice reperito su internet:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MsgHandler;
end;
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
begin
  Handled := False;
  if (Msg.Message = WM_RBUTTONDOWN) or (Msg.Message = WM_RBUTTONUP) then
  begin
    handled:=True;
    getcursorpos(Mouse);
    popupmenu1.popup(Mouse.x,Mouse.y);
  end;
end;
Nel mio popup menů ho inserito solo una scelta ("Copia"), quindi, da questo
momento
in poi, quando eseguo un click con il pulsante destro del mouse su un
qualsiasi punto
della pagina web contenuta nel mio oggetto istanziato con TwebBrowser,
comparirŕ solo
la scelta "Copia" nel menů di popup.
A questo punto mi sorgeva perň una domanda alla quale non riuscivo a dare
una risposta:
Se sotto il cursore del mouse, nel punto della pagina in cui effettuo il
click con il
pulsante destro, c'č una immagine (Jpg,Gif o altro) come faccio a copiarla e
trasferirla
eventualmente in un oggetto TImage presente sulla mia form ?
Naturalmente bisognava implementare l'evento Click della mia scelta copia
del menů di
popup, ma cosa dovevo scriverci dentro ?
In particolare come potevo fare per individuare il nome o altri riferimenti
utili
all'immagine sulla quale mi trovavo posizionato con il mouse ?
SOLUZIONE
N.B.:La presente soluzione č stata testata su Delphi 6 Service Pack 1.
Dovrebbe
funzionare anche sulle altre versioni di Delphi, ma non ho la possibilitŕ di
fare dei
test.
Nella uses mettere la unit MSHTML.
procedure TForm1.Copia1Click(Sender: TObject);
var
  MausPos: TPoint;
  Element: IHTMLElement;
  imgElement: IHTMLIMGElement;
  x, y: Integer;
  Doc: IHTMLDocument2;
  body,controlRange: olevariant;
begin
  if Assigned(WebBrowser1) then
  begin
    Doc := WebBrowser1.Document as IHTMLDocument2;
    if Assigned(doc) then
    begin
      // Rilevo la posizione corrente del mouse
      GetCursorPos(MausPos);
      mauspos := WebBrowser1.ScreenToClient(mauspos);
      x := MausPos.x;
      y := MausPos.y;
      // Prendo l'elemento che si trova sotto il cursore del mouse
      Element := Doc.elementFromPoint(x, y);
      if Assigned(Element) then
      begin
        Element.QueryInterface(IHTMLIMGElement, imgElement);
        if assigned(imgElement) then
        begin
          // Se l'elemento su cui mi trovo č una immagine la copio nella
ClipBoard
          body := WebBrowser1.OleObject.document.body;
          controlRange := body.createControlRange;
          controlRange.add(imgElement);
          controlRange.execCommand('Copy', False, EmptyParam);
          // Prendo l'immagine copiata nella ClipBoard e la trasferisco nel
mio oggetto Image1
          if ClipBoard.HasFormat(CF_BITMAP) then
          begin
             Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,
ClipBoard.GetAsHandle(cf_Bitmap), 0);
             ClipBoard.Clear;
          end;
        end;
      end;
    end;
  end;
end;
Naturalmente questo problema mi si č presentato perchč ho utilizzato il
componente TWebbrowser
standard fornito con Delphi, altrimenti si poteva risolvere con componenti
equivalenti di
terze parti messi a disposizione gratuitamente o a pagamento.
Spero che questa soluzione possa essere utile a qualcuno di voi senza che
debba impazzire come
ho fatto io per poter ottenere il risultato voluto.
Marco.D.T.


Che dire ?
grazie !
GP

 letteralmente diventare pazzo. [...]
Non sei l'unico ad impazzire con il controllo *TWebBrowser*. :-)
Al momento sto lavorando su un'applicazione Web piuttosto urgente 
(
ASP.NET
), quindi ho dovuto interrompere le mie vicissitudini con questo 
controllo.
Ciò che sto cercando di ottenere è il beneficio delle funzionalità di 
editing HTML del controllo stesso per una mia applicazione in cui devo 
fornire la possibilità di modificare una pagina in modo visuale.
Fortuna che ho appena studiato in modo abbastanza approfondito la 
programmazione con lo standard COM, altrimenti avrei avuto molte più 
difficoltà a riguardo. Si tratta di utilizzare in modo opportuno le 
interfacce esposte dal controllo - in base alle funzionalità cui si 
vuole avere accesso - e consultare frequentemente la Win32 SDK 
Documentation attraverso Delphi o il sito MSDN...anche se alcune 
interfacce sono davvero molto complicate.
Se scopro qualcosa di interessante durante il mio viaggio all'interno 
del controllo MSHTML che ritengo possano essere utili alla community - 
non appena mi è possibile riprendere lo sviluppo del progetto in 
questione - non mancherò di rispondere qui per segnalarle, o magari di 
scrivere qualcosa sul blog.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 fornire la possibilità di modificare una pagina in modo visuale.
Se ho capito bene quello che devi fare, editare una pagina html attraverso
il controllo TWebbrowser, puoi scaricarti il file MiniWebBrowserDemo.zip
che trovi su 
www.torry.net
 dove è contenuto un esempio, in versione beta,
di come editare una pagina HTML dal TWebbrowser.
Ciao.
Marco D.T.

 di come editare una pagina HTML dal TWebbrowser.
Grazie mille per la segnalazione! Appena ho un attimo, do un'occhiata 
per vedere se fa al caso mio.
Ciao e buon anno!


 il controllo TWebbrowser, puoi scaricarti il file [...]
Da quello che ho visto, l'unica operazione che è possibile fare è 
attivare la modalità "designMode", che è il primo passo di ciò che devo 
fare io e che ho già implementato, ma le funzionalità che voglio 
ottenere io sono quelle tipiche di un editor HTML basilare come, per 
esempio, l'editor di Outlook per le email in questo formato.
In sostanza, devo riprodurre barre degli strumenti, azioni e 
funzionalità specifiche all'interno del controllo.
Continuerò a ricercare... ;-)


   Marco.
Andrea

 export ad HTML?
Perchè non ero al corrente di questa possibilità. ;-)
Devo verificare come si comporta il componente per quanto riguarda 
l'integrazione di immagini, dato che l'editing mi serve per la creazione 
di email in formato HTML.
Ciao e buon anno! :-)


Dall'IE 5.5 mi sembra siano state rese disponibili dalla MS delle risorse 
per creare un editor HTML con capacita'  wysiwyg.
Infatti c'e' un proliferare inn rete di tali editor, gratuiti e non, 
naturalmente IE5.5 dipendenti.
Un progetto che vidi su SouceForghe lo trovi al 
http://sourceforge.net/projects/aynhtml
 credo pero concepito in altro modo.
Ciao Giorgio