home *** CD-ROM | disk | FTP | other *** search
- ╔════════════════════════════════════════════════════════════════════╗
- ║ ║
- ║ ██▀▀▀▀▀▀▀▌ ██ ██ ██ ██ ║
- ║ ██ ██ ██ ██ ██ ║
- ║ ██ ██ ██ ██ ██▄▄▄▄▄▄▄ ║
- ║ ██ ▀▀█ ██ ██ ██ ██ █ ║
- ║ ██ █ ██ ██ ██ ▐ ██ █ ║
- ║ ██████████ ██████████ ██████████ ██████████ ║
- ║ ║
- ║ ║
- ║ S O F T W A R E ║
- ║********************************************************************║
- ║* *║
- ║* K A L E N D E R - T O O L B O X *║
- ║* *║
- ║* VERSION 2.00 (c) 1989,91 G. Blumert *║
- ║********************************************************************║
- ╚════════════════════════════════════════════════════════════════════╝
-
- Gunnar Blumert Burg, im April 1991
- Hochdonner Chaussee 16
-
- 2224 Burg/Dithm.
-
-
- Bankverbindung: Postgiroamt Hamburg (BLZ 200 100 20)
- Konto - Nr. 3979 41-206
-
-
-
- 1. Was kann man mit der Kalender-Toolbox machen?
-
- Diese Toolbox deckt alles ab, was die Kalenderrechnung vom Programmierer
- verlangt, von der einfachen Wochentags-Berechnung bis hin zu komplexen
- Fenstern, die vielerlei Informationen darstellen.
- Dabei unterstützt die Toolbox nicht nur den heute üblichen gregorianischen
- Kalender, sondern auch den hebräischen, julianischen, moslemischen und den
- der französischen Revolution.
-
- Die Units sind nur verwendungsfähig unter Turbo-Pascal 6.0 und Turbo-
- Vision. Allerdings verwenden die eigentlichen Kalender-Units lediglich
- Kollektionen (anstelle von selbst konstruierten verketteten Listen) und
- die Funktion MemAlloc der Unit MEMORY. Besitzer der Version 5.5 können
- die entsprechenden Passagen des Quelltextes leicht ändern (MemAlloc durch
- GetMem ersetzen und Kollektionen selber basteln).
- Mit noch früheren Compilerversionen wird es allerdings schwierig, denn
- die Unit stützt sich voll auf die virtuellen Mechanismen, die es seit der
- Einführung objektorientierter Erweiterungen gibt.
-
-
- 2. Was ist auf der Diskette?
-
- KALDEF.TPU implementiert ein abstraktes Kalendarium
- F_KAL.TPU implementiert das Kalendarium d. franz. Rev.
- G_KAL.TPU implementiert den gregorianischen Kalender
- H_KAL.TPU implementiert den hebräischen Kalender
- J_KAL.TPU implementiert den julianischen Kalender
- M_KAL.TPU implementiert den moslemischen Kalender
-
- TABELLEN.TPU enthält Tabellen für Osterfest- und Mondphasenberechnung
- wird von KALDEF und G_KAL benötigt
-
- F_KAL.GK3 Definitionsdatei für den fr. Kal.
- G_BRDKAL.GK3 " für den greg. Kal.
- H_KAL.GK3 " für den heb. Kal.
- J_KAL.GK3 " für den jul. Kal.
- M_KAL.GK3 " für den mosl. Kal. (astronomisch)
- M_KAL2.GK3 " für den mosl. Kal. (nicht astronomisch)
-
- MAKEFKAL.PAS erstellt F_KAL.GK3
- MBRDKAL.PAS erstellt G_BRDKAL.GK3
- MAKEHKAL.PAS erstellt H_KAL.GK3
- MAKEJKAL.PAS erstellt J_KAL.GK3
- MAKEMKAL.PAS erstellt M_KAL.GK3
- MMKAL2.PAS erstellt M_KAL2.GK3
-
- KALDEMO.EXE Turbo-Vision - Demonstrationsprogramm für die Kalendarien
- KALDEMO.PAS
-
- KALWIN.TPU Enthält die View-Objekte des Demonstrationsprogramms
-
- KALLIST.TPU Enthält eine Liste zur Aufnahme von Kalendarien - wird von
- KALDEMO benötigt
-
- KALDOS.TPU Enthält Routinen, die man in jedem Programm brauchen kann;
- KALDOS.PAS wird von KALDEMO benötigt.
-
- KALCOMS.TPU Enthält einige Konstantendeklarationen, z. B. die Kommandos
- KALCOMS.PAS für die HandleEvent-Messages
-
- Die nicht aufgeführten Quelltexte erhalten nur Anwender, die sich bei mir
- haben registrieren lassen. Der Preis beträgt DM 188,-- .
- Die Shareware-Versionen enthalten stattdessen Dateien mit der Extension .INT
- (für IINTERFACE), in denen der Interface-Teil der Units dokumentiert ist.
-
-
- 3. Wie funktioniert das?
-
- Sie können diese Tollbox in drei Stufen nutzen: nur die Algorithmen, zusätz-
- lich die Berechnung der Feiertage, schließlich komplette View-Objekte, die
- Sie direkt in ein Turbo-Vision-Programm einbinden können.
-
- Zunächst drucken Sie sich bitte den INTERFACE-Teil der Unit KALDEF.PAS aus
- (bzw. die Datei KALDEF.INT), um einen Überblick über die Funktionen zu er-
- halten.
-
- KALDEF implementiert ein Objekt KALENDARIUM, das allerdings noch viele
- abstrakte Methoden enthält.
- Allerdings können Sie alle Funktionen auf ein beliebiges Kalendarium anwen-
- den, wenn Sie ein Kalendarieum aus den *_KAL.TPU - Dateien initialisiert
- haben.
- Dies erledigen Sie am einfachsten über einen Aufruf des INIT-Konstruktors.
- Dabei werden allerdings die Listen, die Wochentags-, Monats- und Feiertags-
- namen sowie deren Zuordnung enthält, nicht initialisiert.
- Sie können zwar alle Algorithmen benutzen; die Funktionen, die Feiertage be-
- stimmen, werden jedoch jeden Tag für einen Werktag halten.
-
- Die Informationen über Feiertage etc. sind in .GK3 Dateien enthalten.
- Deren Aufbau ist aus den MAKE*KAL - Programmen ersichtlich.
-
- Um eine solche Datei zu laden und mit einem Kalendarium zu verknüpfen,
- müssen Sie den Konstruktor LOAD aufrufen, der als Parameter den Datei-
- namen erwartet.
- Danach stehen Ihnen alle Funktionen uneingeschränkt zur Verfügung mit einer
- Ausnahme: Die Funktion Goldene_Zahl steht nur im gregorianischen und im
- julianischen Kalender zur Verfügung! In den anderen ist sie wenig sinnvoll,
- denke ich, wer will, kann sie ja selbst "nachrüsten".
-
- Schließlich gibt es noch drei View-Objekte, die sich in der Unit KALWIN
- befinden.
- Deren Verwendung entnehmen Sie dem Programm KALDEMO.PAS, das im Quelltext
- beiliegt.
-
-
- 4. Die Feiertage
-
- Die Feiertage werden in folgendermaßen in den .GK3-Dateien gespeichert:
- Zunächst werden die Namen aufgeführt, darauf folgen, in der gleichen
- Reihenfolge, die Tabellen, die die Lage des Feiertages im Jahr beschrei-
- ben.
- Dises Tabellen sind folgendermaßen definiert:
-
- Feiertagstabelle = RECORD
- beachten : BOOLEAN;
- JMin, JMax : INTEGER;
- CASE Art: CHAR OF
- 'A','O': (Differenz: INTEGER);
- 'W': (T_min, Dummy: WORD; Wochentagnummer: BYTE);
- 'D': (Tagnummer: WORD);
- 'S': (Nummer: INTEGER)
-
- Die Variable BEACHTEN kann in Ihren eigenen Programmen von Nutzen sein,
- wenn Sie z. B. den Rosenmontag zwar als Feiertag anzeigen wollen, der Tag
- aber trotzdem als normaler Werktag gelten soll.
- In diesem Fall setzen Sie BEACHTEN auf FALSE.
-
- JMin und JMax geben den Zeitraum an, in dem der Feiertag angezeigt werden
- soll.
- Soll die Anzeige nach oben oder unten unbegenzt erfolgen, geben Sie für
- den entsprechenden Wert eine 0 an.
-
- Wie Sie wissen, gibt es unterschiedliche Arten von Feiertagen, nämlich
- feste und bewegliche.
- Diese Festlegung treffen Sie im varianten Teil des RECORDS.
-
- 'A' steht für Abhängigkeit vom 1. Advent, O für Ostersonntag.
- Mit Differenz geben Sie den Abstand vom 1. Advent/Ostersonntag an. Dieser
- kann auch negativ sein (z. B. -2 für Karfreitag).
- Wenn Sie den Abstand so groß wählen, daß das Datum in ein anderes Jahr
- fallen würde, haben Sie allerdings Pech gehabt: der Feiertag wird dann
- nicht mehr angezeigt.
-
- 'W' steht für einen Feiertag, der auf das erste Auftreten eines Wochentages
- ab dem durch T_min bezeichneten Tag des Jahres. Dabei ist als T_min die
- laufende Nummer des Tages in nicht-Schaltjahren anzugeben.
- Die Wochentagnummer entspricht den von der Funktion Ermittle_Wochentagnummer
- zurückgegebenen Werten: 0 = Montag, ...
- Ein Beispiel: für den Muttertag (zweiter Sonntag im Mai) wäre anzugeben
- T_min = 128 und Wochentagnummer = 6.
- Aus "historischen" Gründen gibt es noch das Dummy-Feld, in dem früher
- einmal T_max abgelegt werden mußte.
- Der Wert des Dummy-Feldes ist nunmehr gleichgültig und steht zu Ihrer
- Verfügung.
-
- 'D' bezeichnet Feiertage, die stets auf das gleiche Datum fallen. Die Tag-
- nummer ist so zu ermittlen wie T_min für die Ar 'W'.
- In den Kalendarien mit der Kennung F, H oder M wird für diese Art der je-
- weilige Kennbuchstabe verwendet.
- Die Art 'D' hat dort eine besondere Bedeutung, und zwar wird damit ein
- Datum nach christlicher Chronologie bezeichnet. Dazu wird der gregoriani-
- sche Kalender verwendet, falls er gültig ist, anderenfalls der julianische.
- Sie können so z. B. im hebräischen Kalender auch das christliche Weih-
- nachtsfest beobachten.
-
- 'S' bezeichnet den Schalttag in Schaltjahren.
- Da der hebräische Kalender einen ganzen Schaltmonat einschiebt, können
- Sie in dem Fall die Nummer des Tages im Schaltmonat in das Feld NUMMER
- eintragen.
- In allen anderen Kalendarien wird das Feld NUMMER ignoriert.
-
-
- 5. Die einzelnen Routinen
-
- CONSTRUCTOR Load(Name: pathstr);
- Lädt die angegebene Kalenderdefinitionsdatei und initialisiert das
- Objekt.
-
- CONSTRUCTOR INIT;
- Initialisiert das Objekt, ohne Feiertagstabellen zu initialisieren.
-
- DESTRUCTOR DONE; VIRTUAL;
- Räumt den Heap wieder auf und sollte immer aufgerufen werden, wenn
- ein Objekt nicht mehr benötigt wird. Auch dann, wenn Sie selber keine
- dynamischen Datenstrukturen erzeugen - die Kalendarien tun dies!
- Zuvor wird das Feld "Changed" überprüft, und, wenn TRUE, die Prozedur
- Store aufgerufen.
- Sofern Sie dem Anwender das Ändern der Kalendarien erlauben, sollten Sie
- die Prozedur Store besser vorher aufrufen, denn ein Destruktoraufruf
- kann nicht rückgängig gemacht werden, wenn etwa ein Schreibfehler aufge-
- treten ist.
-
- PROCEDURE Store;
- Schreibt das Kalendarium wieder zurück auf die Platte. Diese Funktion
- wird nur benötigt, wenn Sie dem Anwender erlauben, die Kalendarien zu
- ändern.
-
- PROCEDURE InitDate; VIRTUAL;
- Setzt das interne Datum des Kalendariums auf das aktuelle Rechnerdatum,
- sofern dieses für das Kalendarium gültig ist. Anderenfalls wird der An-
- fang des Gültigkeitsbereiches eingestellt.
-
- FUNCTION Valid: BOOLEAN; VIRTUAL;
- Gibt TRUE zurück, wenn bei der Initialisierung kein Fehler auftrat und
- sollte vor der Benutzung des Objekts stets abgefragt werden.
-
- PROCEDURE KGetDate(VAR t,m,j: INTEGER);
- Ermittelt das interne Datum des Kalendariums.
-
- PROCEDURE KSetDate(t,m,j: INTEGER);
- Setzt das interne Datum des Kalenders neu.
-
- FUNCTION Date_JD(t,m,j: INTEGER): LongInt; VIRTUAL;
- Rechnet Tag, Monat, Jahr in julianische Tagnummer (JD) um.
-
- PROCEDURE JD_Date(jd: LongInt; VAR t,m,j: INTEGER); VIRTUAL;
- Rechnet julianische Tagnummer in Tag, Monat, Jahr um.
-
- FUNCTION MakeJD(nr, j: INTEGER): LongInt;
- Ermittlet aus laufender Nummer des Tages im Jahr und Jahreszahl die
- julianische Tagnummer.
-
- FUNCTION FirstJ: INTEGER; VIRTUAL;
-
- FUNCTION LastJ : INTEGER; VIRTUAL;
- Gibt letztes Jahr der Gültigkeit des Kalendariums zurück.
-
- FUNCTION FirstJD:LongInt; VIRTUAL;
- Gibt ersten julianischen Tag (JD) der Gültigkeit zurück.
-
- FUNCTION LastJD: LongInt; VIRTUAL;
- Gibt letzten julianischen Tag (JD) der Gültigkeit zurück.
-
- FUNCTION Check_Date(t,m,j: INTEGER):BOOLEAN;
- Gibt TRUE zurück, wenn Datum innerhalb der Gültigkeit.
-
- FUNCTION Check_Day(t,m,j: INTEGER): BOOLEAN;
- TRUE, wenn Tag gültig. Geht davon aus, das Monat und Jahr gültig sind!
-
- FUNCTION Check_Month(m,j: INTEGER): BOOLEAN;
- TRUE, wenn Monat gültig. Geht davon aus, das Jahr gültig ist.
-
- FUNCTION Check_Year(j: INTEGER): BOOLEAN; VIRTUAL;
- TRUE, wenn Jahr innerhalb der Gültigkeit.
-
- FUNCTION Check_JD(jd: LongInt): BOOLEAN;
- TRUE, wenn jul. Tagnummer (JD) gültig.
-
- Die folgenden Funktionen dienen zum weiterzählen von Kalenderdaten. Sie
- geben TRUE zurück, wenn das neue Datum im Gültigkeitsbereich ist.
-
- FUNCTION Inc_Tag(VAR t,m,j: INTEGER): BOOLEAN;
- FUNCTION Dec_Tag(VAR t,m,j: INTEGER): BOOLEAN;
- Zählt einen Tag vor/zurück.
-
- FUNCTION Inc_Monat(VAR m,j: INTEGER): BOOLEAN;
- FUNCTION Dec_Monat(VAR m,j: INTEGER): BOOLEAN;
- Zählt einen Monat vor/zurück
-
- FUNCTION Inc_Jahr(count: INTEGER; VAR j: INTEGER): BOOLEAN; VIRTUAL;
- Zählt Count Jahre vor bzw. zurück, wenn Count < 0.
-
- FUNCTION Anz_Tage(m,j: INTEGER): BYTE; VIRTUAL;
- Gibt die Azahl der Tage des angegebenen Monats zurück.
-
- FUNCTION Anz_Monate(j: INTEGER): BYTE; VIRTUAL;
- Gibt die Anzahl der Monate im Jahr J zurück.
-
- FUNCTION Monatname(m,j: INTEGER): STRING; VIRTUAL;
- Gibt den Namen des Monats als STRING zurück, allerdings nur, wenn
- das Kalendarium über LOAD initialisiert wurde. Anderenfalls erhalten
- Sie einen Leerstring.
-
- FUNCTION Julian_Year(jd: LongInt): INTEGER;
- Ermittelt aus der jul. Tagnummer (JD) die Nummer des jul. Jahres.
-
- FUNCTION Schaltjahr(j: INTEGER): BOOLEAN; VIRTUAL;
- Gibt in Schaltjahren TRUE zurück.
-
- FUNCTION Ermittle_Wochentagnummer(t,m,j: INTEGER): BYTE; VIRTUAL;
- 0 = Montag
-
- FUNCTION RoemerZinsZahl(jj: INTEGER): BYTE;
- Ermittelt die Indiktionszahl. JJ ist eine julianische Jahreszahl!
-
- FUNCTION GOLDENE_ZAHL(j: INTEGER): BYTE; VIRTUAL;
- Gibt die goldene Zahl für das Jahr J zurück. Ist nur für gregorianische
- und julianische Kalendarien implementiert.
-
- FUNCTION TAG_IM_JAHR(t,m,j: INTEGER): INTEGER; VIRTUAL;
- Ermittelt die laufende Nummer des Tages im Jahr.
-
- PROCEDURE ERMITTLE_DATUM(nr: INTEGER; VAR t,m: INTEGER; j: INTEGER); VIRTUAL;
- Eingabe: laufende Nummer des Tages und Jahr - Ausgabe: Tag und Monat.
-
- FUNCTION KAL_WO(t,m,j: INTEGER): BYTE; VIRTUAL;
- Ermittelt aus dem Datum die Nummer der dazugehörigen Kalenderwoche.
- Diese Funktion geht in der Regel davon aus, daß die Woche, in die
- der erste Tag mit der Nummer 0 (Montag) fällt, die erste Kalenderwoche
- ist.
- Eine Funktion nach DIN 1355 ist in G_Kal.PAS implementiert.
-
- FUNCTION OSTERN(j: INTEGER): INTEGER; VIRTUAL;
- Ermittelt die laufende Tagnummer von Ostersonntag.
-
- FUNCTION ADVENT(j: INTEGER): INTEGER; VIRTUAL;
- Ermittelt die laufende Tagnummer des 1. Advent.
-
- FUNCTION IsFeiertag(tnr,t,m,j: INTEGER): BOOLEAN; VIRTUAL;
- TRUE, wenn Datum ein Feiertag ist.
-
- PROCEDURE FTAG_NUMMER(nr, j: INTEGER; VAR FTs: FTagArr);
- Gibt ein Array mit bis zu vier Feiertagen zurück, wenn mehrere auf den
- gleichen Tag fallen. $ffff = ungültig!
- nr enthält die laufende Nummer des Tages im Jahr.
-
- PROCEDURE GET_MoonMonth(mm,mj: INTEGER; VAR mond: mondmonat); VIRTUAL;
- Gibt in Mond die Daten der drei am nächsten liegenden Vollmond/
- Neumond - Daten zurück.
- 1..3 = Neumond, 4..6 = Vollmond; 0 ==> ungültig.
-
- FUNCTION MakeMoonString(m: INTEGER; index: BYTE; Mond: MondMonat): STRING;
- Gibt Vollmond bzw. Neumond - Daten als String zurück.
-
- FUNCTION Werktag_im_Monat(tt,mm,jj: INTEGER): INTEGER;
- FUNCTION Werktag_im_Jahr(tt,mm,jj: INTEGER): INTEGER;
- Laufende Nummer des Werktages im Monat/Jahr.
-
- FUNCTION MakeMonat(VAR s: STRING40): INTEGER;
- Gibt die Nummer des als String übergebenen Monats zurück, wenn nicht
- gefunden, dann 0.
- Der String kann den Monat als Ziffer oder als Klartext enthalten.
-
- FUNCTION MakeDatum(altdatum: STRING40): BOOLEAN;
- Ermittelt aus dem übergebenen String das Datum und stellt Kalender
- entsprechend ein. Im String darf auch ein Monatsname im Klartext
- (oder ein Teil davon) enthalten sein.
- Gültig wäre z. B. 1. Ap. 91
- Im greg. Kal wird Jahreszahl < 100 als 1980 < j <= 2080 interpretiert.
- Im Erfolgsfall (wenn das Datum gültig ist) wird TRUE zurückgegeben.
-
- FUNCTION Fuelle_FeiertagsListe(FListe: PUnsortedStringCollection): BOOLEAN;
- Füllt die Kollektion mit Namen und Daten der Feiertage des eingestellten
- Monats.
-
- PROCEDURE InitJahr(j: INTEGER);
- Füllt Feiertage^.
-
- FUNCTION GetFtDayNumber(Tab: Feiertagstabelle;j: INTEGER): INTEGER; VIRTUAL;
- Ermittelt aus der übergebenen Tabelle die Nummer des Tages im Jahr j,
- auf den der beschriebene Feiertag fällt.
-
- PROCEDURE Trage_ein(tnr: INTEGER; FTagNum: WORD);
- Trägt die Nummer FTagNum für den Tag tnr in Feiertage^ ein.
-
- FUNCTION CheckFTJahr(Jmin, JMax, J: INTEGER): BOOLEAN;
- Prüft, ob Feiertag im Jahr j angezeigt werden soll.
-
- PROCEDURE InitSpecials; VIRTUAL;
- Setzt einige Parameter in Abhängigkeit des Kalendariums.
-
-
-
- 5. Copyright
- Das Programm KALDEMO darf nicht kommerziell verwertet werden.
- Die Weitergabe ist nur zusammen mit der kompletten Shareware-Fassung der
- Toolbox gestattet.
- Das Einbinden der Units in eigene Programme ist nur registrierten Nutzern
- gestattet. Diese dürfen die selbsterstellten Programme ohne Einschränkung
- vermarkten.
-
-