Autor |
Beitrag |
Arne Danikowski
      
Beiträge: 194
|
Verfasst: Mi 06.05.09 08:55
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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mi 06.05.09 09:10
Deklarier mal Jahr1 - Jahr6 als Word und benutze unten IntToStr statt DateToStr.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.05.09 10:46
Moin!
Delphi-Quelltext 1: 2: 3: 4:
| uses ..., DateUtils;
ShowMessage(IntToStr(YearOf(Now))); | cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 06.05.09 10:57
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.05.09 11:12
Moin!
OK, dann die lange Version...
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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 06.05.09 11:17
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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; |
_________________ PROGRAMMER: A device for converting coffee into software.
Zuletzt bearbeitet von Xentar am Do 07.05.09 12:10, insgesamt 1-mal bearbeitet
|
|
Mike19
      
Beiträge: 256
Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: Do 07.05.09 12:23
Hallo,
und erst einmal wieder vielen dank für die schnellen Antworten.
Danke Xentar da haste Wahr  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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|