Comment modifier une page affichée dans un TWebBrowser ?
Bonjour,
J'ai besoin de modifier (convertir en XHTML en fait) une page affichée dans un WebBrowser. La conversion fonctionne bien (merci Tidy!) mais impossible de mettre à jour la page affichée. Apparemment, on ne peut pas écrire dans un WebBrowser.Document.
Le mieux que j'aie réussi à faire jusqu'ici a été de faire une copie de la page affichée (avec IHTMLDocument2) et de modifier cette copie. Mais cela casse les liens du type href="..." ou src="..." qui font référence à une adresse relative à la page (les objets référencés sont normalement téléchargés avec la page dans les fichiers temporaires d'IE).
J'ai donc le choix : soit il y a une solution pour modifier le source d'une page affichée dans un WebBrowser à la volée (donc le fichier HTML présent dans les fichiers temporaires d'IE) soit je modifie ma copie du document en insérant l'URL du site là où il faut pour rétablir les références aux objets (galère et je ne suis pas sûr que ça fonctionne...)
Voici le code qui effectue la conversion sur la copie :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
procedure TFNavigateur.ItemCorrigerPageClick(Sender: TObject);
var
V, vDocument, vMIMEType, vHTML: OleVariant;
begin
//Arrêt du WebBrowser par sécurité...
WebBrowser1.Stop;
// On chope le document affiché
V:= WebBrowser1.Document;
//puis le script du document (comme en JavaScript...)
vDocument:= V.script.document;
// le type MIME qui va bien pour IE
vMIMEType:= 'text/html';
// Conversion du document avec Tidy
Tidy1.LoadConfigFile('\temp\tidyconfig'); //fichier de config pour tidy (Latin1...)
Tidy1.ParseString(V.body.parentElement.outerHTML);
vHTML:= Tidy1.XHTML;
// Réouverture du document pour écriture
vDocument.Open(vMIMEType);
//on vire ce qui est déjà dedans
vDocument.Clear;
//et on y met la page convertie en XHTML
vDocument.Write(vHTML);
//la fermeture du document permet l'affichage dans le WebBrowser
vDocument.Close;
end; |
Si quelqu'un a une solution pour réécrire sur le Document du WebBrowser je suis preneur!
Merci d'avance!
WebBrowser : URL Relaive via IMoniker
Salut,
Pour le coté pédagogique (et pour le fun) voici l'autre méthode pour charger un document dans un webbrowser avec la maitrise du path des éléments du document :
NB : TEmbeddedWB est utilisé mais c'est pareil avec TWebBrowser.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| Type
TMonikerSample = Class(TInterfacedObject,IMoniker)
public
// 2 méthodes implémentées Uniquement **
function BindToStorage(const bc: IBindCtx; const mkToLeft: IMoniker;
const iid: TIID; out vObj): HResult; stdcall; // **
function GetDisplayName(const bc: IBindCtx; const mkToLeft: IMoniker;
out pszDisplayName: POleStr): HResult; stdcall; // **
// Les autres methodes (des interfaces IStream,IPersist) ne sont pas implémentées elles renvoient E_NotImpl;
function BindToObject(const bc: IBindCtx; const mkToLeft: IMoniker;
const iidResult: TIID; out vResult): HResult; stdcall;
function Reduce(const bc: IBindCtx; dwReduceHowFar: Longint;
...
end;
implementation
uses UrlMon, // IMoniker
MSHtml;
function TMonikerSample.GetDisplayName(const bc: IBindCtx;
const mkToLeft: IMoniker; out pszDisplayName: POleStr): HResult;
begin
// Chemin relatif
pszDisplayName:=StringToOleStr('C:\Program Files\Borland\Delphi7\Projects\WbIMoniker\');
Result:=S_OK;
end;
function TMonikerSample.BindToStorage(const bc: IBindCtx;
const mkToLeft: IMoniker; const iid: TIID; out vObj): HResult;
Const
HTML_TEXT ='<IMG SRC="foo.jpg">'; // test
var
sl : TStringList;
sa: TStreamAdapter;
M: TMemoryStream;
pcb : Longint;
begin
sl:=TStringList.Create; // pour remplir le stream en 1 coup ...
sl.Text:=HTML_TEXT;
M:= TMemoryStream.Create;
sl.SaveToStream(M); // Stream init
M.Seek(0,0); // repositionnement dans le flux
sa:=TStreamAdapter.Create(M); // IStream
// Retour de IStream vers le Webbrowser
IStream(vObj):=(sa as IStream);
Result:=S_OK;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
apm : IPersistMoniker;
begin
if not Assigned(EmbeddedWB1.Document) then EmbeddedWB1.AssignDocument;
// Load via IMoniker perso implémenté dans TMonikerSample...
if ((EmbeddedWB1.Document as IPersistMoniker).Load(TRUE,(TMonikerSample.Create as IMOniker),nil,0)=S_OK)
then
begin
end;
end; |
enjoy
chaps
http://chapsandchips.chez.tiscali.fr