![]() |
Website aus Resourcedll....ohne IE !
Liste der Anhänge anzeigen (Anzahl: 1)
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 ![]() 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:
Das hat natürlich den Nachteil das man die Seite im normalen Browser erstmal nicht angugen kann.
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"> 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:
Die könnt ihr nun ganz einfach mit "brcc32 resdemo.rc" in eine RES-Datei umwandeln.
main HTML ..\website\index.htm
bkg IMAGES ..\website\background.jpg rules IMAGES ..\website\dprules.gif alogo IMAGES ..\website\logo.gif Die dazugehörige DLL sieht wie gehabt aus:
Code:
3. Schritt: Das Programm
library resdemo;
{$R resdemo.res} begin end. 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:
3.3 DLL dynmik und Auflistung erzeugen
//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; 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:
Für die Erklärung des API-Aufruf "EnumResourceNames" gugst du Win32.hlp :mrgreen:
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; 3.4 Wir laden eine Website Ist eigentlich ganz einfach. Hier der Code dazu:
Code:
Als erstes wird ein Resourcestream für die Site-Resource erzeugt. Danach weißen wir
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; 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:
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).
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; 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 :mrgreen: P.S. In den Projekten müßt ihr natürlich die Pfadangaben anpassen. Vergißt man gerne.. :mrgreen: |
Re: Website aus Resourcedll....ohne IE !
Das geht auch kleiner. Man nehme einfach die MSHTML.DLL und einige der implementierten Interfaces und benutze diese. Funzt auch nonVCL und ist nicht so dick ;)
|
Re: Website aus Resourcedll....ohne IE !
Und wie kann man das dan machen?
:love: Danke UC |
Re: Website aus Resourcedll....ohne IE !
Schau in den Code meiner AgreementGINA, da ist alles drin.
http://assarbad.net/stuff/!export/agreementgina.rar |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz