Autor Beitrag
hassedelphi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101

WIN XP
D7 Enterprise
BeitragVerfasst: So 24.08.03 12:09 
hi
ich habe eine procedure geschrieben, die mir sagt, ob dieses jahr ein schaltjahr ist, oder nicht. diese procedure möchte ich nun in eine function umschreiben, habe aber keine ahnung wie das geht. kann jmd. helfen?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);
var a,i : integer; c : string; t : array [0..25of integer;
begin
 a := strtoint(formatdatetime('yy',date));

 t[0]:=00//idee: wenn 2 letzte ziffern durch 4 teilbar, dann schaltjahr
 for b := 1 to 25 do //25*4=100 => 3 ziffern
  t[b] := t[b-1] + 4//array t wird mit gültigen end-ziffern gefüllt

 c:=('nein'); //norm = kein schaltjahr
 for i := 0 to 25 do //falls eine dieser endeungen zutrifft, dann..
  if a = t[i] then
   c:=('ja'); //... ja!

 showmessage(c);
end;

_________________
you're not be able to help, that you're an human
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: So 24.08.03 12:26 
wer keine Arbeit hat macht sich welche!
Schau die mal die Funktion function IsLeapYear(Year: Word): Boolean an. Die macht genau das, was du willst.
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
hassedelphi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101

WIN XP
D7 Enterprise
BeitragVerfasst: So 24.08.03 12:29 
huch :oops: . naja, könnte mir trotzdem jemand sagen, wie das geht (von proc in fuct)?

_________________
you're not be able to help, that you're an human
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: So 24.08.03 12:37 
ganz einfach, deine Funktion muss das und den Datentyp zurückgeben, den du brauchst:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function IsSchaltJahr(Jahr:Integer):Boolean;
var a,i : integer; c : string; t : array [0..25of integer; 
begin
a := strtoint(formatdatetime('yy',date)); 
 t[0]:=00//idee: wenn 2 letzte ziffern durch 4 teilbar, dann schaltjahr 
 for b := 1 to 25 do //25*4=100 => 3 ziffern 
  t[b] := t[b-1] + 4//array t wird mit gültigen end-ziffern gefüllt 
 result:=false; //norm = kein schaltjahr 
 for i := 0 to 25 do //falls eine dieser endeungen zutrifft, dann.. 
  if a = t[i] then 
   result:=true; //... ja!   
end;

grez
msch

Moderiert von user profile iconUGrohne: Delphi-Tags eingefügt

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
TomT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 116

Suse 9.1 WinXP
D6 Pers
BeitragVerfasst: So 24.08.03 12:40 
So in etwa müsste es gehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function schaltjahr:boolean; 
var a,i : integer; t : array [0..25of integer; 
begin 
 a := strtoint(formatdatetime('yy',date)); 

 t[0]:=00//idee: wenn 2 letzte ziffern durch 4 teilbar, dann schaltjahr 
 for b := 1 to 25 do //25*4=100 => 3 ziffern 
  t[b] := t[b-1] + 4//array t wird mit gültigen end-ziffern gefüllt 

 result:=false; //norm = kein schaltjahr 
 for i := 0 to 25 do //falls eine dieser endeungen zutrifft, dann.. 
  if a = t[i] then 
   result:=true; //... ja! 
end;


MFG TomT


Nachtrag : oh, da war ich wohl zu langsam, sorry

_________________
...und da wurde mir klar, dass eine Toolbar keine Kneipe für Heimwerker ist.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 24.08.03 13:22 
@TomT: Das reicht so nicht, da nicht alle 4 Jahre ein Schaltjahr ist. Ausserdem ist die Funktion wirklich etwas umständlich.
Eine einfache Abfrage
ausblenden Delphi-Quelltext
1:
result:=((a mod 4)=0);					

liefert dasgleiche Ergebnis in einem Schritt.

Hier www.delphi-forum.de/viewtopic.php?t=13946
findest nur ne einfachere, schnellere und genauere Funktion, die sogar den 4000-Jahre-Sonderfall berücksichtigt, was die Delphi-interne Funktion nicht macht!

_________________
We are, we were and will not be.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: So 24.08.03 14:19 
hä, das mit 4000 ist grütze!

Zitat:
Schaltjahr, gegenüber einem Normaljahr um einen Tag (Schalttag 29. Februar) verlängertes Jahr zum Ausgleich der Jahreslängen. Alle durch 4 teilbaren Jahreszahlen sind S. mit bedingter Ausnahme der vollen Jh.-Zahlen, die im Gregorianischen Kalender seit 24.2.1582 nur alle 400 Jahre als S. gelten (also 1900 kein S., 2000 aber wieder S.).


Bei der Berechnung des Schaltjahres sind leider einige Ausnahmen zu beachten:

Im Julianischen Kalender ist jedes durch 4 teilbare Jahr ein Schaltjahr. Das ergibt in 128 Jahren einen Fehler von einem Tag. Seit Einführung des Kalenders (45 v. Chr.) summierte sich der Fehler bis 1582 auf 10 Tage.

Zitat:
Im Gregorianischen Kalender (ab dem 15.Oktober 1582) ist die Definition folgendermaßen: Alle 4 Jahre ein Schaltjahr, alle vollen 100 Jahre nicht,volle 400 Jahre jedoch wieder. Dies bedeutet, der Gregorianische Kalender hat 97 Schaltjahre in 400 Jahren. Das ergibt in 3300 Jahren einen Fehler von einem Tag im Vergleich zum tropischen Jahr.

Leider wurde die Schaltjahrregelung nicht konsequent angewandt: In der Zeit von 45 v. Chr. bis 9 v. Chr. war jedes 3. Jahr ein Schaltjahr. In den Jahren zwischen 9 v. Chr und 8 n. Chr. gab es auf Anordung von Kaiser Augustus keine Schaltjahre (Dies verewigte ihn (angeblich) im Kalender. Der Monat August trägt seinen Namen).

siehe auch www.kalenderlexikon....ntrag=CalcSchaltjahr

grez
msch



nachzulesen in jedem guten Lexikon.

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 24.08.03 15:09 
Also, ganz Grütze ist das nicht, und du wiederlegst dich mit deinen Zitaten selber:
Zitat:
Das ergibt in 3300 Jahren einen Fehler von einem Tag im Vergleich zum tropischen Jahr.

Wenn wir davon ausgehen, dass der Kalender, den wir hier verwenden, der genaueste ist, dann muss man ungefähr alle 3300 Jahre was machen.
Und das wurde auch gemacht, z.b. im Französischen Revolutionskalender (der allerdings nicht verwendet wird)
www.kalendersysteme....gen/kalender_20.html
nur wird da der Wert 4000 genommen, nicht 3300. Und wenn ich richtig weitergelesen habe, dann gehen die noch weiter und führen alle 400.000 Jahre ein Jahr mit 364 Tagen ein...Damit man auch feststellen kann, ob die Dinosaurier an einem 29. Februar oder an einem 1.März ausgestorben sind. Und das ist ja nun mal wirklich von elementarer Bedeutung für die Geschichtsschreibung unseres Planeten!

Aber hauptsache ist doch, dass die Funktion dort wirklich etwas einfacher gestrickt ist, als die, die hier mehrfach gepostet wurde. Denn die ist *Tschuldigung* wirklich grütze.

Nichts für ungut, Daniel

_________________
We are, we were and will not be.