![]() |
Delphi-Version: 10.4 Sydney
Tagesanzahl Februar eines Jahres
Hallo Leute,
ich hab jetzt sehr lange herumgesucht und auch einige Foreneinträge gefunden, die mich etwas weitergebracht haben. Jedoch führte keines meiner Experimente zu dem Ergebnis, welches ich im Sinn hatte. Dabei sieht die Problemstellung für mich doch recht banal aus... Ich möchte eine Altersberechnung durchführen. Dazu benutze ich 3 Comboboxen. cbbDay cbbMonth cbbYear Die eigentliche Altersberechnung führe ich hiermit durch: ![]() Ich möchte mit einbauen, dass je nachdem welcher Monat in cbbMonth ausgewählt wird, die monatsspezifische Anzahl an Tagen in cbbDay geladen wird. Das klappt auch für alle Monate. Bloß nicht für den Februar. Mein Versuch:
Delphi-Quellcode:
Vorausgesetzt ich wähle 2020 in cbbYear, bringt er mir den Fehler
var
days: Cardinal; begin ... days := DaysInMonth(StrToDate(cbbYear.Text + '.02')); ... end;
Code:
Das seh ich auch ein.
2020.02 ist kein gültiges Datum
Aber ich weiß einfach nicht wie ich das nun lösen soll. Kompletter Code der Prozedur:
Delphi-Quellcode:
Wie gesagt, ich denke die Lösung ist einfach, da mir auch die OH sagt, dass ich doch nur den Monat in TDateTime eingeben soll. :|
procedure TForm1.cbbMonthClick(Sender: TObject);
var i: Integer; days: Cardinal; begin if cbbMonth.ItemIndex >= 0 then begin cbbDay.Enabled := True; if cbbMonth.ItemIndex in [0, 2, 4, 6, 7, 9, 11] then // Monate mit 31 Tagen begin for i := 1 to 31 do // Füge 31 Items(Tage) der cbbDay hinzu begin cbbDay.Items.Add(IntToStr(i)); end; end else begin // alle anderen Monate if cbbMonth.ItemIndex = 1 then // Für Monat Februar begin days := DaysInMonth(StrToDate(cbbYear.Text + '.02')); for i := 1 to days do // Füge die jahrespezifische Tagesanzahl für Februar hinzu begin cbbDay.Items.Add(IntToStr(i)); end end else begin for i := 1 to 30 do // Monate mit 30 Tagen begin cbbDay.Items.Add(IntToStr(i)); end; end; end; end else begin cbbDay.Enabled := False; end; end; Ich weiß aber nicht, wie das aussehen soll. Ich hoffe ihr könnt mir weiterhelfen. VG Kratos |
AW: Tagesanzahl Februar eines Jahres
.. versuche mal
Delphi-Quellcode:
Grüße
DaysInAMonth(year, month);
Klaus |
AW: Tagesanzahl Februar eines Jahres
Versuch es mal damit:
Delphi-Quellcode:
days := DaysInAMonth(StrToInt(cbbYear.Text, 2));
![]() Zitat:
|
AW: Tagesanzahl Februar eines Jahres
Wenn schon
Delphi-Quellcode:
verwenden, dann doch einfach in allen Fällen:
DaysInMonth
Delphi-Quellcode:
var
i: Integer; days: Cardinal; month: Integer; year: Integer; begin cbbDay.Enabled := False; if cbbMonth.ItemIndex >= 0 then begin month := cbbMonth.ItemIndex + 1; if TryStrToInt(cbbYear.Text, year) then begin days := DaysInMonth(EncodeDate(year, month, 1)); for i := 1 to days do // Füge die jahrespezifische Tagesanzahl für den Monat hinzu begin cbbDay.Items.Add(IntToStr(i)); end; cbbDay.Enabled := True; end else begin ShowMessage('ungültiges Datum!'); end; end; end; |
AW: Tagesanzahl Februar eines Jahres
Ist das fehlende begin ein Kopierschutz? :stupid::zwinker:
...ändern ist gemein.:zwinker: |
AW: Tagesanzahl Februar eines Jahres
Zitat:
Normalerweise schreibe ich sowas in der Delphi-IDE, aber das setzt in der Regel ein compilierbares Projekt oder zumindest compilierbaren Code voraus. |
AW: Tagesanzahl Februar eines Jahres
Oder wenn man bei der ursprünglichen Lösung bleiben möchte:
Delphi-Quellcode:
if IsLeapYear(Year) then
Days := 29 else Days := 28; |
AW: Tagesanzahl Februar eines Jahres
Guten Morgen,
vielen Dank für die vielen Antworten! Ich hab mich schlussendlich für die Lösung von DeddyH entschieden. Es funktioniert. :) VG Kratos |
AW: Tagesanzahl Februar eines Jahres
Geht aber kürzer ;-)
Delphi-Quellcode:
Days := IfThen(IsLeapYear(Year),29,28);
|
AW: Tagesanzahl Februar eines Jahres
Zitat:
|
AW: Tagesanzahl Februar eines Jahres
Zitat:
Delphi-Quellcode:
trägt nicht unbedingt zur Übersichtlichkeit bei. Es ist eher fehleranfällig als gut, daher würde ich es persönlich nicht benutzen. Intern sind die beiden Befehle sicherlich identisch.
IfThen
Andreas |
AW: Tagesanzahl Februar eines Jahres
Zitat:
|
AW: Tagesanzahl Februar eines Jahres
Zitat:
Wenn ich beim Programmieren nicht aufpasse, mache ich Fehler. Beim Aufruf einer derartigen Funktion mit 'nem Rückgabewert ist (zumindest bei mir) die Fehlerhäufigkeit nicht höher, als bei beliebigen anderen Funktionen mit mehreren Parametern und 'nem Rückgabewert. Und das IfThen 'ne neuere Kurzform ist, halt' ich für 'n Gerücht. Mein olles Delphi 7 aus dem Jahr 2002 enthält diese Funktionen in den Units Math und StrUtils. Die neuere Kurzform ist also erst / mindestens 18 Jahre alt und damit volljährig und darf wählen sowie gewählt werden. Ich wähle sie ;-) Und wenn sich wer an dem If Then stört:
Delphi-Quellcode:
Oder ginge es auch so?
case IsLeapYear(Year) of
true : Days := 29; false : Days := 28; end;
Delphi-Quellcode:
Days := 28 + Ord(IsLeapYear(Year));
|
AW: Tagesanzahl Februar eines Jahres
Nichts für ungut: Bekanntlich darf jeder nach seiner Fasson glücklich werden. Ich habe lediglich meinen Standpunkt dargelegt. Wenn
Delphi-Quellcode:
schon "volljährig" ist, dann benutze ich es seit 18 Jahre bewußt nicht :wink:. Da ich 1985 mit Tubo Pacal 3 angefangen habe, können 18 Jahre "alte" Funktionen für mich durchaus als "neuere" gelten…:wink:
IfThen
Die meisten Delphianer haben sich für Pascal entschieden, u. a. weil es eine disziplinierte Programmiersprache ist und unser Code dadurch leichter zu verstehen und warten ist. Allzu trickreiche Programmierung und Sprach-Akrobatik rächt sich meistens erst später bei der Pflege und Erweiterung der Programme. Der Vorschlag von Detlef unter #7 in der ausführlichen Schreibweise ist selbsterklärend und "idiotensicher", während man bei
Delphi-Quellcode:
die Reihenfolge der Parameter leicht vertauschen kann, ohne den Fehler zu merken.
IfThen
Mein Motto ist daher, daß Übersichtlichkeit & Zuverlässigkeit vor Kürze gehen. Schreibfaulheit in der Kodierung ist eher ein Merkmal vieler C++-Programmierer. Wer möchte schon z. B. solche kryptischen Zeilen (= kurze, kompakte Befehle) nach Jahren weiterpflegen:
Code:
Gruß, Andreas
const Doub *xa = &xx[jl], *ya = &yy[jl];
... j = (Int)(pp % nhash); ... Int k = ng ? garbg[--ng] : nn++ ; ... for (;;) { for (i=1;i<=n;i++) x[i]=xold[i]+alam*p[i]; *f=(*func)(x); if (alam < alamin) for (i=1;i<=n;i++) x[i]=xold[i]; *check=1; return; } else if (*f <= fold+ALF*alam*slope) return; ... k = ng ? garbg[--ng] : nn++ ; k != -1; k = next[k]) ... y=ya[ns--]; ... y += (dy=(2*(ns+1) < (mm-m) ? c[ns+1] : d[ns--])); ... |
AW: Tagesanzahl Februar eines Jahres
Moin...8-)
...man sollte aber auch dazu sagen, daß das dieses IfThen aus der Unit Math kommt. IfThen gibt es auch in SysUtils...die macht aber was ganz anderes. :zwinker: ![]() ![]() |
AW: Tagesanzahl Februar eines Jahres
Bei
Delphi-Quellcode:
gilt auch zu beachten, dass es sich hier um einen Funktionsaufruf handelt, bei dem immer alle Parameter ausgewertet werden.
IfThen
Delphi-Quellcode:
var
cmp: TComponent; cmpName: string; begin cmp := FindComponent('Edit1'); { hier kann ein Zugriffsfehler auftreten } cmpName := IfThen(cmp <> nil, cmp.Name, ''); { kann hier nicht passieren } if cmp <> nil then cmpName := cmp.Name else cmpName := ''; |
AW: Tagesanzahl Februar eines Jahres
Zitat:
Delphi-Quellcode:
var
cmp: TComponent; cmpName: string; begin cmp := FindComponent('Edit1'); if Assigned(cmp) then begin // ohne das, geht es bei mir nach 'nem FindComponent o. ä. garantiert nicht weiter. ... end else begin ... end; |
AW: Tagesanzahl Februar eines Jahres
Zitat:
Gäbe es denn irgendeinen Trick um das zu Vermeiden, ich denke mal nicht, oder ? Shortcuts gibt es nur bei Operatoren soweit mir bekannt. |
AW: Tagesanzahl Februar eines Jahres
Zitat:
|
AW: Tagesanzahl Februar eines Jahres
Zitat:
Delphi-Quellcode:
Days:=28+Ord(IsLeapYear(Year));
|
AW: Tagesanzahl Februar eines Jahres
Zitat:
Zitat:
Delphi-Quellcode:
if IsLeapYear(Year) then
Days := 28 else Days := 29; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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