Autor |
Beitrag |
stefanstp
      
Beiträge: 106
|
Verfasst: Mi 04.12.02 17:22
Ich habe ein Geburtstagsprogramm programmiert und es gibt einen 7 Tage vorher eine Warnmeldung. Dafür habe ich ein Stringgrid benutzt. Das Geburtsjahr wird auch angezeigt (in ein Memofeld). Jedoch kommt es leider vor, wenn jemand heute Geburtstag hat, meine Berechnung um ein Jahr nicht hinhaut. Das Problem ist bloß, es ist nicht bei jeder Person so. Bei jüngeren Personen haut es nicht hin, bei älteren schon usw. Keine Ahnung wieso?
Wer kann helfen, vielleicht ist es ja auch nur ein simpler Rechenfehler. Hier der Code:
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: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| procedure TForm1.Label_Geburtstagsdaten_pruefenClick(Sender: TObject); var Jahr,Monat,Tag : Word; now_Jahr,now_Monat,now_Tag : Word; Geburtstag : TDate; x:integer; Geburtstag_dieses_Jahr:tdate; begin for x:= 1 to Grid.Rowcount +10 do begin try Grid.cols[4].Strings[x] := Grid.cols[3].Strings[x]; DecodeDate( StrtoDate(Grid.cols[4].Strings[x]),Jahr,Monat,Tag); DecodeDate( now,now_Jahr,now_Monat,now_Tag); Geburtstag := EncodeDate( now_jahr,Monat,Tag); Grid.cols[4].Strings[x] := Grid.cols[3].Strings[x]; Grid.cols[4].Strings[x] := inttostr(Trunc(Geburtstag) - Trunc(now));
Geburtstag :=StrtoDate(Grid.cols[3].Strings[x]); Geburtstag_dieses_Jahr := EncodeDate(now_jahr,Monat,Tag); // Geburtstag dieses Jahr Edit_Jahre.text := inttostr( Trunc( ( Trunc(now) - Trunc(Geburtstag) ) /365.25 +1));
if strtoint (Grid.cols[4].Strings[x]) =7 then begin Form_Geburtstag.memo1.Text:=Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]+' hat in ' + Grid.cols[4].Strings[x] + ' Tagen Geburtstag und wird '+ edit_jahre.Text+' Jahre alt!!! Am besten gleich ein Geschenk kaufen.'+nz +nz + Grid.cols[5].Strings[x] ; Form_Geburtstag.Caption:='Geburtstagsinformation über '+Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]; Form_Geburtstag.ShowModal; end ;
if strtoint (Grid.cols[4].Strings[x]) =6 then begin Form_Geburtstag.memo1.Text:=Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]+' hat in ' + Grid.cols[4].Strings[x] + ' Tagen Geburtstag und wird '+ edit_jahre.Text+' Jahre alt!!!'+nz +nz + Grid.cols[5].Strings[x] ; Form_Geburtstag.Caption:='Geburtstagsinformation über '+Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]; Form_Geburtstag.ShowModal; end;
if strtoint (Grid.cols[4].Strings[x]) =5 then begin Form_Geburtstag.memo1.Text:=Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]+' hat in ' + Grid.cols[4].Strings[x] + ' Tagen Geburtstag und wird '+ edit_jahre.Text+' Jahre alt!!!'+nz +nz + Grid.cols[5].Strings[x] ; Form_Geburtstag.Caption:='Geburtstagsinformation über '+Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]; Form_Geburtstag.ShowModal; end;
if strtoint (Grid.cols[4].Strings[x]) =4 then begin Form_Geburtstag.memo1.Text:=Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]+' hat in ' + Grid.cols[4].Strings[x] + ' Tagen Geburtstag und wird '+ edit_jahre.Text+' Jahre alt!!!'+nz +nz + Grid.cols[5].Strings[x] ; Form_Geburtstag.Caption:='Geburtstagsinformation über '+Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]; Form_Geburtstag.ShowModal; end;
if strtoint (Grid.cols[4].Strings[x]) =3 then begin Form_Geburtstag.memo1.Text:=Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]+' hat in ' + Grid.cols[4].Strings[x] + ' Tagen Geburtstag und wird '+ edit_jahre.Text+' Jahre alt!!! Schon ein Geschenk gekauft?'+nz +nz + Grid.cols[5].Strings[x] ; Form_Geburtstag.Caption:='Geburtstagsinformation über '+Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]; Form_Geburtstag.ShowModal; end; if strtoint (Grid.cols[4].Strings[x]) =2 then begin Form_Geburtstag.memo1.Text:=Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]+' hat in ' + Grid.cols[4].Strings[x] + ' Tagen Geburtstag und wird '+ edit_jahre.Text+' Jahre alt!!!' +nz +nz + Grid.cols[5].Strings[x] ; Form_Geburtstag.Caption:='Geburtstagsinformation über '+Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]; Form_Geburtstag.ShowModal; end; if strtoint (Grid.cols[4].Strings[x]) =1 then begin Form_Geburtstag.memo1.Text:=Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]+' hat in ' + Grid.cols[4].Strings[x] + ' Tag Geburtstag und wird '+ edit_jahre.Text +' Jahre alt!!!'+nz +nz + Grid.cols[5].Strings[x] ; Form_Geburtstag.Caption:='Geburtstagsinformation über '+Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]; Form_Geburtstag.ShowModal; end;
//hier ist jetzt der Fehler==> if strtoint (Grid.cols[4].Strings[x]) =0 then begin Form_Geburtstag.memo1.Text:=Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]+' hat heute Geburtstag und ist '+ edit_jahre.Text +' Jahre alt geworden!!! Am besten gleich Geschenk überreichen bzw. Anrufen!.'+nz +nz + Grid.cols[5].Strings[x] ; Form_Geburtstag.Caption:='Geburtstagsinformation über '+Grid.cols[2].Strings[x]+' '+ Grid.cols[1].Strings[x]; Form_Geburtstag.ShowModal; //FehlerEnde end; |
Danke im Voraus
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Do 05.12.02 09:38
Hi
ich hab das jetzt nicht genau angeschaut, aber die Berechnung des Alters mit einer Division durch 365.25 ist echt problematisch. Erstens weil der Wert an sich nicht korrekt ist und zweitens weil du damit eben Rechenungenauigkeiten bekommst.
Stell dir mal vor es wäre jemand genau zwei Jahre alt und er wäre zwischen einer Schaltjahrperiode geboren. Das wären dann 730 Tage. Wenn du das durch 365.25 teilst und die Nachkommatstelle abschneidest kannst du ja selber sehen was dabei rauskommt.
Nimm einfach die Differenz zwischen Geburtsjahr und aktuellem Jahr + 1, dann kommst du zum richtigen Ergebnis.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
stefanstp 
      
