EnableExplicit #WinW=280 #WinH=210 #WinTitle="Feiertage" ;-Init ;-Enum Enumeration #TagGadget #MonatGadget #JahrGadget #AnzeigeGadget #BerechnenGadget EndEnumeration ;-Const ;-Structure ;-Global Global event Global Dim Wochentag.s(6) Global Dim TageImMonat.i(12) ;-Use ;-Define ;-Declare ;-Include ;-Macro Macro Divide(Formel,by,q,r) ;für Osterdatum q=(Formel)/by r=(Formel)%by EndMacro Procedure InitGui() Protected c,x=10,y=10,w=50,h=22,xo=w+10,a.s ExamineDesktops() OpenWindow(1,(DesktopWidth(0)-#WinW)/2,(DesktopHeight(0)-#WinH)/2+50,#WinW,#WinH,#WinTitle,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget) ComboBoxGadget(#TagGadget,x,y,w,h,#PB_ComboBox_Editable) For c=1 To 31 AddGadgetItem(#TagGadget,-1,Str(c)) Next x+xo ComboBoxGadget(#MonatGadget,x,y,w,h,#PB_ComboBox_Editable) For c=1 To 12 AddGadgetItem(#MonatGadget,-1,Str(c)) Next x+xo SpinGadget(#JahrGadget,x,y,w,h,1582,9999,#PB_Spin_Numeric) x+xo ButtonGadget(#BerechnenGadget,x,y,w+30,h+1,"Berechnen") x=10 y+30 EditorGadget(#AnzeigeGadget,x,y,260,150,#PB_Editor_ReadOnly) Repeat Read.s a If a="XXX":Break:EndIf AddGadgetItem(#AnzeigeGadget,-1,a) ForEver AddKeyboardShortcut(1,#PB_Shortcut_Return,100) EndProcedure Procedure InitProgram() Protected x For x=0 To 6 Read.s Wochentag(x) Next For x=1 To 12 Read.i TageImMonat(x) Next EndProcedure Procedure WochentagBerechnen(d,m,j) ;Berechnung des Wochentages ;siehe https://de.wikipedia.org/wiki/Wochentagsberechnung Protected w ;Wochentag Protected c ;Jahrhundert (die ersten beiden Stellen des Jahres) Protected y ;Jahr (die letzten beiden Stellen des Jahres) Protected x.d Protected z If m<=2:j-1:EndIf c=j/100 y=j%100 m-2 If m<=0:m+12:EndIf x=2.6*m-0.2 z=Int(x) w=(d+z+y+(y/4)+(c/4)-2*c) w%7 If w<0:w+7:EndIf ProcedureReturn w EndProcedure Procedure Osterdatum(j) ;Osterdatum berechnen nach Spencers Osterformel ;siehe https://de.wikipedia.org/wiki/Spencers_Osterformel Protected a,b,c,d,e,f,g,h,i,k,l,m,n,o a=j%19 Divide(j,100,b,c) Divide(b,4,d,e) f=(b+8)/25 g=(b-f+1)/3 h=(19*a+b-d-g+15)%30 Divide(c,4,i,k) l=(32+2*e+2*i-h-k)%7 m=(a+11*h+22*l)/451 Divide(h+l-7*m+114,31,n,o) ProcedureReturn n*40+o+1 EndProcedure Procedure Addiere(tage,t,m) ;addiert "tage" zu "t" für Himmelfahrt und Pfingsten, Schaltjahr ist hier nicht relevant t+tage While t>TageImMonat(m) t-TageImMonat(m) m+1 Wend ProcedureReturn m*40+t EndProcedure Procedure Schaltjahr(j) Protected s If j%4=0:s=1:EndIf ;Jahr durch 4 teilbar ? Dann Schaltjahr If j%100=0:s=0:EndIf ;durch 100 teilbar ? Dann doch nicht If j%400=0:s=1:EndIf ;durch 400 teilbar ? Dann doch wieder ProcedureReturn s EndProcedure Procedure TageDesMonats(m,j) Protected t=TageImMonat(m) If m=2 t+Schaltjahr(j) EndIf ProcedureReturn t EndProcedure Procedure Berechnen(t,m,j) Protected wt.s=Wochentag(WochentagBerechnen(t,m,j)) Protected od=Osterdatum(j),ot=od%40,om=od/40 ;Ostersonntag Protected chd=Addiere(39,ot,om),cht=chd%40,chm=chd/40 ;Himmelfahrt Protected pd=Addiere(49,ot,om),pt=pd%40,pm=pd/40 ;Pfingstsonntag Protected TagDerEinheit,tde.s Protected sj.s="ein" If j>=1953 And j<1990 TagDerEinheit=WochentagBerechnen(17,6,j) tde="Tag der Deutschen Einheit (17.6.)"+#TAB$+Wochentag(TagDerEinheit) EndIf If j>=1990 TagDerEinheit=WochentagBerechnen(3,10,j) tde="Tag der Deutschen Einheit (3.10.)"+#TAB$+Wochentag(TagDerEinheit) EndIf If Schaltjahr(j)=0:sj="kein":EndIf ClearGadgetItems(#AnzeigeGadget) AddGadgetItem(#AnzeigeGadget,-1,"Das Jahr "+Str(j)+" war/ist "+sj+" Schaltjahr") AddGadgetItem(#AnzeigeGadget,-1,"") AddGadgetItem(#AnzeigeGadget,-1,"Der "+Str(t)+"."+Str(m)+"."+Str(j)+" war/ist ein"+#TAB$+#TAB$+wt) AddGadgetItem(#AnzeigeGadget,-1,"") AddGadgetItem(#AnzeigeGadget,-1,"Neujahr (1.1.)"+#TAB$+#TAB$+#TAB$+Wochentag(WochentagBerechnen(1,1,j))) AddGadgetItem(#AnzeigeGadget,-1,"Tag der Arbeit (1.5)"+#TAB$+#TAB$+#TAB$+Wochentag(WochentagBerechnen(1,5,j))) If tde AddGadgetItem(#AnzeigeGadget,-1,tde) EndIf AddGadgetItem(#AnzeigeGadget,-1,"Erster Weihnachtstag (25.12.)"+#TAB$+#TAB$+Wochentag(WochentagBerechnen(25,12,j))) AddGadgetItem(#AnzeigeGadget,-1,"Ostersonntag"+#TAB$+#TAB$+#TAB$+Str(ot)+"."+Str(om)) AddGadgetItem(#AnzeigeGadget,-1,"Christi Himmelfahrt"+#TAB$+#TAB$+#TAB$+Str(cht)+"."+Str(chm)) AddGadgetItem(#AnzeigeGadget,-1,"Pfingstsonntag"+#TAB$+#TAB$+#TAB$+Str(pt)+"."+Str(pm)) EndProcedure Procedure Main() Protected da=Date() Protected jahr=Year(da) Protected monat=Month(da) Protected tag=Day(da) Protected tdm InitGui() InitProgram() SetGadgetState(#TagGadget,tag-1) SetGadgetState(#MonatGadget,monat-1) SetGadgetText(#JahrGadget,Str(jahr)) SetGadgetState(#JahrGadget,jahr) Repeat event=WaitWindowEvent() Select event Case #PB_Event_Menu If EventMenu()=100 jahr=GetGadgetState(#JahrGadget) If jahr>=1582 tdm=TageDesMonats(monat,jahr) If tag>tdm tag=tdm SetGadgetText(#TagGadget,Str(tag)) EndIf Berechnen(tag,monat,jahr) EndIf EndIf Case #PB_Event_Gadget Select EventGadget() Case #BerechnenGadget:Berechnen(tag,monat,jahr) Case #TagGadget tag=Val(GetGadgetText(#TagGadget)) If tag<1:tag=1:SetGadgetText(#TagGadget,"1"):EndIf tdm=TageDesMonats(monat,jahr) If tag>tdm tag=tdm SetGadgetText(#TagGadget,Str(tag)) EndIf Case #MonatGadget monat=Val(GetGadgetText(#MonatGadget)) If monat<1:monat=1:SetGadgetText(#MonatGadget,"1"):EndIf If monat>12:monat=12:SetGadgetText(#MonatGadget,"12"):EndIf tdm=TageDesMonats(monat,jahr) If tag>tdm tag=tdm SetGadgetText(#TagGadget,Str(tag)) EndIf Case #JahrGadget Select EventType() Case #PB_EventType_Up:jahr+1:Berechnen(tag,monat,jahr) Case #PB_EventType_Down:jahr-1:Berechnen(tag,monat,jahr) EndSelect EndSelect EndSelect Until event=#PB_Event_CloseWindow EndProcedure Main() DataSection Data.s "Das Programm berechnet den Wochentag","des eingegeben Datums" Data.s "und die gesetzlichen Feiertage des Jahres","nach dem gregorianischen Kalender ab 1582." Data.s "Das Programm berücksichtigt den","Tag der Deutschen Einheit (17.6./3.10.)." Data.s "XXX" Data.s "Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Sonnabend" Data.i 31,28,31,30,31,30,31,31,30,31,30,31 EndDataSection ; IDE Options = PureBasic 5.70 LTS (Windows - x64) ; Folding = AA- ; EnableXP ; Executable = Datum.exe