Einzelnen Beitrag anzeigen

JonnyGuitar

Registriert seit: 4. Jun 2004
233 Beiträge
 
#3

Re: Frage zur Entwicklung einer Komponente Feiertagsberechnu

  Alt 12. Nov 2006, 17:56
lol, ich depp

der code basiert auf folgender quelle: delphi-fundgrube


Delphi-Quellcode:
unit Feiertage;

interface

uses
  SysUtils, Classes;

const
  Feiertage : array [1..19] of string[25] =
   ('Neujahr','Maifeiertag','Tag der deutschen Einheit','Allerheiligen',
    'Totensonntag','Volkstrauertag','1. Weihnachtstag','2. Weihnachtstag',
    'Karfreitag','Ostersonntag','Ostermontag','Christi Himmelfahrt',
    'Pfingstsonntag','Pfingstmontag','Fronleichnam','Heilige 3 Könige',
    'Mariä Himmelfahrt','Reformationstag','Buß- und Bettag');
  Sondertage : array [1..24] of string[25] =
   ('Mariä Lichtmeß','Valentinstag','Weiberfastnacht','Rosenmontag','Fastnacht',
    'Aschermittwoch','Mariä Verkündigung','Palmsonntag','Gründonnerstag','Muttertag',
    'Peter und Paul','Mariä Geburt','Erntedankfest','Mariä Empfängnis','Silvester',
    '1. Advent','2. Advent','3. Advent','4. Advent','Heiligabend','Frühlingsanfang',
    'Sommmeranfang','Herbstanfang','Winteranfang');

type
  TFeiertage = class(TComponent)
  private
    { Private-Deklarationen }
    FFeiertag : array [1..365] of ShortInt;
    FFeiertag: Boolean;
    FFeiertagName: String;
    FDatum: TDateTime;
    FBundesland: String;
    function OsterSonntag(Y:word):TDateTime;
    function TagImJahr(Datum:TDateTime):word;
    procedure FeiertageBerechnen(Y:word);
  protected
    { Protected-Deklarationen }
  public
    constructor Create(Year:Word) override;
    destructor destroy; override;
    { Public-Deklarationen }
  published
    property Datum: TDateTime read FDatum;
    property Feiertag: Boolean read FFeiertag;
    property Feiertagname: String read FFeiertagName;
    property Bundesland: String write FBundesland;
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TFeiertage]);
end;

constructor TFeiertage.Create(Year:Word);
begin
  inherited;
  FeiertageBerechnen(Year);
  //
end;

destructor TFeiertage.destroy;
begin
  //
  inherited;
end;

function TFeiertage.TagImJahr(Datum:TDateTime):word;
var T,M,J : word;
    Erster : TDateTime;
begin
  try
    DecodeDate(Datum,J,M,T);
    Erster:=EncodeDate(J,1,1);
    Result:=trunc(Datum-Erster+1);
  except
    Result:=0;
  end;
end;

function TFeiertage.OsterSonntag(Y:word):TDateTime;
var a,b,c,d,e,tag,monat : integer;
begin
  a:=y MOD 19 ;
  b:=y MOD 4;
  c:=y MOD 7;
  d:=(19*a+24) MOD 30;
  e:=(2*b+4*c+6*d+5) MOD 7;
  Tag:=22+d+e;
  monat:=3;
  IF Tag>31 then begin
    tag:=d+e-9;
    monat:=4;
  end;
  IF (tag=26) AND (monat=4) then
    tag:=19;
  IF (tag=25) AND (monat=4) AND (d=28) AND (e=6) AND (a>10) then
    tag:=18;
  try
    Result:= EncodeDate(y,monat,tag);
  except
    Result:=0;
  end;
end;

procedure TFeiertage.FeiertageBerechnen(Y:word);
var D,dw,OM,aw : word;
    Dat : TDateTime;
    Ostern : TDateTime;
    Weihnacht : TDateTime;
