Delphi - Internetes naptár készítése Delphi-vel

Naptár 2. rész

forráskód letöltése
A naptár készítésének mostani részében megvalósítjuk azt, hogy táblázatos formában megjelenjenek az aktuális hónap napjai. Az első oszlopba kerülnek a hétfőhöz tartozó napok, a másodikba jön a kedd és így tovább. A mellékelt példa kipróbálása előtt az alábbi teendők szükségesek:
  • A sorozat első részében mellékelt adatbázisok alkönyvtárára létre kell hozni egy BDE alias-t, ASWEBCALENDAR névvel.
  • A Main.pas-ban található HTMDIR konstansnál adja meg azt az elérési útvonalat, ahová a mellékelt példa HTM alkönyvtárát helyezte.
  • Ezek után fordítsa le a programot (Project - Build)
  • A létrejött EXE-t másolja át web szerverének azon könyvtárába, ahonnan van joga futtatni internetes alkalmazásokat (Pl.: C:\InetPub\Scripts\)
  • Indítson el egy böngészőt és írja be a következő címet: http://szervernev/scripts/webcalendar02.exe, persze a szervernev mindenkinél más és más lehet.


A naptár megjelenítése a következőképpen történik: amikor a webcalendar02.exe aktivizálva lesz egy böngészőn keresztül, akkor fut le a WebModule egyetlen, alapértelmezett akciója.
Itt nem teszünk mást, mint a mellékelt Main.htm állományt átadjuk egy TPageProducer komponensnek, mely feldolgozza azt, és az eredményt küldjük vissza a kliensnek.
procedure TWebModule1.WebModule1WebActionItem1Action
  (Sender: TObject; Request: TWebRequest; 
  Response: TWebResponse; var Handled: Boolean);
begin
  FDate:=Now;
  PageProducer1.HTMLFile:=HTMDIR+'Main.htm';
  Response.Content:=PageProducer1.Content;
end;
A feldolgozás közben létrejön a TPageProducer komponens OnHTMLTag eseménye, mivel a Main.htm-be különböző címkéket helyeztünk el, melyeket most ki kell cserélni valós tartalomra.

A date címke esetén az aktuális dátumot adjuk vissza év, hónap, nap formájában.

A calendar címke esetén pedig legeneráljuk azt a táblázatot, mely magát a naptárat fogja képviselni. A táblázat minden egyes celláját a Cell.htm tartalmazza. Egy kettős ciklus segítségével egy 7 x 7-es táblázatot hozunk létre és minden cellánál a Cell.htm-et helyezzük el a PageProducer2 komponens segítségével.

Mivel a Cell.htm is tartalmaz címkéket, így a PageProducer2 komponensnél is kapunk OnHTMLTag eseményt. Itt kell behelyettesítenünk az aktuális cella tartalmát.

A táblázat első sorába a hét napjainak neve kerül. A további sorokba pedig a napok sorszáma. Itt viszont kissé bonyolódik a helyzet, ugyanis minden hónap elseje valószínűleg másik napra esik. A táblázatban mindenképpen tartani kell a hétfő, kedd, szerda, stb. sorrendet, így már csak a napok számának eltolása jöhet számításba. Ehhez viszont tudnunk kell, hogy egy adott hónapnál az első nap milyen napra esik, így mennyi az eltolás mértéke. A táblázat végén arra az információra is szükségünk lesz, hogy hány napos egy hónap.

Mielőtt a fent említett kettős ciklus segítségével létrehoznánk a táblázatot, először ezeket az információkat kell meghatároznunk. A hónap elején szükséges eltolás mértékét az FN globális változóba tároljuk el, míg az adott hónap napjainak számát az FE változóba.
Az értékadáshoz két függvényt is létrehozunk: StartDayOfDate és DaysPerMonth névvel.

A StartDayOfDate a következőképpen működik:

Paraméterként át kell adnunk azt a dátumot, amelynek hónapját szeretnénk megjeleníteni a táblázatban.

Az eltoláshoz szükséges tudnunk azt a dátumot, amely az adott hónap első napja. Mivel a paraméterként kapott dátum bármilyen napra mutathat, így először a DecodeDate-el felbontjuk az évre, hónapra és napra. Ezek után az EncodeDate segítségével létrehozunk egy új dátumot az előbb kapott évvel és hónappal, de most már az első nappal. A DayOfWeek-el rögtön meg is határozzuk az adott hónap elsejének a napját. Mivel ez a függvény egyet ad vissza vasárnap esetén, kettőt hétfőnél, hármat szerdánál, stb., így ezt figyelembe véve kell kialakítanunk a visszaadandó értéket, mely úgy fog kinézni, hogy a 0 jelenti a hétfőt, az 1 a keddet, a 2 a szerdát, stb.
function TWebModule1.StartDayOfDate(date: TDateTime): integer;
var
  year, month, day: WORD;
begin
  DecodeDate(date, year, month, day);
  result:=DayOfWeek(EncodeDate(year, month, 1));
  if result=1 then begin
    result:=6;
  end else begin
    dec(result, 2);
  end;
end;
Azt hogy hány nap van az adott hónapban a DaysPerMonth függvény adja meg. Paraméterként itt is egy tetszőleges dátumot adhatunk meg, melyből csak az év és a hónap lesz figyelembe véve. Visszatérési értékként kapjuk meg az adott hónap napjainak számát. A függvény figyel a szökőévre is.
function TWebModule1.DaysPerMonth(date: TDateTime): integer;
const
  DaysInMonth: array[1..12] of integer=
      (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var
  year, month, day: WORD;
begin
  DecodeDate(date, year, month, day);
  result:=DaysInMonth[month];
  if (month=2) and IsLeapYear(year) then begin
    inc(result);
  end;
end;
Ha tehát ismerjük e két fenti számot és tudjuk azt, hogy a cellának hányadik sorában és hányadik oszlopában vagyunk, akkor az alábbi módon meghatározhatjuk, hogy a cellába kell-e írnunk számot és ha igen, akkor melyik is lesz az a nap.
procedure TWebModule1.PageProducer2HTMLTag
     (Sender: TObject; Tag: TTag; const TagString: String; 
     TagParams: TStrings; var ReplaceText: String);
  …
begin
  …
        d:=FY*7+FX-6-FN;
        if d in [1..FE] then begin
          ReplaceText:=IntToStr(d);
        end;
  …
end;

Naptár cikksorozat