Autor Beitrag
DelphiSchüler1989
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.04.11 17:00 
Servus Leute,
nach langer zeit der Sofaliegerei, bereite ich mich gerade auf meine Abschlussprüfung zum Abitur vor.
Bei der Programmierung mit Delphi bin ich auf einen Problem gestoßen, dass sich nach langem hin und her auch nicht seblst lösen konnte.

Zur Aufgabe:
Im linken Teil des Programms soll die Differenz von 2 Daten in Tagen auf einem Editfeld und gleichzeitig das heutige Datum in einem Label ausgegeben werden.
Im rechten Teil des Programms soll zu einem eingegebenen Datum eine bestimmte Anzahl von Tagen hinzugerechnet werden und als neues Datum in einem Maskeditfeld ausgegeben werden.
Des weiteren sollen die Wochentage der beiden Daten in labels angezeigt werden.

Zum Problem:
Es wird das neue Datum im rechten Teil des Programmes faltsch berechnet.Egal welche Werte eingegeben werden es wird immer der 30.12.1899 als Datum und der gleiche Wochentag wie beim eingegebenen Datum angezeigt.
Ich habe die Variablen zur Prüfung in einem Editfeldt einzeln ausgelesen,
hier stimmen die Werte.
Erst wenn ich mit Hilfe der Prozedur DecodeDate versuche diese in Parameter DatumNeu zu lesen läuf das Programm fehlerhaft.

Würde mich riesig freuen wenn ihr mir weiterhelfen könnt. :o
Vielen Dank schon ma im vorraus.
Euer Delphi Schüler

ausblenden volle Höhe 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:
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:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
{$R *.dfm}
procedure TForm1.ButtonDifferenzClick(Sender: TObject);
VAR DatumAlt,DatumNeu,DatumAktuell:TDateTime;
    JahrAlt,MonatAlt,TagAlt,JahrNeu,MonatNeu,TagNeu,DifferenzJahre,DifferenzMonate,DifferenzTage,Gesamtdifferenz,JahrAktuell,MonatAktuell,TagAktuell:word;
begin
// Datum Einlesen
 DatumAlt:=StrToDate(MaskEditDatumAlt.Text);
 DatumNeu:=StrToDate(MaskEditDatumNeu.Text);
//Zerlegen in Jar,Monat,Tag
 DecodeDate(DatumAlt,JahrAlt,MonatAlt,TagAlt);
 DecodeDate(DatumNeu,JahrNeu,MonatNeu,TagNeu);
//Differenz in Tagen berechnen
 DifferenzJahre:=(JahrNeu-JahrAlt)*365;
 DifferenzMonate:=(MonatNeu-MonatAlt)*30;
 DifferenzTage:=TagNeu-TagAlt;
 Gesamtdifferenz:=DifferenzJahre+DifferenzMonate+DifferenzTage;
// Ausgabe der Differenz in Tagen
 EditDifferenzInTagen.Text:=IntToStr(Gesamtdifferenz);

// AktuellesDatum im LabelAktuellesDatum ausgeben
 DatumAktuell:=Now;
 DecodeDate(DatumAktuell,JahrAktuell,MonatAktuell,TagAktuell);
 LabelAktuellesDatum.Caption:=('Heute ist der '+IntToStr(TagAktuell)+'. Tag des Monats '+IntToStr(MonatAktuell)+' im Jahre '+IntToStr(JahrAktuell));
 LabelAktuellesDatum.Visible:=True;
end;

procedure TForm1.ButtonDatumNeuClick(Sender: TObject);
VAR DatumAlt,DatumNeu:TDateTime;
    JahrAlt,MonatAlt,TagAlt,JahrNeu,MonatNeu,TagNeu,PlusAnzahlTage,PlusJahr1,PlusAnzahlTage1,PlusMonat1,PlusAnzahlTage2,PlusTag:word;
    PlusJahr,PlusMonat:real;
    WochentagAlt,WochentagNeu:string;