begin
  for D:=1 to 365 do
    Feiertag[D]:=0;
  Ostern:=OsterSonntag(Y);
  try
    DecodeDate(Ostern,Y,OM,D);
  except
    OM:=4;
  end;
  try
    Weihnacht:=EncodeDate(Y,12,25);
    if (DayOfWeek(Weihnacht)-1)=0 then
      dw:=7
    else
      dw:=DayOfWeek(Weihnacht)-1;
  except
    Weihnacht:=-1;
    dw:=0;
  end;
  {Mariä Lichtmeß}                     {Sondertage}
  Dat:=Encodedate(Y,2,2);
  Feiertag[TagImJahr(Dat)]:=-1;
  {Valentinstag}
  Dat:=Encodedate(Y,2,14);
  Feiertag[TagImJahr(Dat)]:=-2;
  {Weiberfastnacht}
  Dat:=Ostern-45;
  while DayOfWeek(Dat)<>2 do
    Dat:=Dat-1;
  Feiertag[TagImJahr(Dat)-4]:=-3;
  {Rosenmontag}
  Feiertag[TagImJahr(Dat)]:=-4;
  {Fastnacht}
  Feiertag[TagImJahr(Dat)+1]:=-5;
  {Aschermittwoch}
  Feiertag[TagImJahr(Dat)+2]:=-6;
  {Mariä Verkündigung}
  Dat:=Encodedate(Y,3,25);
  Feiertag[TagImJahr(Dat)]:=-7;
  {Palmsonntag}
  Feiertag[TagImJahr(Ostern)-7]:=-8;
  {Gründonnerstag}
  Feiertag[TagImJahr(Ostern)-3]:=-9;
  {Muttertag}
  Dat:=EncodeDate(y,4,30);
  aw:=DayOfWeek(Dat)-1;
  Dat:=Dat-aw+14;
  if Dat=(Ostern+49) then
    Dat:=Dat-7;
  Feiertag[TagImJahr(Dat)]:=-10;
  {Peter und Paul}
  Dat:=Encodedate(Y,6,29);
  Feiertag[TagImJahr(Dat)]:=-11;
  {Mariä Geburt}
  Dat:=Encodedate(Y,9,8);
  Feiertag[TagImJahr(Dat)]:=-12;
  {Erntedankfest}
  Dat:=Encodedate(Y,10,1);
  while DayOfWeek(Dat)<>1 do
    Dat:=Dat+1;
  Feiertag[TagImJahr(Dat)]:=-13;
  {Mariä Empfängnis}
  Dat:=Encodedate(Y,12,8);
  Feiertag[TagImJahr(Dat)]:=-14;
  {Silvester}
  Dat:=Encodedate(Y,12,31);
  Feiertag[TagImJahr(Dat)]:=-15;
  {1. Advent}
  Dat:=Weihnacht;
  while DayOfWeek(Dat)<>1 do
    Dat:=Dat-1;
  Feiertag[TagImJahr(Dat)-21]:=-16;
  {2. Advent}
  Feiertag[TagImJahr(Dat)-14]:=-17;
  {3. Advent}
  Feiertag[TagImJahr(Dat)-7]:=-18;
  {4. Advent}
  Feiertag[TagImJahr(Dat)]:=-19;
  {Heiligabend}
  Feiertag[TagImJahr(Weihnacht)-1]:=-20;
  {Frühlingsanfang}
  Dat:=Encodedate(Y,3,21);
  Feiertag[TagImJahr(Dat)]:=-21;
  {Sommmeranfang}
  Dat:=Encodedate(Y,6,21);
  Feiertag[TagImJahr(Dat)]:=-22;
  {Herbstanfang}
  Dat:=Encodedate(Y,9,23);
  Feiertag[TagImJahr(Dat)]:=-23;
  {Winteranfang}
  Dat:=Encodedate(Y,12,22);
  Feiertag[TagImJahr(Dat)]:=-24;
  {Neujahr}                         {Feiertage}
  Feiertag[1]:=1;
  {Maifeiertag}
  Dat:=Encodedate(Y,5,1);
  Feiertag[TagImJahr(Dat)]:=2;
  {Tag der deutschen Einheit}
  Dat:=Encodedate(Y,10,3);
  Feiertag[TagImJahr(Dat)]:=3;
  {Allerheiligen}
  Dat:=Encodedate(Y,11,1);
  Feiertag[TagImJahr(Dat)]:=4;
  {Totensonntag}
  if Weihnacht>=0 then
    Feiertag[TagImJahr(Weihnacht-dw-28)]:=5;
  {Buß- und Bettag}
  if Config.Land=12 then
    Feiertag[TagImJahr(Weihnacht-dw-32)]:=19;
  {Volkstrauertag}
  if Weihnacht>=0 then
    Feiertag[TagImJahr(Weihnacht-dw-35)]:=6;
  {1. Weihnachtstag}
  if Weihnacht>=0 then
    Feiertag[TagImJahr(Weihnacht)]:=7;
  {2. Weihnachtstag}
  if Weihnacht>=0 then
    Feiertag[TagImJahr(Weihnacht)+1]:=8;
  {Karfreitag}
  Feiertag[TagImJahr(Ostern)-2]:=9;
  {Ostersonntag}
  Feiertag[TagImJahr(Ostern)]:=10;
  {Ostermontag}
  Feiertag[TagImJahr(Ostern)+1]:=11;
  {Christi Himmelfahrt}
  Feiertag[TagImJahr(Ostern)+39]:=12;
  {Pfingstsonntag}
  Feiertag[TagImJahr(Ostern)+49]:=13;
  {Pfingstmontag}
  Feiertag[TagImJahr(Ostern)+50]:=14;
  {Fronleichnam}
  if (Config.Land<2) or ((Config.Land>=9) and (Config.Land<=12)) or (Config.Land=15) then
    Feiertag[TagImJahr(Ostern)+60]:=15;
  {Heilige 3 Könige}
  if (Config.Land=0) or (Config.Land=1) or (Config.Land=13) then
    Feiertag[6]:=16;
  {Mariä Himmelfahrt}
  if (Config.Land=1) or (Config.Land=11) then begin
    Dat:=Encodedate(Y,8,15);
    Feiertag[TagImJahr(Dat)]:=17;
  end;
  {Reformationstag}
  if (Config.Land=3) or (Config.Land=7) or (Config.Land=12) or (Config.Land=13) or (Config.Land=15) then begin
    Dat:=Encodedate(Y,10,31);
    Feiertag[TagImJahr(Dat)]:=18;
  end;
end;

end.

mfg Jonny
the only thing to fear is runnin' out of beer
  Mit Zitat antworten Zitat