Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Tage in Jahre (https://www.delphipraxis.net/3910-tage-jahre.html)

The Re@l 5. Apr 2003 16:24


Tage in Jahre
 
Holla

Ich hab folgendes Porblem:

Code:
var
d: Tdatetime;
i: integer;
begin
d := Query1.FieldByName('date').AsDateTime;
i := Round(now - d);
edit2.Text := intToStr(i)
so der gibt mir nun die differenz in Tagen zurück, aber ich finde keine Lösung es in Jahre auszugeben, geht das überhaupt? Von wegen Schaltjahr etc.

Cya
The Re@l

Haegar 5. Apr 2003 16:35

rechne es doch einfach um 1 jahr hat 365 tage (abgesehen vom schaltjahr). brauchst doch also nur das ergebniss durch 365 teilen!

edit: das mit dem schaltjahr hatte ich überlesen

gruss haegar

The Re@l 5. Apr 2003 16:43

das dumme ist das ich es als erinnerungsFunktion einbauen wollte der mir direkt sagt wie alt die Person ist, aber wenn ich durch 365 teile kommt die rechnung nich aus.

Haegar 5. Apr 2003 16:53

ich hab noch ne idee, wird aber vielleicht umständlicher als nötig.
alle 4 jahre (1460 Tage) haste ein tag mehr pro jahr.
kannste da nicht rekursiv rechnen und immer prüfen ob irgendwas (hab noch nicht ganz gefunden was) durch 1460 gleich 0 als rest liefert...dann haste schaltjahr, und deine tage im jahr sind nun 366 und wenn der rest<>0 ist, dann 365 tage!

einigermaßen verstanden? :roll:
gruss haegar

The Re@l 5. Apr 2003 16:54

jop verstanden klingt auch logisch ich setz mich mal ran :coder:

Dank dir erstmal

Haegar 5. Apr 2003 16:56

kannste mir die lösung dann mal zeigen? würd mal gern sehen was ich da verbrochen hab ;))

gruss haegar

The Re@l 5. Apr 2003 17:11

Ich hab mir gerade noch was anderes überlegt, das, glaub ich, einfacher ist.
Und zwar lasse ich die Datums vergleichen, wenn Tag und Monat identisch ist, soll er mir ne Meldung machen und vom Jahr die Differenz ausgeben.

The Re@l 5. Apr 2003 18:57

So funktionierts

Code:
var
 datum1, datum2: TDatetime;
 i: Integer;
begin
  IF DBEdit10.Text <>'' then begin
  datum1:= Query1.FieldByName('date').AsDateTime;
  datum2:=now;

  i := round(datum2-datum1);
  i := (i * 4);
  edit2.text := (intToStr(i Div 1461)) + ' jahre';
  end else begin
  edit2.Text := '';
  end;
end;
das war doch so wie du meintest @ haegar, oder?

woki 5. Apr 2003 19:31

Hallo,

mal daran gedacht die Funktion

YearOf()

function YearOf(const AValue: TDateTime): Word;

Die Funktion gibt das Jahr zurück, das von einem TDateTime-Wert repräsentiert wird.

Zusammen mit:
function DayOfTheYear(const AValue: TDateTime): Word;

Die Funktion gibt die Anzahl der Tage zwischen dem angegebenen TDateTime-Wert und dem 31. Dezember des vorhergehenden Jahres an.

Sollte dies doch auch das Problem lösen?

Gruß
Wolfgang

Haegar 5. Apr 2003 19:38

also wie gesagt so ne richtig fertige vorstellung hatte ich davon noch nicht, aber ob das mit dem rekursiv überhaupt nötig/praktisch gewesen wäre bezweifel ich selbst ;)

gruss haegar

Duffy 6. Apr 2003 11:00

Hallo,
ich weis ja nicht was Du vor hast. Wenn Du aber nur das Alter in Jahren haben willst, dann decodiere (DecodeDate) doch einfach beide Datumsfelder und ziehe dann Jahr heute von Jahr damals ab. Jetzt brauchst Du nur schauen ob Tag und Monat vor oder gleich oder nach deinem Stichtag ist. Wenn kleiner dann einfach 1 vom Jahr abziehen.
Alles verstanden?

bye

The Re@l 6. Apr 2003 13:34

So Nun funzt es auch richtig

Delphi-Quellcode:
procedure TForm3.DBEdit10Change(Sender: TObject);

var
 datum1, datum2,Dneu,dneu1: TDatetime;
 i: Integer;
 d,m,y,d1,y1,m1 : Word;
begin
  IF DBEdit10.Text <>'' then begin
  datum1:= Query1.FieldByName('date').AsDateTime;
  datum2:=now;
  decodedate(datum1,y,m,d);
  decodedate(datum2,y1,m1,d1);
  dneu := encodedate(1,m,d);    //Geburtsdatum
  dneu1 := encodedate (1,m1,d1); //aktuelles datum
  If dneu > dneu1 then
     i := Round((y1 - y)-1);
     edit2.Text := IntToStr(i) + ' Jahre';
  If dneu < dneu1 then
     i := Round(y1 - y);
     edit2.Text := IntToStr(i) + ' Jahre';
  If dneu = dneu1 then
     i := Round(y1 - y);
     edit2.Text := IntToStr(i) + ' Jahre';
  end else begin
  Edit2.Text := '';
  end;

end;
Thx @ all

Duffy 6. Apr 2003 14:21

Hallo,
als Function wärs schöner gewesen !
Delphi-Quellcode:
function AlterInJahren(const Damals, Heute: TDateTime): Integer;
var
   DamalsTag, DamalsMonat, DamalsJahr: Word;
   HeuteTag, HeuteMonat, HeuteJahr: Word;
begin
  if Heute < Damals then
  begin
     Result := -1
  end
  else
  begin
    DecodeDate (Damals, DamalsJahr, DamalsMonat, DamalsTag);
    DecodeDate (Heute, HeuteJahr, HeuteMonat, HeuteTag);
    Result := HeuteJahr - DamalsJahr;
    if (HeuteMonat <= DamalsMonat) and (HeuteTag < DamalsTag) then
    begin
      Dec (Result);
    end;
  end;
end;
Delphi-Quellcode:
procedure TForm3.DBEdit10Change(Sender: TObject);

var
datum1, datum2,Dneu,dneu1: TDatetime;
i: Integer;
d,m,y,d1,y1,m1 : Word;
begin
  IF DBEdit10.Text <>'' then begin
  datum1:= Query1.FieldByName('date').AsDateTime;
  datum2:=now;
  edit2.Text := IntToStr(AlterInJahren(datum1, datum2) + ' Jahre';
  end else begin
  Edit2.Text := '';
  end;
end;
bye

The Re@l 8. Apr 2003 15:55

Sorry das ich erst jetzt schreibe, aber mein Motherboard hatte den löffel abgegeben, Deine Variante gefällt mir irgendwie besser.

mmhh auf jedenfall Danke nochmal für eure hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz