Entwickler-Ecke
Sonstiges (Delphi) - Kalenderwoche ermitteln
Licki - Fr 19.09.03 11:57
Titel: Kalenderwoche ermitteln
Tach.
In Delphi ist es ja relativ einfach das Datum auszulesen etc. . Jedoch stehe ich vor einem anderen Problem. Ich möchte in meinem Programm die Kalenderwoche angeben. Wie funktioniert das? Hat sich jemand damit schon beschäftigt und hat einen Quellcode dazu?
Greez
Andre
MAlsleben - Fr 19.09.03 12:16
Hi,
ab Delphi 6 gibt es eine Funktion WeekOf oder WeekOfTheYear. In vorherigen Versionen sieht das etwas bescheidener aus.
Gruß Micha.
Licki - Fr 19.09.03 12:25
Leider habe ich nur Delphi 3. Kann man eventuell die Funktion aus der Unit herausnehmen und in Delphi 3 einsetzen? Hat jemand Tipps?
Klabautermann - Fr 19.09.03 12:38
Hallo,
Licki hat folgendes geschrieben: |
Kann man eventuell die Funktion aus der Unit herausnehmen und in Delphi 3 einsetzen? |
das währe Illegal, weil das Copyright für die Funktion bei Borland liegt.
Ich habe aber eine solche Funktion mal vor 'ner ewigkeit geschrieben (Copyright liegt also bei mir ;)). Vieleicht genügt sie dir ja auch.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function Kalenderwoche(aTag : tDateTime) : Byte; VAR aDay, aMonat, aJahr : Word; BeginOfFirstWeek, LastDayOfYear, Tmp : tDateTime; BEGIN DecodeDate(aTag, aJahr, aMonat, aDay); tmp := EncodeDate(aJahr, 1, 1); LastDayOfYear := EncodeDate(aJahr, 12, 31); IF (DayOfWeek(tmp) IN [1, 6, 7]) THEN BeginOfFirstWeek := MondayOfWeek(tmp + 7) ELSE BeginOfFirstWeek := MondayOfWeek(tmp); RESULT := Trunc((MondayOfWeek(aTag) - BeginOfFirstWeek) / 7) + 1; IF Result < 1 THEN Result := Kalenderwoche(MondayOfWeek(aTag)); IF (DayOfWeek(LastDayOfYear) IN [2..4]) AND (Trunc(LastDayOfYear- aTag) < 3) THEN Result := 1; END; |
Diese verwendet die ebenfalls selbstgamachte Funktion ModayOfWeek, welche so aussieht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function MondayOfWeek(aDay : tDateTime) : tDateTime; VAR delta : Byte; begin delta := DayOfWeek(aDay); IF (Delta = 1) THEN Delta := 8; Dec(Delta, 2); Result := Trunc(aDay) - Delta; end; |
Gruß
Klabautermann
smiegel - Fr 19.09.03 12:48
Hallo,
es geht auch mit weniger Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function KalenderWoche(const aDatum:TDateTime): Integer; var Day :Integer; Y, M, D:Word; begin Day:=DayOfWeek(aDatum)-1; if (Day<=0) then Day:=7; DecodeDate(aDatum+4-Day, Y, M, D); Result:=Round(((aDatum+8-Day)-EncodeDate(Y, 1, 1))/7); end; |
Licki - Fr 19.09.03 13:11
Dank euch, das sieht doch schonmal klasse aus. :)
Leider gelingt es mir nicht, es in mein Projekt einzubinden. Angenommen ich will ein Label mit der Kalenderwoche beschriften. Wie geht das?
Delphi-Quelltext
1:
| Label1.Caption:=KalenderWoche; |
So müsste es doch eigentlich gehen, oder? Wird ja theoretisch die Funktion aufgerufen und der errechnet Wert, also im Endefekt KW eingesetzt. Ist nun mit dem Beispiel von smiegel gedacht. Irgendwie komme ich gar nicht darauf, an was es liegen könnte oder weiß ich es nicht die Funktion einzusetzen?
Andi1982 - Fr 19.09.03 13:16
Die Function gibt das ergebnis als Integer zurück, musst also so machen:
Delphi-Quelltext
1:
| Label1.Caption:=IntToString(KalenderWoche); |
Allerdings kanne es sein dass du noch ein Datum mitgeben musst:
Delphi-Quelltext
1:
| Label1.Caption:=IntToString(KalenderWoche(DatumMitgeben)); |
Da bin ich mir aber nicht sicher weil ich das TDateTime nicht kenne. Kann ja sein dass das das datum schon reinstellt.
Gruß Andi
Licki - Fr 19.09.03 13:27
Nein, Datum muss man nicht mit übergeben, ist ja im Funktionskopf schon als Konstante angegeben. Also aDatum hat den Wert TDateTime, also das aktuelle Datum. Steht also schon drin und muss man nicht übergeben... Komme leider trotzdem nicht weiter...
Andi1982 - Fr 19.09.03 13:32
Vielleicht musst du noch die Unit DateUtils einbinden!! ein versuch ists wert! einfach bei uses eintragen!
smiegel - Fr 19.09.03 13:42
Hallo,
das Datum musst Du schon übergeben. Wenn eine Konstante in einer Funktionsdeklaration steht bedeudet das, dass der Wert als Zeiger übergeben und somit keine Lokalkopie erzeugt wird.
In Deinem Fall könnte es so aussehen:
1.) Kalenderwoche des heutigen Datums:
Delphi-Quelltext
1:
| Label1.Caption:=IntToStr(KalenderWoche(Date)); |
2. Kalenderwoche für den 31.12.2003:
Delphi-Quelltext
1:
| Label1.Caption:=IntToStr(KalenderWoche(EncodeDate(2003, 12, 31))); |
Licki - Fr 19.09.03 14:40
Hat klasse geklappt und wieder viel dazugelernt. :) Danke euch. :) Habe die Funktion nun ein bißchen umgestellt, dass man das Datum nicht übergeben muss, für den, wo es interessiert. ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function kalenderwoche: Integer; var Tag: Integer; d: TDateTime; begin Tag:=DayOfWeek(d)-1; if (Day<=0) then Day:=7; DecodeDate(d+4-Tag, Year, Month, Day); Result:=Round(((d+8-Tag)-EncodeDate(Year, 1, 1))/7); end; |
Der Aufruf dazu mit Integer zu String- Kovertierung:
Delphi-Quelltext
1:
| Label1.Caption:=IntToStr(kalenderwoche); |
Vielen Dank nochmal an Euch. :)
barfuesser - Fr 19.09.03 14:46
Und zu welchem Tag erhältst Du damit die Kalenderwoche? Und was für einen Wert hat Dein d?
Ich habe den Eindruck, daß Du erstmal Delphi lernen solltest, eh Du Funktionen von anderen so abänderst, daß sie überhaupt nicht mehr sinnvoll eingesetzt werden oder funktionieren können.
barfuesser
Licki - Fr 19.09.03 15:07
Ja, ich bin ja dabei Delphi zu lernen, und Fehler zu machen ist die Beste Art zu lernen.
Mein d hat den Wert TDateTime.
Im Endefekt ist es ja genau das Datum, welches bei der anderen Funktion übergeben wird, oder? Was ist also daran falsch, bei mir funktioniert es...
Andi1982 - Fr 19.09.03 15:08
Ich dachte durch das TDateTime steht in D das aktuelle Tagesdatum. Ist das nicht so???
Licki - Fr 19.09.03 15:14
Doch, ist so...
Weil ja d das aktuelle Datum ist. Mit TDateTime wird ja das aktuelle Datum festgelegt, meine ich.
Und vorher, also bei der Funktion von smiegel stand aDatum, ebenfalls als TDateTime festgelegt, nur das man das aktuelle Datum übergeben musste. Und das mit dem übergeben wollte ich wegmachen und habe deshalb überall d mit dem aktuellen Datum gesetzt (welches ja eh übergeben worden wäre). Daher ist das für mich logisch und funktioniert. Kann aber auch sein, dass ich micht täusche, wäre also nett, wenn du, barfuesser, dazu meinst, was ich falsch gemacht habe.
Gausi - Fr 19.09.03 16:34
Ehhm.. wenns bei dir klappt, is ja alles gut, aber ich bin jetzt etwas verwirrt.
Durch die Variablen-Deklaration
Wird eine Variable vom Typ TDateTime deklariert und, weil es ein Standardtyp ist, auch initialisiert. Intern ist TDateTime dasgleiche wie Double, und sollte also mit 0 initialisiert werden. Delphi beginnt seine Zeitrechnung mit 12/30/1899 12:00 am. (siehe Hilfe). Das hat erstmal nix mit dem aktuellen Datum zu tun!!
Das heißt, die Funktion berechnet immer ungefähr 52 (evtl auch 51 oder 53), denn der 30.12.1899 sollte ca. in der 52 Woche liegen.
Skeptisch bin ich auch beim Gebrauch von ROUND, logischer erscheint mir TRUNC.
Wenn ich mich irre, dann klärt mich bitte auf ;-)
smiegel - Fr 19.09.03 18:27
Hallo,
@Gausi:
Versuche einmal die Kalenderwoche des 10.08.2003 mit Trunc und mit Round zu ermitteln. Ich denke dann sollte sich meine Formel von alleine erklären.
@Licki:
Bevor Du irgenwelche Dinge verschlimmbesserst solltets Du erst einmal die Positings vernünftig lesen. Ich hatte schon geantwortet, dass Du ein Datum übergeben musst, sogar mit Beispielen.
Als nächstes würde ich mir einmal den Unterschied zwischen Variablendeklaration, -typen und -zuweisung anschauen.
Klabautermann - Fr 19.09.03 18:47
Hallo,
ich möchte dabei auch auf das hiesige
Anfänger Tutorial [
http://www.delphi-forum.de/viewtopic.php?t=64] hinweisen. Besonders die Teile 2 & 3 sind für diesen konkreten Fall sicherlich interessant.
Bitte nimm das nciht über Licki, niemand hier will dir etwas böses, nur deine Behaubtungen lassen vermuten, dass dir tatsächlich einige Grudlagen fehlen, diese können dir solche Tutorials besser beibringen als wir hier, da wir für jeden sonderfall eine spezielle erklährung liefern, die Tuts sich aber bemühen allgemein zu bleiben.
Trotzdem beantworten wir natürlich auch weiterhin jede Frage gerne.
Gruß
Klabautermann
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!