Beiträge: 106
|
Verfasst: Do 05.12.02 14:20
Titel: Wie jetzt genau?
Könntest Du mir bitte den Quellcode schreiben, wie Du das jetzt genau meinst, ich verzweifel da noch.
Danke im voraus
STEFAN
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Do 05.12.02 14:47
Hi
anstelle der Zeile:
Quelltext 1:
| Edit_Jahre.text := inttostr( Trunc( ( Trunc(now) - Trunc(Geburtstag) ) /365.25 +1)); |
solltest du schreiben:
Quelltext 1:
| Edit_Jahre.text := now_jahr - jahr + 1; |
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
stefanstp 
      
Beiträge: 106
|
Verfasst: Fr 06.12.02 09:42
Titel: Das funktioniert jetzt....aber....
Also jetzt funktioniert es. Jedenfalls glaube ich es, habe ein paar Geburtsdaten durchgespielt.
Aber eins funktioniert nicht, und zwar habe ich den gleichen Quellcode genommen für die Funktion, wenn man eine Zelle im Stringrid anklickt (also auf eine Person), das im Form1.caption steht, wie Alt derjenige ist.
Der Fehler liegt halt im Jahr, hat er im nächsten Jahr Geburtstag, dann stimmt es um ein Jahr nicht, sind wir aber im aktuellem Jahr, wo derjenige Geburtstag hat, dann stimmt es.
Kannst Du mir bitte sagen, wie ich dieses Problem gelöst bekomme? Besten Dank im voraus und ein schönes Wochenende.
STEFAN
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Fr 06.12.02 11:53
Also, das Problem ist, dass du nicht das aktuelle Alter brauchst, sondern wissen willst, wie alt jemand wird.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function WieAltWird(Geburtstag: TDateTime): integer; var actYear, actMonth, actDay, birthYear, birthMonth, birthDay: word; begin DecodeDate(Geburtstag, birthYear, birthMonth, birthDay); DecodeDate(Date, actYear, actMonth, actDay); if EncodeDate(actYear, birthMonth, birthDay) < Date then Result := actYear - birthYear + 1 else Result := actYear - birthYear; end; |
In dem Zustand wird wenn der Geburtstag auf den aktuellen Tag fällt, noch das aktuelle Alter zurückgegeben. Wenn du willst, dass auch in dem Fall schon das Alter beim nächsten Geburtstag berechnet wird, müsste der Vergleich auf <= geändert werden.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
stefanstp 
      
Beiträge: 106
|
Verfasst: Do 12.12.02 09:24
Titel: Danke!
Hat super geklappt! Ich habe jedenfalls ein paar Geburtsdaten durchprobiert und funktionierte alles super, in diesem und im nächsten Jahr!
Danke für deine Hilfe!
STEFAN
|
|
|