begin
//Einlesen
 DatumAlt:=StrToDate(MaskEdit2DatumAlt.Text);
 DecodeDate(DatumAlt,JahrAlt,MonatAlt,TagAlt);
 PlusAnzahlTage:=StrToInt(EditPlusTage.Text);
//Verarbeiten
 CASE DayofWeek(DatumAlt) OF
  1:WochentagAlt:='Sonntag';
  2:WochentagAlt:='Montag';
  3:WochentagAlt:='Dienstag';
  4:WochentagAlt:='Mittwoch';
  5:WochentagAlt:='Donnerstag';
  6:WochentagAlt:='Freitag';
  7:WochentagAlt:='Samstag';
 end;

 CASE DayofWeek(DatumAlt) OF
  1:WochentagNeu:='Sonntag';
  2:WochentagNeu:='Montag';
  3:WochentagNeu:='Dienstag';
  4:WochentagNeu:='Mittwoch';
  5:WochentagNeu:='Donnerstag';
  6:WochentagNeu:='Freitag';
  7:WochentagNeu:='Samstag';
 end;

 PlusJahr:=PlusAnzahlTage/365;
 PlusJahr1:=Trunc(PlusJahr);
 PlusAnzahlTage1:=PlusAnzahlTage-(PlusJahr1*365);

 PlusMonat:=PlusAnzahlTage1/30;
 PlusMonat1:=Trunc(PlusMonat);
 PlusAnzahlTage2:=PlusAnzahlTage1-(PlusMonat1*30);

 PlusTag:=PlusAnzahlTage2;

 JahrNeu:=JahrAlt+PlusJahr1;
 MonatNeu:=MonatAlt+PlusMonat1;
 TagNeu:=TagAlt+PlusTag;
// Ausgeben
 LabelWochentagAlt.visible:=true;
 LabelWochentagAlt.Caption:=(WochentagAlt);
 LabelWochentagNeu.visible:=true;
 LabelWochentagNeu.Caption:=(WochentagNeu);
 <span style="color: red">DecodeDate(DatumNeu,JahrNeu,MonatNeu,TagNeu);    //Bis hierfunktionierts</span>
 MaskEdit2DatumNeu.Text:=DateToStr(DatumNeu);
end;

end


Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: U-Tag-Chaos bereinigt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 27.04.11 17:14 
user profile iconDelphiSchüler1989 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
 <span style="color: red">DecodeDate(DatumNeu,JahrNeu,MonatNeu,TagNeu);    //Bis hierfunktionierts</span>
 MaskEdit2DatumNeu.Text:=DateToStr(DatumNeu);
end;

end
Einfach einmal auf die Compilerwarnungen zu schauen ist heutzutage wohl nicht mehr üblich oder wie? Da sollte nämlich stehen, dass DatumNeu nicht initialisiert wurde. Und dem ist auch so. Du packst da nirgends einen Wert hinein.

Bist du sicher, dass du verstanden hast was DecodeDate macht? :gruebel:
DelphiSchüler1989 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.04.11 18:29 
DecodeDate zerlegt(decodiert) den im Parameter DatumNeu übergebenen Wert in die Werte JahrNeu, MonatNeu, TagNeu.
Wenn DecodeDate nicht funktioniert, welche Anweisung kann ich benutzen um die Werte JahrNeu, MonatNeu, TagNeu im Parameter DatumNeu in eine Maskeditfeldt auszugeben?
Euer Delphi Schüler
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 27.04.11 18:55 
Naja, aber wie willst du denn DatumNeu ausgeben bevor du überhaupt etwas hineingelegt hast?!? :shock:
DelphiSchüler1989 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.04.11 18:57 
Alles Klar.Problem gelöst die gesuchte Prozedur heißt EnCodeDate();
Vielen Dank für den kostruktieven Denkanstoß unnd noch einen Schönen Abend. ;)