Bonjour à tous, j'espère avoir posté ma question sur le bon forum. je travaille sur une application écrite en delphi avec un composant "WebBrowser" basé sur IE, dans lequel nous injectons du code HTML généré à partir de XML et transformation XSL, avec des liens vers une feuille de style .css, et des images... Suite à de nombreux soucis (avec IE), j'ai découvert le moteur Gecko et une implémentation faite en Delphi basée sur XPCom. ça commence à fonctionner, mais la seule chose qui m'embête c'est que j'ai perdu la mise en page de ma feuille de style, et que mes images ne sont pas affichées... ça ressemble à un problème de lien ?
Voici comment j'alimente le composant TGeckoBrowser avec en paramètre le code source du html :
voici à quoi ressemble le début de mon html avec le lien vers le css, et vers mes images :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 procedure TGeckoBrowser.LoadHTML(htmlcode: String); var wbchrome: nsIWebBrowserChrome; wb: nsIWebBrowser; domwindow: nsIDOMWindow; domdoc: nsIDOMDocument; domhtmldoc: nsIDOMHTMLDocument; nsstr: IInterfacedString; begin wbchrome := Self as nsIWebBrowserChrome; wbchrome.GetWebBrowser(wb); wb.GetContentDOMWindow(domwindow); domwindow.GetDocument(domdoc); domhtmldoc:= domdoc as nsIDOMHTMLDocument; nsstr:= NewString; nsstr.Assign(htmlcode); domhtmldoc.Write(nsstr.AString); end;
ce code fonctionnait sous IE... et le plus étrange, c'est que si je fais un TGeckoBrowser.LoadURI() avec en paramètre un fichier .html contenant le code html, cela fonctionne parfaitement. LoadURI ressemble à ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <html> <head> <META http-equiv="Content-Type" content="text/html; charset=UTF-16"> <title>Marque</title> <base href="file://E:/Projets/Delphi/PaletteInfo.Essai/htdocs/"> <link rel="stylesheet" href="styles.css" type="text/css"> </head> <body> <table border="0" width="100%"> <tr class="marque"> <th colspan="2" class="marque">PL</th> </tr> <tr class="marque"> <td width="20%" class="marque">Immatric :</td> <td class="marqueValue">1665 ZK 14</td> </tr> <tr class="marque"> <td width="20%" class="marque">Numero :</td> <td class="marqueValue">0656</td> </tr> <tr class="marque"> <td width="20%" class="marque">Telephone !! :</td> <td class="marqueValue">+33679609649</td> </tr> <tr class="marque"> <td width="20%" class="marque">Etat :</td> <td class="marqueValue" style="background-color: #E4E9FF;"> <img src="img/repos.png">-Repos</td> </tr> .... ]
Ce qui m'embête dans ce dernier cas, c'est d'écrire un fichier html sur le disque à chaque fois, j'aurais préféré alimenté dynamiquement comme dans la première méthode LoadHTML...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 procedure TGeckoBrowser.LoadURI(uri: WideString; loadFlags: Cardinal; referer: String; postData: String; headers: String); var webNavigation: nsIWebNavigation; refererURI: nsIURI; postPtr, headPtr: Pointer; postLen, headLen: Longword; postStream, headStream: nsIInputStream; dataStream:nsIStringInputStream; mimeStream:nsIMIMEInputStream; begin if not Supports(FWebBrowser, nsIWebNavigation, webNavigation) then Exit; if Length(referer)>0 then begin NS_NewURI(refererURI,referer); end; postLen := Length(postData); if postLen>0 then begin NS_CreateInstance('@mozilla.org/io/string-input stream;1',nsIStringInputStream,dataStream); dataStream.SetData(PChar(postData),postLen); NS_CreateInstance('@mozilla.org/network/mime-input-stream;1',nsIMIMEInputStream,mimeStream ); mimeStream.AddHeader(PChar('Content-Type'),PChar('application/x-www-form-urlencoded')); mimeStream.SetAddContentLength(true); mimeStream.SetData(dataStream); mimeStream.QueryInterface(nsIInputStream,postStream); end; headLen := Length(headers); if headLen>0 then begin headPtr := nsMemory.Alloc(headLen); if Assigned(headPtr) then begin NS_MEMCPY(headPtr, PChar(headers), headLen); NS_NewByteArrayInputStream(headStream, headPtr, headLen); end; end; webNavigation.LoadURI(PWideChar(uri), loadFlags, refererURI, postStream, headStream); end;
quelqu'un pourrait il m'aider ?
je suis very newbee sur XPCom...
Merci pour toute aide. Christophe
Partager