Autor Beitrag
Tigerpaw
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 30.09.03 23:11 
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.
ausblenden 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;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TFormEinlagern.Datum2;
begin
 LabelDatum.Caption := (EditTag.Text + '.' + EditMonat.Text + '.' + EditJahr.Text);
end;


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:
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 user profile iconTino: Code- durch Delphi-Tags ersetzt.


Zuletzt bearbeitet von Tigerpaw am Mi 01.10.03 21:26, insgesamt 2-mal bearbeitet
Andi1982
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: 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

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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.

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:
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;


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:
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Procedure UpdateDayCombobox;
  end;

{...}

Procedure TForm1.UpdateDayCombobox;
Begin

End;

Die Items in der Combobox kannst du wie folgt löschen:
ausblenden Delphi-Quelltext
1:
Combobox1.Items.Delete (1); // Löscht den 2. Eintrag					

Um Items hinzuzufügen benutzt du die Methode Add:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: Mi 01.10.03 15:55 
Wenn Du so unter Zeitdruck stehst, warum verwendest Du dann nicht einfach den TDateTimePicker?

barfuesser
Tigerpaw Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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.