Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Combobox Jahreszahlen füllen
Arne Danikowski - Mi 06.05.09 08:55
Titel: Combobox Jahreszahlen füllen
Hallo,
ich möchte in einer Combobox Jahreszahlen zur Laufzeit eintragen
folgendes habe ich bereits
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure Twartungdrucken.FormActivate(Sender: TObject); VAR Jahr1,Jahr2,Jahr3,Jahr4,Jahr5,Jahr6:TDATE; begin DecodeDate(now, Year, Month, Day); Jahr1:=Year; Jahr2:=(Year - 1); Jahr3:=(year - 2); Jahr4:=(year + 1); Jahr5:=(year + 2); Jahr6:=(year + 3);
JahrCombo.Items.Add(DateToStr(Jahr3)); JahrCombo.Items.Add(DateToStr(Jahr2)); JahrCombo.Items.Add(DateToStr(Jahr1)); JahrCombo.Items.Add(DateToStr(Jahr4)); JahrCombo.Items.Add(DateToStr(Jahr5)); JahrCombo.Items.Add(DateToStr(Jahr6)); |
Das funktioniert soweit, allerdings bekomme ich immer das komplette Datum ausgegeben und nicht nur die Jahreszahl. Es scheint am DecodateDate zu liegen. Die WORD Variable Year enthält nicht nur das Jahr.
Nersgatt - Mi 06.05.09 09:10
Deklarier mal Jahr1 - Jahr6 als Word und benutze unten IntToStr statt DateToStr.
Delete - Mi 06.05.09 09:36
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.FormCreate(Sender: TObject); var i: integer; y,m,d: word; begin DecodeDate(date,y,m,d); for I := -2 to 3 do if i <> 0 then ComboBox1.Items.Add(IntToStr(y + i)); end; |
Narses - Mi 06.05.09 10:46
Moin!
Delphi-Quelltext
1: 2: 3: 4:
| uses ..., DateUtils;
ShowMessage(IntToStr(YearOf(Now))); |
cu
Narses
Delete - Mi 06.05.09 10:57
Öhm... ja. Und?
Narses - Mi 06.05.09 11:12
Moin!
OK, dann die lange Version... :roll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| uses ..., DateUtils;
var i: Integer; begin for i := -2 to 3 do ComboBox1.Items.Add(IntToStr(YearOf(Now) +i)); |
cu
Narses
Delete - Mi 06.05.09 11:15
OK, aber wo liegt der Mehrwert? Mit DecodeDate bekomme ich das Jahr auch und muss nicht innerhalb einer Schleife ständig eine Funktion aufrufen. Außerdem spare ich eine Unit in der uses-Klausel ;)
BenBE - Mi 06.05.09 11:17
DecodeDate verbräte unnötig Stack und liefert zudem Werte, die nicht benötigt werden?
Und bzgl. der Schleife: Aktuelles Jahr einmal berechnen, Cachen und wiederverwenden in Berechnungen ...
Xentar - Mi 06.05.09 11:17
DeddyH hat folgendes geschrieben : |
OK, aber wo liegt der Mehrwert? Mit DecodeDate bekomme ich das Jahr auch und muss nicht innerhalb einer Schleife ständig eine Funktion aufrufen. |
Könnte man auch vor der Schleife einmal aufrufen und dann merken ;)
DeddyH hat folgendes geschrieben : |
Außerdem spare ich eine Unit in der uses-Klausel ;) |
Dafür hast du zwei unnötige Variablen m und d. ;)
Denk mal, kann man drehen wie man will. Ist wohl eher eine Geschmacksfrage.
Delete - Mi 06.05.09 11:20
Xentar hat folgendes geschrieben: |
Ist wohl eher eine Geschmacksfrage. |
Das sehe ich auch so, schließlich führen viele Wege nach Rom. Außerdem ging es mir primär darum, eine Lösung mit einer Schleife aufzuzeigen statt der ganzen lokalen Variablen wie im Ausgangspost.
Arne Danikowski - Do 07.05.09 11:58
Hi danke für die vielen Antworten.
Ich habe mich für die Variante
Delphi-Quelltext
1: 2: 3:
| for I := -2 to 0 do JahrCombo.Items.Add(IntToStr(YearOf(Now) +i)); JahrCombo.ItemIndex:=2; |
entschieden. Es scheint mit doch die eleganteste Methode zu sein. Damit wäre meine erste combobox fertig Juhu :)
Nun zur Zweiten. Hat immer noch was mit datum zu tun. Die zweite Combobox enthält vier feste Werte (1,2,3,4). Diese sollen die Quatale eines Jahres darstellen.
nun möchte ich das zutreffende Quatal automatisch in der Combobax aktivieren.
Die Quatale ergeben sich so
1.1.xx - 31.03.xx
1.4.xx - 31.06.xx
1.7.xx - 30.09.xx
1.10.xx - 31.12.xx
Die xx sollen dabei durch den aktuell ausgewählten Wert aus der ersten Combobox mit den Jahreszahlen ersetzt werden.
So Wei bin ich gekommen:
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:
| DecodeDate(now, Year, Month, Day); s1:=IntToStr(day); s2:=IntToStr(Month); s3:=JahrCombo.Text; s4:=(S1 +'.'+S2 +'.'+s3); d1:=StrToDate(S4); s5:='1'; s6:='4'; s7:=(S5 +'.'+S6 +'.'+s3); d2:=StrToDate(S7);
s8:='7'; s9:=(S5 +'.'+S8 +'.'+s3); d3:=StrToDate(S9);
s10:='10'; s11:=(S5 +'.'+S10 +'.'+s3); d4:=StrToDate(S11);
if d1 < d2 then qualtalcombo.ItemIndex:=0; if d1 > d2 then qualtalcombo.ItemIndex:=1; |
Allerdings habe ich nun Probleme mit dem 3.Quatal.
if d3 < d4 then qualtalcombo.ItemIndex:=3; Geht nicht, dass trifft ja immer zu.
if d3 > d1 then qualtalcombo.ItemIndex:=3; Geht nicht kann auch auf 2 Quatale zutreffen;
hat da jemand ne idee?
Xentar - Do 07.05.09 12:07
1. Eigentlich handelt es sich hier um ein neues Thema... ;)
2. Warum so kompliziert..?? Die Tage können dir doch egal sein, es kommt doch nur auf den Monat an. Und wieder zusammenpuzzeln musst du das Datum doch auch nicht mehr.
Delphi-Quelltext
1: 2: 3: 4: 5:
| DecodeDate(now, Year, Month, Day);if month in [1..3] then ComboBox1.ItemIndex := 0; if month in [4..6] then ComboBox1.ItemIndex := 1; if month in [7..9] then ComboBox1.ItemIndex := 2; if month in [10..12] then ComboBox1.ItemIndex := 3; |
So in der Art.
Edit: Das ganze könnte man natürlich auch noch als case-Abfrage schreiben..
Delphi-Quelltext
1: 2: 3: 4: 5:
| case month of 1..3: 4..6: end; |
Mike19 - Do 07.05.09 12:07
Zitat: |
for I := -2 to 0 do //aktuelles Jahr und 2 Jahre davor
JahrCombo.Items.Add(IntToStr(YearOf(Now) +i)); //Jahr des Datums in Combobox
JahrCombo.ItemIndex:=2; //Standard Auswahl aktuelles Jahr |
was spricht gegen
Delphi-Quelltext
1: 2: 3: 4:
| for I := year(now) to year(+10) do begin JahrCombo.Items.Add(i); end |
Arne Danikowski - Do 07.05.09 12:23
Hallo,
und erst einmal wieder vielen dank für die schnellen Antworten.
Danke Xentar da haste Wahr :D Deine Lösung ist schöner wie meine.
Zu Mike. Es spricht nichts dagegen, aber es stand am Anfang die Auswah
ob Decodedate zu verwenden oder nicht. Das hat sich nun erledigt, da ich für das zweite Problem
Decodate brauche.
Nun werde ich mir Deinen Lösungsvorschlag mal ansehen
BenBE - Do 07.05.09 13:12
Kürzer geht das Month-->Quartal so: quartal := (month -1) div 3;
Dann hat man gleich den ItemIndex, den man auswählen muss, ansonsten +1 rechnen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!