Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Website aus Resourcedll....ohne IE ! (https://www.delphipraxis.net/10559-website-aus-resourcedll-ohne-ie.html)

Ghostwalker 21. Okt 2003 09:06


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 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 :mrgreen:

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 :mrgreen:

P.S. In den Projekten müßt ihr natürlich die Pfadangaben anpassen. Vergißt man gerne.. :mrgreen:

Assarbad 27. Nov 2003 13:39

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 ;)

Uncle Cracker 27. Nov 2003 13:45

Re: Website aus Resourcedll....ohne IE !
 
Und wie kann man das dan machen?

:love: Danke UC

Assarbad 27. Nov 2003 16:25

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 07:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz