AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Website aus Resourcedll....ohne IE !
Tutorial durchsuchen
Ansicht
Themen-Optionen

Website aus Resourcedll....ohne IE !

Ein Tutorial von Ghostwalker · begonnen am 21. Okt 2003 · letzter Beitrag vom 27. Nov 2003
Antwort Antwort
Ghostwalker
Registriert seit: 16. Jun 2003
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..
Angehängte Dateien
Dateityp: zip htmlresdemo2.zip (390,6 KB, 36x aufgerufen)
e=mc² or energy = milk * coffee²
 
Assarbad
 
#2
  Alt 27. Nov 2003, 13:39
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
  Mit Zitat antworten Zitat
Benutzerbild von Uncle Cracker
Uncle Cracker
 
#3
  Alt 27. Nov 2003, 13:45
Und wie kann man das dan machen?

Danke UC
  Mit Zitat antworten Zitat
Assarbad
 
#4
  Alt 27. Nov 2003, 16:25
Schau in den Code meiner AgreementGINA, da ist alles drin.

http://assarbad.net/stuff/!export/agreementgina.rar
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 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