Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Suche Datumroutine - Mit Monaten rechnen


SpaghettiCodix - Do 27.09.07 15:48
Titel: Suche Datumroutine - Mit Monaten rechnen
Hallöchen,

wer kann mir helfen? Ich möchte ein Datum mit Monaten hochrechnen, also zum Beispiel
zum 1.01.2001 48 Monate zuzählen.

Wenn ich mit DecodeDate das Datum in Jahre, Monate und Tage aufteile, kann ich nicht einfach zur Variablen Monat die Zahl 48 addieren, weil es sonst beim Encodieren eine Fehlermeldung gibt.
Ich habe Delphi 2005.


Gausi - Do 27.09.07 15:56

Dafür gibt es Funktionen wie z.B. incMonth


SpaghettiCodix - Do 27.09.07 16:08
Titel: Danke Gausi :-)
Danke Gausi, bin etwas unbeholfen mit der Delphi 2005 Hilfe.
Hatte vorher Delphi 2. Dort war es mit der Hilfe irgendwie einfacher.

Aber gut, da muß ich jetzt nicht selber so eine Funktion schreiben.
Nicht, daß es mich nicht reizen würde, aber da geht viel Zeit verloren.

Nochmals vielen Dank für Deinen Hinweis.


GTA-Place - Do 27.09.07 16:17

So sieht die IncMonth()-Funktion aus. Sei froh, dass du sie nicht selber schreiben musst ;-):


Delphi-Quelltext
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:
function IncMonth(const DateTime: TDateTime; NumberOfMonths: Integer): TDateTime;
var
  Year, Month, Day: Word;
begin
  DecodeDate(DateTime, Year, Month, Day);
  IncAMonth(Year, Month, Day, NumberOfMonths);
  Result := EncodeDate(Year, Month, Day);
  ReplaceTime(Result, DateTime);
end;

procedure IncAMonth(var Year, Month, Day: Word; NumberOfMonths: Integer = 1);
var
  DayTable: PDayTable;
  Sign: Integer;
begin
  if NumberOfMonths >= 0 then Sign := 1 else Sign := -1;
  Year := Year + (NumberOfMonths div 12);
  NumberOfMonths := NumberOfMonths mod 12;
  Inc(Month, NumberOfMonths);
  if Word(Month-1) > 11 then    // if Month <= 0, word(Month-1) > 11)
  begin
    Inc(Year, Sign);
    Inc(Month, -12 * Sign);
  end;
  DayTable := @MonthDays[IsLeapYear(Year)];
  if Day > DayTable^[Month] then Day := DayTable^[Month];
end;


SpaghettiCodix - Fr 28.09.07 21:54

user profile iconGTA-Place hat folgendes geschrieben:
So sieht die IncMonth()-Funktion aus. Sei froh, dass du sie nicht selber schreiben musst ;-):


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure IncAMonth(var Year, Month, Day: Word; NumberOfMonths: Integer = 1);
var
  DayTable: PDayTable; // <- was ist denn das fürn Zeiger?
  .....
begin


Na gottseidank. Ich hatte auf meinem alten Rechner mal eine Funktion, die fast fehlerfrei
funzte. Allerdings mit vielen 'If' Bedingungen und ehrlich, ich würde diese Funktion keinem Delphianer zeigen, ohne rot zu werden.

Kannst Du mir sagen, was das für ein Zeiger ist in der Funktion IncAMonth?


GTA-Place - Sa 29.09.07 08:40


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  PDayTable = ^TDayTable;
  TDayTable = array[1..12of Word;

const
  MonthDays: array [Boolean] of TDayTable =
    ((312831303130313130313031),
     (312931303130313130313031));


SpaghettiCodix - Mi 03.10.07 10:51

user profile iconGTA-Place hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  PDayTable = ^TDayTable;
  TDayTable = array[1..12of Word;

const
  MonthDays: array [Boolean] of TDayTable =
    ((312831303130313130313031),
     (312931303130313130313031));


Saubere Sache. Danke GTA-Place.

Wenn ich mir vor Augen halte, was ich mir für gedankliche Verrenkungen mache, um eine Funktion hinzubekommen. Wenn Du nun selber nicht der Entwickler dieser Funktion bist, wie kommst Du an den Quelltext der vordefinierten Funktionen in Delphi?
Kann man den Quelltext irgendwo nachlesen? Ich hoffe, daß ich Dir mit meiner Fragerei nicht auf den Keks gehe :-)


GTA-Place - Mi 03.10.07 12:18

Bei den Pro-Versionen von Delphi sind die Sources dabei.


Arne Danikowski - Mi 03.10.07 20:18

Kannst aber auch einfach das Datum + Tage rechnen. Wenn man das nur einmal braucht reicht das häufig auch und der Quellcode wird kleiner.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Var tag1,tag2:tday

begin
//aktuelles Datum in Variable kann auch ein anderes Datum sein
tag1:=now;
// tag1:='01.01.2001'
//Datum + 48 Monate (1461 Tage) + 1 Tag wegen Schaltjahr 
tag2:=(tag1+1461)
//Ausgabe in zb. ein Edit Feld
edit1.text:=DateToStr (tag2);

end:


hansa - Mi 03.10.07 23:42

user profile iconSpaghettiCodix hat folgendes geschrieben:
..wie kommst Du an den Quelltext der vordefinierten Funktionen in Delphi?...


Einfach durch nachdenken und lernen. Das bezieht sich allerdings auf die Logik der "vordefinierten Funktionen". 8) Ansonsten eben gucken, wo das geklaut werden kann. :mrgreen: