Ik heb een kalender in PHP gemaakt, met Interbase, dus een kant en klare oplossing heb ik niet. Maar ik kan je wel wat hints geven.
Mijn kalender is zoals jij het ook wilt een maandkalender in een grid, met horizontaal de dagen zondag t/m zaterdag en verticaal de weken met een weeknummer. De eerste paar cellen linksboven en de laatste paar cellen rechtsonder kunnen leeg zijn, afhankelijk van de weekdag waar die maand mee begint. De overige cellen bevatten het dagnummer en in mijn geval verjaardagen en gebeurtenissen. Ik heb hem afgekeken van de Microsoft Communities.
Functies die je nodig hebt:
Code:
function MaandDagen(Maand, Jaar: Integer): Integer;
// geeft aantal dagen in de opgegeven maand terug.
begin
if Maand = 12 then
Result := EncodeDate(1,1,Jaar+1) - EncodeDate(1,Maand,Jaar)
else
Result := EncodeDate(1,Maand+1,Jaar) - EncodeDate(1,Maand,Jaar);
end;
function IndexToDagnummer(Index, Maand, Jaar: Integer): Integer;
// zet de index om in een dagnummer, of -1 als voor begin of na eind vd maand
begin
Result := DayOfWeek(EncodeDate(1,Maand,Jaar)) - Index + 1;
if (Result < 1) or (Result > MaandDagen(Maand,Jaar)) then
Result := -1;
end;
Algoritme:
1) bepaal hoeveel regels je voor de maand nodig hebt. Dat zijn er meestal 5, maar als de maand 28 dagen heeft en met zondag begint, dan 4 regels, en als de maand 30 dagen heeft en met een zaterdag begint of als de maand 31 dagen heeft en met een vrijdag of zeterdage begint, dan 6 regels. Gebruik de functie MaandDagen om het aantal dagen in een maand te bepalen.
2) begin een loop: for index := 1 to aantal_regels * 7 do
2.1) bepaal de huidige dag afhankelijk van index. Gebruik hiervoor functie IndexToDagnummer.
2.2) Als IndexToDagnummer -1 terug geeft, een lege cel in het grid toevoegen. Anders een grid toevoegen waar je het dagnummer in zet, met de rest wat je daar in wilt zetten.
Met dit algoritme moet je toch een eind komen denk ik.
Succes
Marco Hemmes
Bookmarks