Moinmoin,
so, nachdem ich mich mit dem Tutorial von Wormid befaßt hab, dacht ich mir, es wär schön das ganze ohne Browserabhängigkeit zu machen. Zum einen müßte man immer prüfen ob der IE installiert ist, zum zweiten wärs natürlich schlecht für die Komponentenentwicklung. Rausgekommen ist dabei diese kleine Tutorial/Demo.
Voraussetzungen / Was ist anders.
Okok..auch ich hab ne Voraussetzung. Um das Demoprojekt zu kompilieren braucht man die Lite-Komponente THtmlLite (für Nullinger zu haben bei
www.pbear.com).
Desweiteren können (solange man die Lite-Variante verwendet wird) keine CSS-Dateien verwendet werden. Diese werden von der Komponente erst in der Profi-Version verarbeitet.
Da ich keine Dateinamen als Resourcenamen verwende, können die RES-Dateien auch problemlos mit
dem Borland-Resourcecompiler gemacht werden.
1. Schritt: Die Website
Hier ist schon mal etwas Vorausplanung notwendig. Im Gegensatz zur Methode von Wormid werden statt
der Bilder (bzw. Verweis auf die Bilder) der Resourcename verwendet. Das sieht also wie folgt aus:
Code:
Wormid-Methode:
[img]images/logo.gif[/img]
Meine Methode:
[img]einlogo[/img]
oder
Wormid-Methode:
<Body Background="images/backround.gif">
Meine Methode:
<Body Background="bkg">
Das hat natürlich den Nachteil das man die Seite im normalen Browser erstmal nicht angugen kann.
2. Schritt: Die Resource (incl. DLL)
Das Resourcescript sieht ganz ähnlich wie das von Wormid aus. Im Unterschied zu diesem werden hier
ganz normale Recourcenamen verwendet (ohne Sonderzeichen !):
Code:
main
HTML ..\website\index.htm
bkg IMAGES ..\website\background.jpg
rules IMAGES ..\website\dprules.gif
alogo IMAGES ..\website\logo.gif
Die könnt ihr nun ganz einfach mit "brcc32 resdemo.rc" in eine RES-Datei umwandeln.
Die dazugehörige
DLL sieht wie gehabt aus:
Code:
library resdemo;
{$R resdemo.res}
begin
end.
3. Schritt: Das Programm
Hier muß nun etwas gewerkelt werden. Ich erläuter das nun einfach anhand vom Quelltext.
3.1 Das Formular
Wir starten Delphi und erzeugen eine neue Anwendung (Form1 wird automatisch erzeugt).
Auf diese setzen wir nun eine HTMLLITE-Instanz und eine einfache Listbox.
3.2 Unabhängige Funktionen
Da man ja durchaus mehrere Websiten in eine
DLL packen kann, müssen wir natürlich erstmal feststellen, welche Seiten in der
DLL sind. Dafür brauchen wir folgende Routine:
Code:
//Ok...die Callback-Routine für die Auflistung der Verfügbaren
HTML-Seiten
function ResourcenameCallBack(Module:HModule;resTyp:Pchar;resname:Pchar;Param:Longint):boolean;stdcall;
begin
result := true;
form1.ListBox1.Items.Add(resname); //okokok...bööööse..
end;
3.3 DLL dynmik und Auflistung erzeugen
Hier hat mans nicht ganz so einfach. Das gesammte Handling für das Laden und Entladen muß man selbst
machen. Aber eigentlich nicht wirklich das Problem
Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
//Zuerstmal die
DLL laden
hDLL := LoadLibrary(PChar(ExtractFilePath(application.exename)+'resdemo.dll'));
if (hdll = 0) then
begin
ShowMessage('resdemo.dll konnte nicht geladen werden');
halt(0);
end;
//Schaun wir mal welche Seiten drinn sind
EnumResourceNames(hdll,'
HTML',@ResourcenameCallBack,0);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
//Was geladen wird muß auch wieder entladen werden !!!
if (hdll <> 0) then
freeLibrary(hdll);
end;
Für die Erklärung des
API-Aufruf "EnumResourceNames" gugst du
Win32.hlp
3.4 Wir laden eine Website
Ist eigentlich ganz einfach. Hier der Code dazu:
Code:
procedure TForm1.ListBox1Click(Sender: TObject);
var
SiteStream : TResourceStream;
begin
//Wir laden die angegebene Seite
SiteStream := TResourceStream.Create(hdll,Listbox1.Items[listbox1.itemindex],'
HTML');
htmllite1.LoadFromStream(SiteStream,'C:\');
SiteStream.Free;
end;
Als erstes wird ein Resourcestream für die Site-Resource erzeugt. Danach weißen wir
htmllite an den Seitenquelltext aus dem Stream zu laden. Das 'C:\' wird als Dummy angegeben. Normalerweise steht ihr die Basis-
Url für die Bilder,Styles usw. Da wird das auch "Zufuß" machen
müssen/können reicht hier einfach ein Dummy.
Da die Site geladen ist brauchen wir den Resourcestream nicht mehr und geben ihn frei.
3.5 und nu noch die Bildas
Hier hilft uns die Komponente weiter. Es gibt bei ihr ein Event, das wir befüllen um die Bilder aus der Resource-
dll zu laden. Gugst du code:
Code:
procedure TForm1.htmlLite1ImageRequest(Sender: TObject; const SRC: String;
var Stream: TMemoryStream);
var
imgres : TResourcestream;
begin
Stream := NIL;
//Ah..ein Image wird gebraucht schau mehr mal und laden es;
try
imgres := TResourcestream.create(hdll,ExtractFilename(src),'IMAGES');
except
//ohoh...da läuft was panne
on e:
exception do exit;
end;
if (stream = NIL) then
stream := TMemorystream.create;
stream.LoadFromStream(imgres);
imgres.Free;
end;
SRC gibt den im <IMG>-Tag angegeben Resourcenamen an. Wir erzeugen wieder einen Resourcestream und natürlich als den als Ergebnis benötigten TMemorystream (fals nicht schon erzeugt).
Danach holen wir die Resource und speichern diese im Memorystream. Den Resourcestream können wir wieder freigeben. Der Ergebnisstream wird von der Komponente freigegeben
4. Schritt: Das Ergebnis
Tja..Sieht genauso aus. Nur halt ohne einen Browser

)
Mit ein paar kleinen Änderungen sollte das ganze auch mit anderen
HTML-Komponenten funktionieren. Wichtige Kriterien:
HTML-Quelltext muß im Zugriff sein und für Inplace-Objecte (IMG usw.) muß ein Event vorhanden sein oder (wär auch denkbar) man kann sie manuell setzen
Ich hoff mal das euch das weiterhilft. Viel Spaß damit
P.S. In den Projekten müßt ihr natürlich die Pfadangaben anpassen. Vergißt man gerne..