Autor Beitrag
LogoPie
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 27.01.05 10:34 
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.

ausblenden volle Höhe 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.

ausblenden volle Höhe 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.


Zuletzt bearbeitet von LogoPie am Do 27.01.05 11:18, insgesamt 1-mal bearbeitet
MitschL
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 211

Win 98 SE, Win 2000
D5 Pers, D6 Pers und D7 Pro
BeitragVerfasst: 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!

_________________
"Bloßes Ignorieren ist noch keine Toleranz." (Theodor Fontane)
MitschL
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 211

Win 98 SE, Win 2000
D5 Pers, D6 Pers und D7 Pro
BeitragVerfasst: Do 27.01.05 11:16 
Also,

ich würde zuerst den Text auslesen und die Zahl dazu übergeben.
ausblenden 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!

_________________
"Bloßes Ignorieren ist noch keine Toleranz." (Theodor Fontane)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 27.01.05 21:32 
Der Quelltext zu Unit2 stammt auf die Variablennamen genau von mir. Siehe www.swissdelphicente...opic.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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.