|
|
Internetes naptár készítése Delphi-vel
Naptár 2. rész
|
|
Példaprogram letöltése
9173 bájt
|
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;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2000 évkönyv 440. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|