Delphi - A LocateFileService komponens egy lehetséges felhasználása

WebSnap 9. rész

forráskód letöltése
Ebben a példában egy olyan webes alkalmazást készítünk, melyhez nem tartoznak külön HTML fájlok, hanem azokat maga az EXE tartalmazza. A megoldáshoz a LocateFileService komponenst használjuk fel.
Először is a szokásos módon hozzunk létre egy új Web App Debugger executable alkalmazást. A CoClass mezőben adjuk meg a Step09 nevet, a project neve pedig legyen Project9.
A PageProducerPage1-ben helyezzünk el egy LocateFileService komponenst is a szokásos 5 komponens mellé. Ennek a komponensnek az OnFindStream eseményét használjuk fel a feladat megoldására. Előbb azonban még szükség van néhány előkészületre.
Szükségünk lesz egy TTemplateResources típusú objektumra, aminek a deklarációja a TemplateResItems unit-ban található. Ez a unit nem a Delphi része, hanem a Demos\WebSnap\Util könyvtárban találhatjuk meg. Adjuk hozzá ezt a unit-ot a projecthez (Shift+F11). Ezután már hivatkozhatunk rá a unit2-ben (Alt+F11). Ha ez megtörtént, akkor a unit2 implementációs részében deklarálunk egy globális objektumot TemplateResources névvel.
var
  TemplateResources: TTemplateResources;
Az objektumot a unit initialization részében létre is hozzuk, a finalization részben pedig megszüntetjük.
initialization
  TemplateResources:=TTemplateResources.Create(HInstance);
  ...
finalization
  TemplateResources.Free;
Ezt az objektumot a LocateFileService komponens OnFindStream eseményénél használjuk fel. A TemplateResItems unit-ban található egy TemplateFileStreamFromResource nevű függvény, amely az előbb létrehozott TemplateResource objektumon keresztül éri el az erőforrásként tárolt HTML oldalakat.
Az OnFindStream esemény mindössze egy sorból áll, ami a következőképpen néz ki:
AHandled:=TemplateFileStreamFromResource(TemplateResources, AFileName, AFoundStream, AOwned);
Eddig rendben is volnánk, viszont még nem vagyunk készen teljesen. Hozzunk létre két HTML fájlt. Az egyik az oldal felső (top.html), a másik pedig az alsó részének kódját, és a szükséges script-eket tartalmazza (bottom.html). A két rész között kerül megjelenítésre az adott oldal tartalma. Így nagyban leegyszerűsíthetjük az egyes oldalakhoz tartozó HTML fájlokat. Nézzünk erre egy példát.
Hozzunk létre egy új WebSnap Page Module-t, majd mentsük el unit3 néven. A létrejött unit3.html fájl teljes tartalmát töröljük, és adjuk meg a következő sorokat:
<!-- #include file="top.html" -->
<p>Második oldal.</p>
<!-- #include file="bottom.html" -->
Hasonlóképpen hozzunk létre még két WebSnap Page Module-t.
Ha megvan az összes oldalunk, akkor valahogyan el kell érnünk, hogy a HTML fájlok erőforrásként beépüljenek az EXE fájlba. Ehhez létre kell hoznunk egy .rc kiterjesztésű fájlt, aminek tartalma a következő lesz:
#define HTML 23
unit2  HTML unit2.html
unit3  HTML unit3.html
unit4  HTML unit4.html
top    HTML top.html
bottom HTML bottom.html
Az első sorban definiálunk a HTML erőforrások kódjához (23) egy azonosítót. Ennek értéke azért 23, mert a TemplateFileStreamFromResource ilyen kóddal fogja keresni a HTML erőforrásokat (RT_HTML).
const
  RT_HTML = MakeIntResource(23);
A .rc fájl további soraiban a HTML fájlok felsorolása következik. Először egy nevet kell megadnunk, amivel a fájlt azonosítja az alkalmazásunkat. Ez minden esetben a HTML fájl neve legyen kiterjesztés nélkül. Ezután következik az erőforrás típusa, ami jelen esetben HTML (az első sorban megadott definíció alapján). Az azonosító után a fájl nevét kell megadni.
Ha megvan a fájl, mentsük el tetszőleges névvel, de .rc kiterjesztéssel, majd adjuk hozzá a project-hez (Shift+F11). Ha újrafordítjuk a programot, akkor a fájlok beépülnek az EXE fájlba, és ezután nem lesz szükség rájuk az alkalmazás futtatásához.
Próbáljuk ki az elkészült alkalmazást úgy, hogy az EXE fájlt egy külön könyvtárba másoljuk, majd onnan futtatjuk. Ezután a WebApp Debugger-ből nyissuk meg az alkalmazást, és látni fogjuk, hogy minden működik, annak ellenére, hogy egyetlen HTML fájl sincs az alkalmazás mellé telepítve.

WebSnap paletta cikksorozat