Autor |
Beitrag |
Licki
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: Fr 19.09.03 11:57
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
      
Beiträge: 303
W2k,WinXP
D3 - DXE3 Enterprise
|
Verfasst: 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.
_________________ Viele Wege führen nach Rom.
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: 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; |
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: 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
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: 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
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: 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
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Fr 19.09.03 13:32
Vielleicht musst du noch die Unit DateUtils einbinden!! ein versuch ists wert! einfach bei uses eintragen!
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: 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))); |
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: Fr 19.09.03 14:40
|
|
barfuesser
      
Beiträge: 324
|
Verfasst: 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 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: 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.
Delphi-Quelltext
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
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Fr 19.09.03 15:08
Ich dachte durch das TDateTime steht in D das aktuelle Tagesdatum. Ist das nicht so???
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Licki 
      
Beiträge: 132
Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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
Delphi-Quelltext
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 
_________________ We are, we were and will not be.
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: 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.
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Fr 19.09.03 18:47
Hallo,
ich möchte dabei auch auf das hiesige Anfänger Tutorial 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
|
|
|