home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
pas
/
ktools
/
source
/
ocalend.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-11-16
|
11KB
|
455 lines
Unit OCalend;
{ calendrier }
{ K.B., novembre 1994 }
{$IFDEF debug}
{$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
{$ELSE}
{$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
{$ENDIF}
INTERFACE
Uses Dos, UDrivers, UTextScr,
OTableau, OChamp,
OGenView, OTxtView;
Const
NbrMaxJours =365;
TabJours:Array[0..6] of String[8]=
('Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi');
TabMois :Array[1..12] of String[10]=
('Janvier','Février','Mars','Avril','Mai','Juin','Juillet',
'Août','Septembre','Octobre','Novembre','Décembre');
Function CalcCodeJour(J,M,A:Word):Word;
{ nombre de jours depuis le début du calendrier }
Function NbJoursAn(A:Word):Word;
{ nombre de jours de l'année }
Function NbJoursMois(M,A:Word):Word;
{ nombre de jours du mois }
Function NumJour(J,M,A:Word):Word;
{ numéro du jour dans l'année }
Function CalcPaques(A:Word):Integer;
{ numéro du jour de Pâques }
Function DonneNomFichier(A:Word):String;
{ nom du fichier associé à l'année }
Function MakeCal(A:Word):PStrTab;
{ initialisation des données de l'année,
création d'un nouveau fichier si nécessaire }
Type
PCalendWin=^TCalendWin;
TCalendWin=object(TWindow)
TabEvent : PStrTab;
Champ : PChamp;
SelJ,SelM,SelA:Integer;
ChangeHeader:Boolean;
Constructor Init;
Destructor Done; virtual;
Procedure DrawInterior; virtual;
Procedure BackGround; virtual;
Procedure HandleEvent(var Event:TEvent); virtual;
Procedure NewYear(n:Integer);
Procedure NewMonth(n:Integer);
Procedure NewDay(n:Integer);
Procedure ToDay;
Function NumDay(P:TPoint):Integer;
Procedure WriteEvent;
Procedure InitEd;
Procedure DoneEd;
Procedure DrawHeader;
End;
IMPLEMENTATION
Function CalcCodeJour(J,M,A:Word):Word;
Var Na:Real;
Begin
if M<3
then begin
Na:=(A-1)/100;
CalcCodeJour:=365*A+J+31*(M-1)+Trunc(Na*25)-Trunc(3/4*(Int(Na)+1));
end
else CalcCodeJour:=365*A+J+31*(M-1)-Trunc(0.4*M+2.3)+Trunc(A/4)
-Trunc(3/4*(Int(A/100)+1));
End;
Function NbJoursAn(A:Word):Word;
Begin
NbJoursAn:=CalcCodeJour(1,1,A+1)-CalcCodeJour(1,1,A);
End;
Function NbJoursMois(M,A:Word):Word;
Begin
NbJoursMois:=CalcCodeJour(1,M+1,A)-CalcCodeJour(1,M,A);
End;
Function NumJour(J,M,A:Word):Word;
Begin
NumJour:=CalcCodeJour(J,M,A)-CalcCodeJour(1,1,A)+1;
End;
Function CalcPaques(A:Word):Integer;
{ calcul de la date de Pâques selon la méthode de Spender Jones }
Var R01,R02,R03,R04,R05,R06,R07,R08,R09,R10,R11,R12 :Integer;
Begin
R01:=A mod 19;
R02:=A div 100;
R03:=A mod 100;
R04:=R02 div 4;
R05:=R02 mod 4;
R06:=(8+R02) div 25;
R07:=(1+R02-R06) div 3;
R08:=15+19*R01+R02-R04-R07;
R08:=R08 mod 30;
R09:=R03 div 4;
R10:=R03 mod 4;
R11:=32+2*(R05+R09)-R08-R10;
R11:=R11 mod 7;
R12:=(R01+11*R08+22*R11) div 451;
CalcPaques:=NumJour(21,3,A)+R08+R11-7*R12+1;
End;
Function DonneNomFichier(A:Word):String;
Var s:String;
Begin
Str(a,s);
DonneNomFichier:=s+'.CLD';
End;
Function MakeCal(A:Word):PStrTab;
Var i:Word;
Paques:Integer;
Nf:String;
TabEvent:PStrTab;
Begin
Nf:=FSearch(DonneNomFichier(A),'');
if Nf=''
then begin { fichier absent }
Nf:=DonneNomFichier(A);
TabEvent:=New(PStrTab,Init(366,5));
For i:=0 to NbrMaxJours do
TabEvent^.AjouterLigne('');
with TabEvent^ do
begin
ChangerLigne(1,'Nouvel an');
ChangerLigne(8-(CalcCodeJour(1,1,A) mod 7),'Epiphanie');
ChangerLigne(NumJour(1,5,A),'Fête du travail');
ChangerLigne(NumJour(8,5,A),'Victoire 1945');
i:=7-(CalcCodeJour(8,5,A) mod 7);
if i<>7
then ChangerLigne(1+NumJour(8,5,A)+i,'Fête Jeanne d''Arc');
ChangerLigne(NumJour(14,7,A),'Fête nationale');
ChangerLigne(NumJour(15,8,A),'Assomption');
ChangerLigne(NumJour(1,11,A),'Toussaint');
ChangerLigne(NumJour(11,11,A),'Armistice 1918');
ChangerLigne(NumJour(25,12,A),'Noël');
Paques:=CalcPaques(A);
ChangerLigne(Paques-42,'Carême');
ChangerLigne(Paques-7,'Rameaux');
ChangerLigne(Paques,'Pâcques');
ChangerLigne(Paques+1,'Lundi de Pâcques');
ChangerLigne(Paques+39,'Ascension');
ChangerLigne(Paques+49,'Pentecôte');
ChangerLigne(Paques+50,'Lundi de Pentecôte');
ChangerLigne(Paques+63,'Fête Dieu');
end;
end
else TabEvent:=New(PStrTab,Load(Nf));
MakeCal:=TabEvent;
End;
{ objet TCalendWin }
Constructor TCalendWin.Init;
Var w1,w2,w3,w4 : Word;
Begin
TWindow.Init(2,2,36,19,'');
Ident:='CALWIN';
ChangeHeader:=true;
Champ:=nil;
GetDate(w1,w2,w3,w4);
SelA:=w1;
SelM:=w2;
SelJ:=w3;
TabEvent:=MakeCal(SelA);
End;
Destructor TCalendWin.Done;
Begin
if Champ<>nil
then dispose(Champ,Done);
dispose(TabEvent,Done);
TWindow.Done;
End;
Procedure TCalendWin.ToDay;
Var w1,w2,w3,w4:Word;
Begin
GetDate(w1,w2,w3,w4);
if w1<>SelA
then NewYear(w1);
SelA:=w1;
SelM:=w2;
SelJ:=w3;
ChangeHeader:=true;
End;
Procedure TCalendWin.DrawHeader;
Var S : String;
x,y : Byte;
Begin
Str(SelA,S);
S:=TabMois[SelM]+' '+S;
while length(S)<Largeur do S:=' '+S+' ';
if length(S)>Largeur then dec(S[0]);
Ecrire(S,1,1,0);
For x:=0 to 6 do
For y:=0 to 5 do Ecrire(' ',1+5*x,5+2*y,0);
ChangeHeader:=false;
End;
Procedure TCalendWin.DrawInterior;
Var x,y,c:Byte;
I,J1:Word;
S:String;
Begin
c:=0;
{ nom du mois }
if ChangeHeader
then DrawHeader;
J1:=CalcCodeJour(1,SelM,SelA);
x:=1+5*(J1 mod 7);
y:=5;
For i:=1 to NbJoursMois(SelM,SelA) do
begin
str(i,S);
if length(S)=1 then S:=' '+S;
S:=' '+S+' ';
if i=SelJ
then c:=1;
Ecrire(S,x,y,c);
if i=SelJ
then begin
c:=0;
WriteEvent;
end;
inc(x,5);
if x>34
then begin
x:=1;
inc(y,2);
end;
end;
End;
Procedure TCalendWin.BackGround;
Var i,j,c:Byte;
Begin
TWindow.BackGround;
c:=0;
{ jours de la semaine }
Ecrire(SDS,0,2,c);
For i:=0 to 6 do Ecrire(THS+THS+THS+THS+TTS,1+5*i,2,c);
Ecrire(SGS,35,2,c);
For i:=0 to 6 do Ecrire(TVS+' '+copy(TabJours[i],1,2)+' ',5*i,3,c);
Ecrire(TVS,35,3,c);
{ numéros des jours }
Ecrire(SDS,0,4,c);
For i:=0 to 6 do Ecrire(THS+THS+THS+THS+CrS,1+5*i,4,c);
Ecrire(SGS,35,4,c);
For j:=1 to 6 do
begin
For i:=0 to 6 do Ecrire(TVS+' ',5*i,3+2*j,c);
Ecrire(TVS,35,3+2*j,c);
Ecrire(SDS,0,4+2*j,c);
For i:=0 to 6 do Ecrire(THS+THS+THS+THS+CrS,1+5*i,4+2*j,c);
Ecrire(SGS,35,4+2*j,c);
end;
For i:=1 to 6 do Ecrire(TIS,5*i,16,c);
End;
Procedure TCalendWin.NewMonth(n:Integer);
Begin
ChangeHeader:=true;
SelM:=SelM+n;
if SelM<=0
then begin
repeat
dec(SelA);
SelM:=12+SelM;
until SelM>0;
NewYear(SelA);
end;
if SelM>12
then begin
repeat
inc(SelA);
SelM:=SelM-12;
until SelM<=12;
NewYear(SelA);
end;
End;
Procedure TCalendWin.NewYear(n:Integer);
Var P:TPoint;
S:String;
Begin
dispose(TabEvent,Done);
TabEvent:=MakeCal(n);
DrawHeader;
End;
Procedure TCalendWin.NewDay(n:Integer);
Begin
SelJ:=SelJ+n;
if SelJ<=0
then begin
NewMonth(-1);
SelJ:=NbJoursMois(SelM,SelA)+SelJ;
end;
if SelJ>NbJoursMois(SelM,SelA)
then begin
SelJ:=SelJ-NbJoursMois(SelM,SelA);
NewMonth(1);
end;
End;
Procedure TCalendWin.InitEd;
Var WS : String;
P : TPoint;
Begin
WS:=TabEvent^.Ligne(NumJour(SelJ,SelM,SelA));
Champ:=New(PChamp,Init(WS,80,Largeur));
Ecrire(Champ^.GetDrawString,1,17,0);
MakeGlobal(Origin,P);
SetCursorPos(P.X+Champ^.XScr,P.Y+17);
SetCursorType(NormalCursor);
End;
Procedure TCalendWin.DoneEd;
Begin
SetCursorType(BlankCursor);
WriteEvent;
dispose(Champ,Done);
Champ:=nil;
End;
Procedure TCalendWin.WriteEvent;
Var S : String;
Begin
S:=TabEvent^.Ligne(NumJour(SelJ,SelM,SelA));
Ajuste(S,Largeur);
Ecrire(S,1,17,0);
End;
Function TCalendWin.NumDay(P:TPoint):Integer;
Begin
NumDay:=0;
if (P.X mod 5 = 0) or (P.Y mod 2 = 0)
then exit;
NumDay:=(P.X div 5) + 7*((P.Y-4) div 2) - (CalcCodeJour(1,SelM,SelA) mod 7)+1;
End;
Procedure TCalendWin.HandleEvent(var Event:TEvent);
Var r : Word;
P : TPoint;
n : Integer;
Begin
if (Event.What=evKeyDown) and (Champ<>nil)
then begin
r:=Champ^.Exec(Event.KeyCode);
if r=Ret
then begin
TabEvent^.ChangerLigne(NumJour(SelJ,SelM,SelA),
Champ^.Renvoi);
PTextApp(Application)^.Patience('Sauvegarde en cours ...');
TabEvent^.Save(DonneNomFichier(SelA));
PTextApp(Application)^.FinPatience;
end;
if (r=Ret) or (r=Echap)
then DoneEd
else begin
Ecrire(Champ^.GetDrawString,1,17,0);
MakeGlobal(Origin,P);
SetCursorPos(P.X+Champ^.XScr,P.Y+17);
end;
if Event.KeyCode<>AltX
then Event.What:=evNothing;
end;
TWindow.HandleEvent(Event);
case Event.What of
evCommand :
case Event.Command of
cmSave : TabEvent^.Save(DonneNomFichier(SelA));
else exit;
end;
evMouseLUp :
begin
if Etat and stSelected=0
then exit;
MakeLocal(Origin,P);
P.X:=MouseX-P.X;
P.Y:=MouseY-P.Y;
if MouseInView
then begin
if P.Y=17
then begin
InitEd;
exit;
end;
if Champ<>nil
then DoneEd;
if P.Y=0
then NewMonth(-1)
else if P.Y=2
then NewMonth(1)
else if P.Y>4
then begin
n:=NumDay(P);
if (n>0) and (n<=NbJoursMois(SelM,SelA))
then NewDay(n-SelJ)
else exit;
end
else exit;
end
else exit;
end;
evKeyDown :
begin
if Etat and stSelected=0
then exit;
case Event.KeyCode of
CsRg : NewDay(1);
CsLf : NewDay(-1);
CsUp : NewDay(-7);
CsDn : NewDay(7);
PgDn : NewMonth(1);
PgUp : NewMonth(-1);
Home : ToDay;
AltS : TabEvent^.Save(DonneNomFichier(SelA));
Inser: InitEd;
Ret : InitEd;
else exit;
end;
end;
else exit;
end;
if SelJ>NbJoursMois(SelM,SelA)
then SelJ:=NbJoursMois(SelM,SelA);
if Champ=nil
then DrawInterior;
Event.What:=evNothing;
End;
END.
{ Fin du fichier OCalend.Pas }