Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Feiertage berechnen


LogoPie - Do 27.01.05 10:34
Titel: Feiertage berechnen
Hab was um Feiertage für NRW zu berechnen. Die Sache hat nur einen Haken das Jahr befindet sich im Quelltext. Würd es ganz gern über eine Editfeld eingeben. Hab aber immer wieder einen Konflikt mit (Word). Vielleicht hat jemand eine Idee.


Unit1.pas
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Unit2, Feiertage;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject); (*der Entscheidene Teil des Problems ist
var hdays : THolidayTable;                        hier *)

    i     : Integer;
  //  j     : Integer;
begin
     hdays:=GetHolidayTable(2005);
   //  Edit1.Text := IntToDate(j);
     listbox1.items.Clear;
     for
        i:=0 to high(hdays)do
        listbox1.items.Add(DateToStr(hdays[i].date)+' '+hdays[i].name);
end;

end.


Unit2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
unit Unit2;

interface 

uses Windows, SysUtils;

type
    THoliday = Record
        Date: TDateTime; 
        Name: String;
    End;
    THolidayTable = Array Of THoliday; 

    Function GetHolidayTable(Year: Word): THolidayTable;

implementation

Function GetHolidayTable(Year: Word): THolidayTable;

    Procedure AddHoliday(DD, MM: Word; HDName: String); Overload;
    Begin
        SetLength(Result, High(Result) + 2);
        With Result[High(Result)] Do 
        Begin 
            Date := EncodeDate(Year, MM, DD);
            Name := HDName;
        End
    End

    Procedure AddHoliday(HDDate: TDateTime; HDName: String); Overload
    Begin 
        SetLength(Result, High(Result) + 2); 
        With Result[High(Result)] Do 
        Begin 
            Date := HDDate; 
            Name := HDName; 
        End
    End

    Function GetEasterDate(YYYY: Word): TDateTime;
    Var 
        A, B, C, D, E, F, G, H, I, K, L, M, N, P: Word;
        DD, MM: Word;
    Begin 
        a := YYYY Mod 19;
        b := YYYY Div 100
        c := YYYY Mod 100;
        d := b Div 4;
        e := b Mod 4;
        f := (b + 8Div 25;
        g := (b - f + 1Div 3;
        h := (19 * a + b - d - g + 15Mod 30;
        i := c Div 4
        k := c Mod 4;
        l := (32 + 2 * e + 2 * i - h - k) Mod 7;
        m := (a + 11 * h + 22 * l) Div 451;
        n := (h + l - 7 * m + 114Div 31
        p := (h + l - 7 * m + 114Mod 31 + 1;
        DD := p; 
        MM := n;
        Result := EncodeDate(YYYY, MM, DD);
    End;
Var 
    EDate: TDateTime; 
Begin 
    AddHoliday(11'Neujahr'); 
    AddHoliday(15'Tag der Arbeit'); 
    AddHoliday(310'Tag der deutschen Einheit');
    AddHoliday(2512'1. Weihnachtsfeiertag');
    AddHoliday(2612'2. Weihnachtsfeiertag');
    AddHoliday(111'Allerheiligen');
    EDate := GetEasterDate(Year);
    AddHoliday(EDate + 60'Fronleichnam');
    AddHoliday(EDate - 2'Karfreitag'); 
    AddHoliday(EDate + 1'Ostermontag'); 
    AddHoliday(EDate + 39'Christi Himmelfahrt');
    AddHoliday(EDate + 50'Pfingstmontag');
End

end.



Moderiert von user profile iconTino: DF- durch Delphi-Tags ersetzt.
Moderiert von user profile iconTino: Überflüssige Absätze entfernt.


MitschL - Do 27.01.05 10:56

Bitte editier dein Posting nochmal(Klammer mal in Delhi-Tags; mit Alt+d davor und danach). Soviel kann ich nicht 'suchen' wollen. :?

gegrüßt!

[edit] Habt Dank, edler Tino!


MitschL - Do 27.01.05 11:16

Also,

ich würde zuerst den Text auslesen und die Zahl dazu übergeben.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//...
  var year: Integer;
  //...
begin
  year := StrToInt( Edit1.Text );
  hdays:=GetHolidayTable(year);
  //  Edit1.Text := IntToDate(j); <- irritiert mich  
  //...


Vorsichthalber würde ich die Eingabe des Editfeldes beschränken, so daß nur gültige Jahre eingegeben werden können (bzw. überhaupt nur Zahlen, die zudem nicht größer als 65535 werden können).

Dabei hilft dir try-Except, OnChange-Ereignis des Edit1, MaskEdit, SpinEdit, DateTimePicker, oder was anderes.

gegrüßt!


BenBE - Do 27.01.05 21:32

Der Quelltext zu Unit2 stammt auf die Variablennamen genau von mir. Siehe http://www.swissdelphicenter.ch/de/forum/viewtopic.php?p=8249#8249 für das Original. Bitte diese Quelle beim Zitieren des Gesamtcodes mit angeben.

BTW: Eine Einschränkung des Osterdatums ist, dass dieser Algo erst für Jahre NACH 1583 gültig ist. Bitte beachte dies bei Deiner gültigkeitsprüfung.

THX.