Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Datum, ComboBoxen, Probleme
Tigerpaw - Di 30.09.03 23:11
Titel: Datum, ComboBoxen, Probleme
Hi erstmal.
Ich habe folgendes Problem. Ich habe ein Editfeld um eine Jahreszahl einzutragen. Desweiteren habe ich eine Combobox, in der ich den Monat angeben kann. Nun möchte ich in Abhängigkeit vom Monat und vom Jahr eine Combobox erscheinen lassen, die eine Liste der Tage enthält. Hierzu habe ich vier Comboboxen erstellt - ComboboxTag28 - ComboboxTag31. Wenn das Jahr ein Schaltjahr und der Monat 2 ist, soll zB ComboboxTag29 erscheinen.
Ich schreib mal den Code, den ich bisher habe - das Problem ist, dass die Combobox nicht erscheint. Ich benutze Delphi 5 Standard, falls das wichtig ist.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TFormEinlagern.ComboBoxMonatChange(Sender: TObject);
var Zw1,Zw2,J,I : integer; begin
J := StrToInt(EditJahr.Text); I := StrToInt(ComboBoxMonat.Text); Zw1 := J div 4; Zw2 := J mod 4; if Zw2 = 0 and if I = 2 then ComboBoxTag29.Visible := true; end; |
Delphi-Quelltext
1: 2: 3: 4:
| procedure TFormEinlagern.Datum2; begin LabelDatum.Caption := (EditTag.Text + '.' + EditMonat.Text + '.' + EditJahr.Text); end; |
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:
| procedure TFormEinlagern.Datum; begin if ComboBoxTag28.Visible = false and ComboboxTag29.Visible = false and ComboboxTag30.Visible = false then EditTag.Text := ComboboxTag31.Text; if ComboBoxTag28.Visible = false and ComboboxTag29.Visible = false and ComboboxTag31.Visible = false then EditTag.Text := ComboboxTag30.Text; if ComboBoxTag28.Visible = false and ComboboxTag30.Visible = false and ComboboxTag31.Visible = false then EditTag.Text := ComboboxTag29.Text; if ComboBoxTag29.Visible = false and ComboboxTag30.Visible = false and ComboboxTag31.Visible = false then EditTag.Text := ComboboxTag28.Text;
begin if EditTag.Text = '' then begin ShowMessage('Überprüfen Sie das Datum!'); exit; end; begin if ComboBoxMonat.Text = '' then begin ShowMessage('Überprüfen Sie das Datum!'); exit; end; if EditJahr.Text = '' then begin ShowMessage('Überprüfen Sie das Datum!'); exit; end; Datum2; end; end; end; |
Ich hoffe ihr versteht was ich meine und könnt mir irgendwie helfen.[/delphi]
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
Andi1982 - Mi 01.10.03 07:59
Hi,
hast du mal in der Procedure TFormEinlagern.ComboBoxMonatChange beim ausführen deines Programmes nachgeschaut ob die If-Abfrage auch wirklich true ist???
Denn wenn er an diese Stelle kommt sollte er die Combobox eigentlich schon anzeigen. Jedenfalls sehe ich keinen Fehler im Code.
Achja, wofür hast du das gemacht Zw1 := J div 4; ?? Wird das weiter unten benötigt??
Gruß andi
Tino - Mi 01.10.03 08:53
Hallo und :welcome: hier im Delph-Forum.de!
das mit den vier Comboboxen für die jeweils unterschiedlichen Anzahl der Tag im Monat ist keine so gute Lösung.
Besser wäre es bei einer Änderung in dem Editfeld für das Jahr und bei der Änderung in der Combobox für die Auswahl des Montas wie folgt zu reagieren:
- Du merkst dir in einer Variable den gewählten Tag (z. B. in der Varaible SelDay)
- Dann rechnest du die Anzahl der Tag für das angegebene Jahr und den angegeben Monat aus.
- Ist der errechnete Wert ungleich der Anzahl der Tage in der Combobox dann
- Löscht du die Items in der Combobox
- und fügst in einer For-Next-Schleife die Tage in die Combobox mit der neu erreichneten Anzahl der Tage ein.
- Beim einfügen prüfst du ob der eingefügt Tag gleich der Variable SelDay ist... wenn das so ist dann markiertst du diesen Tag in der Combobox (Eigenschaft ItemIndex)
Ich denke das dieses Vorgehen ein wenig eleganter ist als die Methode mit den vier unterschiedlichen Comboboxen. Auch wenn man bedenkt das du den eingestellten Wert in der Combobox verarbeiten musst ist es bei vier unterschiedlichen Comboboxen recht schwer dies ordentlich zu programmieren.
Gruß
Tino
Tigerpaw - Mi 01.10.03 09:15
@Tino: Ja, da hast du wohl recht, umständlich ist mein Ansatz allemal, nur das mit dem Comboboxen editieren wenn eine bestimmte Zahl eingegeben wurde, das hab ich probiert und dann wieder sein lassen, da ich(wir) etwas unter Zeitdruck stehen und mir das zu kompliziert war.
Ich hab es jetzt mit 4 Comboboxen geschafft, ist aber ne Menge Quelltext geworden :roll:
@Andi1982: Ne, die Zw1 brauch ich später nicht, aber wie soll ich sonst an Zw2 rankommen, man hat mir beigebracht, dass (in meinem Fall) Zw2 der Rest ist, der bei J div 4 übrigbleibt und irgendwohin muss ich doch das Ergebnis von J div 4 speichern, oder hab ich da jetzt nen Denkfehler gemacht? oO
Naja, hier meine etwas unelegante Lösung des Combobox Problems.
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: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166:
| procedure TFormEinlagern.DatumCombo;
var Zw1,Zw2,J,I : integer; begin
J := StrToInt(EditJahr.Text); I := StrToInt(ComboBoxMonat.Text); Zw1 := J div 4; Zw2 := J mod 4; if Zw2 = 0 then if I = 2 then ComboBoxTag29.Visible := true; ComboBoxTag28.Visible := false; ComboBoxTag30.Visible := false; ComboBoxTag31.Visible := false;
if Zw2 = 0 then case StrToInt(ComboboxMonat.Text) of 1 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 3 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 5 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 7 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 8 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 10 :begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 12 :begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 4 : begin ComboBoxTag30.Visible := true; ComboBoxTag31.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 6 : begin ComboBoxTag30.Visible := true; ComboBoxTag31.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 9 : begin ComboBoxTag30.Visible := true; ComboBoxTag31.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 11 :begin ComboBoxTag30.Visible := true; ComboBoxTag31.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; end;
if Zw2 <> 0 then case StrToInt(ComboboxMonat.Text) of 1 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 3 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 5 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 7 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 8 : begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 10 :begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 12 :begin ComboBoxTag31.Visible := true; ComboBoxTag30.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 4 : begin ComboBoxTag30.Visible := true; ComboBoxTag31.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 6 : begin ComboBoxTag30.Visible := true; ComboBoxTag31.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 9 : begin ComboBoxTag30.Visible := true; ComboBoxTag31.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 11 :begin ComboBoxTag30.Visible := true; ComboBoxTag31.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag28.Visible := false; end; 2 : begin ComboBoxTag28.Visible := true; ComboBoxTag31.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag30.Visible := false; end;
end; end; |
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:
| procedure TFormEinlagern.ComboBoxMonatChange(Sender: TObject); begin DatumCombo; end;
procedure TFormEinlagern.Datum; begin Datumcombo;
if ComboBoxTag31.Visible = true then LabelDatum.Caption := (ComboboxTag31.Text + '.' + ComboBoxMonat.Text + '.' + EditJahr.Text); if ComboBoxTag30.Visible = true then LabelDatum.Caption := (ComboboxTag30.Text + '.' + ComboBoxMonat.Text + '.' + EditJahr.Text); if ComboBoxTag29.Visible = true then LabelDatum.Caption := (ComboboxTag29.Text + '.' + ComboBoxMonat.Text + '.' + EditJahr.Text); if ComboBoxTag28.Visible = true then LabelDatum.Caption := (ComboboxTag28.Text + '.' + ComboBoxMonat.Text + '.' + EditJahr.Text);
begin if ComboBoxTag28.Text = '' then if ComboBoxTag28.visible = true then begin ShowMessage('Sie müssen einen Tag wählen!'); exit; end; end; begin if ComboBoxTag29.Text = '' then if ComboBoxTag29.visible = true then begin ShowMessage('Sie müssen einen Tag wählen!'); exit; end; end; begin if ComboBoxTag30.Text = '' then if ComboBoxTag30.visible = true then begin ShowMessage('Sie müssen einen Tag wählen!'); exit; end; end; begin if ComboBoxTag31.Text = '' then if ComboBoxTag31.visible = true then begin ShowMessage('Sie müssen einen Tag wählen!'); exit; end; end; begin if ComboBoxMonat.Text = '' then begin ShowMessage('Sie müssen einen Monat wählen!'); exit; end; if EditJahr.Text = '' then begin ShowMessage('Sie müssen ein Jahr eingeben!'); exit; end;
end; end; |
Und zu guter letzt, damit man nicht mit den Daten durcheinander kommt, was mir des öfteren passiert ist :roll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TFormEinlagern.ButtonUebernehmenClick(Sender: TObject);
begin Datum; EditJahr.Text := ''; ComboboxMonat.Text := ''; ComboBoxTag28.Visible := false; ComboBoxTag29.Visible := false; ComboBoxTag30.Visible := false; ComboBoxTag31.Visible := false;
end; |
Tino - Mi 01.10.03 09:37
| Tigerpaw hat folgendes geschrieben: |
| nur das mit dem Comboboxen editieren wenn eine bestimmte Zahl eingegeben wurde, das hab ich probiert und dann wieder sein lassen, |
Schwer ist es nicht. Man muss nur wissen wie. Eine Combobox (für die Eingabe des Montas) verfügt über das
OnChange Event und das Editfeld (für die Eingabe der Jahreszahl) verfügt ebenfalls über ein
OnChange Event. In beiden Events würde ich die gleiche Methode aufrufen die du natürlich selbst implementieren musst. Zum Beispiel so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| type TForm1 = class(TForm) private public Procedure UpdateDayCombobox; end;
Procedure TForm1.UpdateDayCombobox; Begin
End; |
Die Items in der Combobox kannst du wie folgt löschen:
Delphi-Quelltext
1:
| Combobox1.Items.Delete (1); |
Um Items hinzuzufügen benutzt du die Methode
Add:
Delphi-Quelltext
1:
| Combobox1.Items.Add ('Text'); |
Ich würde mir wirklich noch mal überlegen die Zeit zu investieren. Der Code den du gepostet hast ist wirklich alles andere als elegant und ist um ein vielfaches länger und umständlicher als diese Methode.
Gruß
Tino
Tigerpaw - Mi 01.10.03 13:42
Ich werds auf jeden Fall mal ausprobieren, erstmal danke für die Hilfe und Anregung.
Wo genau ist eigentlich der Unterschied zwischen privaten Deklarationen und öffentlichen Deklarationen?
Tino - Mi 01.10.03 14:13
| Tigerpaw hat folgendes geschrieben: |
| Wo genau ist eigentlich der Unterschied zwischen privaten Deklarationen und öffentlichen Deklarationen? |
Wenn du die Methode in der Private-Sektion definierst kann man von "außen" diese Methode nicht aufrufen. Nur das Objekt selbst (in diesem Fall TForm1) kann die Methode aufrufen.
In deinem Fall solltest du die Procedure UpdateDayCombo auch in die Private-Sektion (und nicht wie ich gepostet habe in die Public-Sektion) packen da sie ja nur von der Form selbst benutzt wird.
Gruß
Tino
barfuesser - Mi 01.10.03 15:55
Wenn Du so unter Zeitdruck stehst, warum verwendest Du dann nicht einfach den TDateTimePicker?
barfuesser
Tigerpaw - Mi 01.10.03 21:06
| barfuesser hat folgendes geschrieben: |
Wenn Du so unter Zeitdruck stehst, warum verwendest Du dann nicht einfach den TDateTimePicker?
barfuesser |
Das ist eine gute Frage :D
Ich wusste nicht von der Existenz von TDateTimePicker, deswegen habe ich dies jetzt nicht benutzt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!