Funktion zur Osterberechnung jetzt als UDF und modalem Meldungsfenster

  • Hallo zusammen,

    ich möchte hiermit eine kleine Function von mir vorstellen _EASTER. Die Funktion berechnet Ostern und gibt

    • dies auf dem Bildschirm aus, diese Ausgabe kann mit Parameter Quiet unterdrückt werden
    • und auch als xx. Tag an die aufrufende GUI zurück


    Sicher kein großartiges Projekt, noch dazu von einem Lernenden, und hat ja eh schon jeder für sich geschrieben.

    Stimmt vielleicht alles, schaut es aber trotzdem bitte einmal an, vielleicht kanns ja der ein oder andere benutzen. Es ist ganz frisch (ich bin mir nicht sicher ob die Berechnung für jedes Jahr Klappt), aber ausbaufähig da von Ostern noch einige andere Freietage abhängig sind.

    Edit1: ursprünglich war hier ein Spoiler jetzt: EASTER.ZIP Edit3 ist jetzt ein Anhang

    Edit2: hat sich erledigt daher mit Edit 9 in Spoiler verbannt

    Spoiler anzeigen

    Wer in mein Skrip geschaut hat bzw. sich wundert dass (s)ein anderes Programm für das Jahr XXXX (<>2009) ein anderes Ergebnis herausbekommt den bite ich @alle anderen natürlich auch sich folgende vewendete Formeln anzuschauen:

    a = Jahr mod 19
    b = Jahr mod 4
    c = Jahr mod 7
    H1 = Jahr div 100
    H2 = Jahr div 400
    N = 4 + H1 - H2
    M = 15 + H1 - H2- [(8 x H1 + 13) div 25]
    d = (19 x a + M) mod 30
    e = (2 x b + 4 x c + 6 x d + N) mod 7
    ostern = 22 + d + e
    Edit3:
    ostern = 22.März + d + e
    wenn: (ostern = 57) dann: (ostern = 50)
    wenn: [d = 28] und [e = 6] und [a > 10] dann: [ostern = 49]

    und wenn möglich mir die Ergebnisse für alle Zeilen mitteilen

    der Faktor war also richtig die beiden letzten Bedingungen traffen aber nie zu da der Faktor 59 bzw. 60 im Schaltjahr erst nach der Prüfung dieser beiden Sonderfälle stattfinden durfte, trotzdem habe ich noch das Problem, dass es Jahre gibt in der die Func Oster(Sonntag) einen Tag zu früh angibt (vorher auch mal einen zuviel, war aber immer das Osterwochenende Sa,So,Mo). Den Fehler mit dem einen Tag find ich auch noch.

    Edit4: da ich den Fehler immer an der falschen Stelle gesucht habe, hat es etwas länger gedauert als geplant. In der neuen Fassung hab ich das Script, geteilt einmal die eigentliche Funktion und eine Demo, diese hab ich auch leicht abgeändert, damit man erkennt wie man die Funktion unterschiedlich aufrufen kann.

    Achtung: die Anzahl und die Reihenfolge der Parameter hat sich geändert:

    Spoiler anzeigen

    Aufruf jetzt _Easter($iYear, [,$bQuiet], [,$sTitle] [,$hParent] [$iEditStyle]

    $iYear = das Jahr für das Ostern errechnet werden soll
    $bQuiet = Schalter für "stumme Ausgabe" True es wird nur gerechnet und zurückgegeben als xxx Tag im Jahr
    $sTitle = Fenstertitel (falls $Quiet True wird er ignoriert (optional)
    $hParent = ID des aufrufenden Fensters (optional, Standard = 0)
    wenn dieser Parameter übergeben wird das Anzeigefenster
    Modal angezeigt, d.h. es ist automatisch vor dem aufrufenden Fenster
    (verliert aber leider derzeit noch den Focus, beim Wechsel zu anderer Anwendung
    und wieder zurück, d.h man muß einmal in das Fenster klicken)
    $sEditStyle = Edit-Style für GUICtrl (optional)
    $iWidth = Breite des Fensters (optional, Standard = 400 Pixel)
    $iHeight = Höhe des Fensters (optional, Standard = 300 Pixel)
    $iLeft = Abstand von links (optional, Standard = zentriert)
    $iTop = Abstand von oben (optional, Standard = zentriert)
    Return Value: Ostersonntag als Integer, von diesem aus kann man alle beweglichen kirchlichen Feiertag, die auf Ostern beruhen errechnen
    Author: (Auto)Bert

    Quellen:


    Edit5: Zip ausgetauscht damit die Änderungen auch für alle zugänglich sind
    Edit6: Quellen und Danksagung aus Spoiler direkt in Beitrag verschoben
    Edit7+8: Optik des Beitrags und Rechtschreibfehler korrigiert (soweit gefunden)

    Ich könnte jetzt noch die weiteren beweglichen Feiertage mit ausgeben, z.B. Karfreitag = Ostern -1, Ostermontag = Ostern +1 usw. Zu überlegen ist auch ob ich dann eine Listview nehme, oder ob ich es so lasse. mit Edit 9 erledigt
    Anregungen, Kritik (jeglicher Art) entweder in diesem Thread oder als PN an mich.

    BugFix , wenn ich dein Projekt vorher gekannt hätte, hätte ich es wahrscheins gelassen bzw. mir ein anderes Thema gesucht. Ich werd es mir später gleich mal anschauen und dann warscheins vor Neid erblassen.

    In diesem Sinne wünsch ich euch allen noch ein frohes sonniges Osterfest Edit 9: Ostern ist ja jetzt wohl vorbei

    Edit 9: vom Edit im Anzeigefenster auf Listview umgestellt die Datumsbetimmung nach Errechnung des Ostersonntags erfolgt jetzt mit Hilfe von _DateDaysInMonth, da diese Routine erst bei 4 Stelligen Zahlen ein Ergebnis zurückliefert sind vorhergehende Aufrufe nutzlos. Daher hab ich auch das Beispiel zum Aufrufen daran angepasst und erweitert.
    Eine 2 Function ist hinzugekommen: _getHolyday($sHT,$iHDay,$iYear)

    Spoiler anzeigen
    [autoit]

    ;Function Name..: _getHolyday($sHT,$iHDay,$iYear)
    ;Description....: ermittelt das Datum des übergegenen x. Tages des Jahres und ertstellt
    ; daraus zusammen mit der Bez. einen String zum Eintragen in eine 2 Spaltige Listview
    ;Parameter(s)...: $sHT = der String mit der Bezeichnung ( Wenn kein Datensparatorzeichen am Schluß
    ; wird einer angehängt
    ; $bHDay = der x. Tag des Jahres (1. Januar = 1)
    ; $iYear = Jahresdatum, muß größer 1000 sein, da _DateDays in Month bei kleineren Zahlen keinen Wert zurückliefert
    ;Return Value...: String für Eintrag in ListView
    ;Author.........: (Auto)Bert

    [/autoit]


    der Einsatz wird ebenso im Beispiel demonstriert, (Button in ListView).

    Edit 11: hab Oscar s Anregung (#14) in DemoEaster.au3 eingearbeitet, und im Meldungsfenster vone Easter.au3 geb ich für Jahreszahlen vor 1583 jetzt einen Hinweis anstelle der Berechnung aus.
    Die neuen Dateien sind diesmal einzeln als au3 Files angehängt. (Das Zip File enthält Stand wie in Edit 9 beschrieben)

    einen schönen sonnigen Tag noch und vielen Dank für eure Rückmeldungen,

    mfg (Auto)Bert

    11 Mal editiert, zuletzt von AutoBert (16. April 2009 um 07:08)

  • Da Ostern auf zwei Tage verteilt ist solltest Du

    streichen:

    Spoiler anzeigen
    [autoit]

    Local $sText = "Ostern: " & $iDay & "." & $iMonth & "." & $iYear & @CRLF

    [/autoit]


    setzen:

    Spoiler anzeigen
    [autoit]

    Local $sText = "Osternsonntag: " & $iDay & "." & $iMonth & "." & $iYear & @CRLF & "Osternmontag: " &($iDay +1) & "." & $iMonth & "." & $iYear & @CRLF

    [/autoit]

    Ich weissss, das ist kleinlich, aber dennoch richtig. :rofl:

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Alina,

    das ist doch nicht kleinlich, hab ich schon angepasst, ist beim nächsten Upload mit dabei. Falls du ins Skript geschaut hast, hast du ja sicherlich auch gesehen, dass ich um die GUI fertigstellen zu können einen Korrekturfaktor eingebaut habe, das wenigstens dieses Jahr mein Ostern auf den richtigen Tag fällt (will ja keine neue Kalendereform einführen). Wäre nett wenn du und @all e anderen auch, mal schauen könnten, wie es sich auswirkt.

    mfg (Auto)Bert

  • Hallo BugFix,

    ich hab gerade die beiden au3 Files heruntergeladen, leider lassem sie sich nicht mehr ausführen. Im Script hab ich aber gesehen, das wir bis Kurz vor Errechnen von Ostern die gleichen Formeln verwenden (Gauß und Lichtenberg). Da du aber außerdem alle Feiertage errechnest schlägst deine Lösung meine sicher um Längen.

    Hast du noch eine lauffähige EXE davon, ich hätts mir gerne mal angeschaut. Sonst müßte ich die geänderte Syntax (_Floor und _div hab ich schon gesehen) anpassen und ich weiß nicht ob ich mir das antuen will.

    mfg (Auto)Bert

  • hab's mal aktualisiert...

    BugFix : wollte mich nicht vordrängeln, hab halt gerade Zeit gehabt :D

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Hallo BugFix,

    sagt ich doch um Längen besser :thumbup: , ich hab bisher nur eine kleine UDF die Ostern zurückgibt. Und eine Demo dazu. Alles andere müßte man noch hinzufügen, wenn man sie benutzen will. Hier hat man alles gleich auf einmal, schön übersichtlich. Sind deine Func's in die aktuelle AutoIT-Version eingeflossen, sprich soll ich meine _Easter anders benennen, damit es zu keinem Durcheinander kommt?

    Schnuffel danke fürs anpassen :)
    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (13. April 2009 um 21:57)

    • Offizieller Beitrag

    Sind deine Func's in die aktuelle AutoIT-Version eingeflossen, sprich soll ich meine _Easter anders benennen, damit es zu keinem Durcheinander kommt?


    Sind keine offiziellen UDF, also nicht in AutoIt.
    Du brauchst auch nix umbenennen. Kommt häufiger vor, dass man etwas erstellt, was bereits mit gleichem Ansatz gelöst wurde. Also kein Problem.

  • Hallo AutoBert!

    Ich hab mir die UDF mal angeschaut, super :thumbup:
    Wenn du das auch noch mit Weihnachten machst, kannst du sogar einen Adventskalender machen ;)

    Bei mir hat alles soerit funktioniert (Habe die Tage per Hand :!: abgezählt, um wirklich sicher zu sein :D )
    Was noch interessant wäre, wäre ja, wenn du auch ein - zulassen würdest. Wenn man im Jahr 0 auch berechnen kann, warum dann nicht auch v.Chr. ? :rofl:

  • @MatthiasG.

    Wenn Du wissen möchtest wann Jesus Christus geboren ist und welcher Wochentag das war, so ist die Antwort:
    Er wurde am 01.01.0000 geboren und das war ein Mittwoch.

    Wer was anderes behauptet der .... . :rofl:

    Beachte die Jahre / Tage die nie zur Kalendernutzung gekommen sind, wann gab es Schaltjahre oder nicht, usw.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Moment! Das kann man nicht genau sagen!

    Papst Gregor hat irgendwann beschlossen, das es am 24.Dezember war: Unser heutiges Weihnachten! :D

  • Hallo habe gerade eine leicht überarbeitete Version hochgeladen, Erklärungen und neueste Version sind in #1 zu finden

    @MatthiasG

    Zitat

    Was noch interessant wäre, wäre ja, wenn du auch ein - zulassen würdest. Wenn man im Jahr 0 auch berechnen kann, warum dann nicht auch v.Chr. ?

    Und da Ostern das Gedenken an die Auferstehung ist, ist es wohl unsinnig es auszurechnen, die UDF liefert aber trotzdem eine Tageszahl zurück x. Tag vom aufgerufenen Jahr, wenn du also wissen willst wann Ostern vergleichsweise im Jahr 300 v. Christi Geburt gewesen wäre, must du nur diese Zahl auswerten, alle Kalenderreformen berücksichtigen und dann hast du es :D . Das ich in meinem damaligen Beispiel, die Eingabe von Zahlen vor 33 nach Christi Geburt nicht abgefangen habe, sorry war ja nur ein Beispiel zum Aufrufen der UDF. Hat sich mit der neuen Fassung des Beispiels auch erledigt.

    Zitat

    Wenn du das auch noch mit Weihnachten machst, kannst du sogar einen Adventskalender machen

    Da Weihnachten kein beweglicher Tag ist, weiß ich noch nicht ob ich dafür auch eine Func schreibe.
    Aber auch an dich ein Lob für deine MathEX, weiter so :thumbup:

    an alle freundliche Grüße und einen sonnigen Tag (Auto)Bert

    • Offizieller Beitrag

    Für die Jahres-Eingabe würde ich GUICtrlCreateDate benutzen:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <DateTimeConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("My GUI get date", 200, 200, 800, 200)
    $date = GUICtrlCreateDate(@YEAR, 10, 10, 70, 25, $DTS_UPDOWN)
    GUICtrlSetFont(-1, 12)

    [/autoit] [autoit][/autoit] [autoit]

    $DTM_SETFORMAT_ = 0x1032
    $style = "yyyy"
    GUICtrlSendMsg($date, $DTM_SETFORMAT_, 0, $style)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "Time", GUICtrlRead($date))

    [/autoit]

    Sieht besser aus, man hat ein Up-/Down-Control und man kann kein "falsches" Jahr eingeben.

  • Oscar ,

    danke für den Tipp, werde ich mir überlegen ob ich es in das Beispiel zum Aufrufen der UDF einbaue, ich würde dann aber eher ein normales UpDn-Steuerelement neben das InputField setzen, da das Date-Steuerelement meiens Wissens nach nur ganze Datums angaben "TT.MM.JJJJ" anzeigt.

    Sieht besser aus, man hat ein Up-/Down-Control und man kann kein "falsches" Jahr eingeben

    Ist ja nur ein Beispiel, vielleicht ändere ich das ja noch

    mfg (Auto)Bert

  • Ich behaupte was anderes

    Ich auch! Man hat sich glaube ich um ein paar Jahre verrechnet!(So wie ich in der Schule :P , ne Scherz, hab heute M-Arbeit zurückbekommen-2er!)

    MfG. tobi_girst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »tobi_girst« (Morgen, 25:63)