Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Probleme mit IF THEN Verzweigungen


DelphiSchüler1989 - Sa 30.10.10 16:29
Titel: Probleme mit IF THEN Verzweigungen
Hallo alle zusammen, bin gerade am üben für eine Delphi-Klausur.
Hab schon alles mögliche Versuch und komme mit diesem Problem nicht weiter.
Da ich Montag die Klausur schreiben werde, brauche ich möglichst schnell Hilfe.
Vielen Dank schon im Voraus, euer Delphi-Schüler.

Zur Aufgabe:
Der Fahrzeugtyp eines Autos wird in einer ComboBox ausgewählt.
Daraufhin werden mit Hilfe eines OnChange Ereignis IF THEN Anweisungen (Grundpreis und Fahrzeugtyp werden in einem Label ausgegeben und Motoren werden zur Auswahl in Abhängigkeit vom Fahrzeugtyp in einer RadioGroup ausgegeben) ausgeführt.

Quellcode:


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:
VAR Fahrzeugtyp:real;

procedure TForm1.ComboBoxTypChange(Sender: TObject);
begin
  ImageAuto.visible:=true;
  Fahrzeugtyp:=StrToFloat(ComboboxTyp.text);

  IF Fahrzeugtyp=125
  THEN
  BEGIN
  ListboxDaten.items.add('Typ: 125, Grundpreis: 22.500,00 €');
  RadioGroupMotoren.items.add('B 71 KW');
  RadioGroupMotoren.items.add('B 80 KW');
  RadioGroupMotoren.items.add('B 100 KW');
  RadioGroupMotoren.items.add('D 60 KW');
  RadioGroupMotoren.items.add('D 75 KW');
  END
  ELSE
    IF Fahrzeugtyp=250
    THEN
    BEGIN
    ListboxDaten.items.add('Typ: 250, Grundpreis: 32.750,00 €');
    RadioGroupMotoren.items.add('B 71 KW');
    RadioGroupMotoren.items.add('B 80 KW');
    RadioGroupMotoren.items.add('B 100 KW');
    RadioGroupMotoren.items.add('D 60 KW');
    RadioGroupMotoren.items.add('D 75 KW');
    END
    ELSE
      <span style="color: red">IF Fahrzeugtyp=250 Kombi</span>
      THEN
      BEGIN
      ListboxDaten.items.add('Typ: 250 Kombi, Grundpreis: 34.500,00 €');
      RadioGroupMotoren.items.add('B 71 KW');
      RadioGroupMotoren.items.add('B 80 KW');
      RadioGroupMotoren.items.add('B 100 KW');
      RadioGroupMotoren.items.add('D 60 KW');
      RadioGroupMotoren.items.add('D 75 KW');
      END
      ELSE
        IF Fahrzeugtyp=500
        THEN
        BEGIN
        ListboxDaten.items.add('Typ: 500, Grundpreis: 42.120,00 €');
        RadioGroupMotoren.items.add('B 80 KW');
        RadioGroupMotoren.items.add('B 110 KW');
        RadioGroupMotoren.items.add('B 131 KW');
        RadioGroupMotoren.items.add('D 75 KW');
        RadioGroupMotoren.items.add('D 90 KW');
        END
        ELSE
          IF Fahrzeugtyp=500 Quatro
          THEN
          BEGIN
          ListboxDaten.items.add('Typ: 500 Quatro, Grundpreis: 44.250,00 €');
          RadioGroupMotoren.items.add('B 80 KW');
          RadioGroupMotoren.items.add('B 110 KW');
          RadioGroupMotoren.items.add('B 131 KW');
          RadioGroupMotoren.items.add('D 75 KW');
          RadioGroupMotoren.items.add('D 90 KW');
          END
          ELSE
            IF Fahrzeugtyp=600 Van
            THEN
            BEGIN
            ListboxDaten.items.add('Typ: 600 Van, Grundpreis: 46.360,00 €');
            RadioGroupMotoren.items.add('B 80 KW');
            RadioGroupMotoren.items.add('B 110 KW');
            RadioGroupMotoren.items.add('B 131 KW');
            RadioGroupMotoren.items.add('D 75 KW');
            RadioGroupMotoren.items.add('D 90 KW');
            END;        
end;

end.



Nun wird beim Testen des Programmes folgender Fehler:

[Error] Komponentenabfragen1.pas(78): 'THEN' expected but identifier 'Kombi' found

Und der Bereich "IF Fahrzeugtyp=250 Kombi" im Quellcode farbig markiet angezeigt.

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


Gausi - Sa 30.10.10 16:41

Hallo und :welcome: in der Entwickler-Ecke,

FahrzeugTyp ist eine Real-Variable, also eine Zahl. 250 Kombi ist aber keine Zahl - das ist sogar gar nichts, womit Delphi arbeiten kann. Wenn in der Combobox für den Fahrzeugyp auch ein String '250 Kombi' stehen kann, dann solltest du für den Typ generell mit Strings arbeiten, nicht mit Real.

Und: Eine Real-variable mit "=" zu überprüfen kann sehr schnell in die Hose gehen. Grund dafür ist die interne Darstellung der Zahlen und die damit verbundenen Rundungsfehler.


jaenicke - Sa 30.10.10 16:48

Globale Variablen sind nicht schön. Die solltest du lieber vermeiden, sonst blickst du hinterher nicht mehr durch. (Ausnahmen gibt es natürlich, wo die sinnvoll sind.)
Nebenbei ist deine Formatierung etwas seltsam. Wie wäre es so:

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:
procedure TForm1.ComboBoxTypChange(Sender: TObject);
var
  Fahrzeugtyp: Double;
begin
  ImageAuto.Visible := True;
  Fahrzeugtyp := StrToFloat(ComboboxTyp.Text);

  if Fahrzeugtyp = 125 then
  begin
    ListboxDaten.items.add('Typ: 125, Grundpreis: 22.500,00 €');
    RadioGroupMotoren.items.add('B 71 KW');
    RadioGroupMotoren.items.add('B 80 KW');
    RadioGroupMotoren.items.add('B 100 KW');
    RadioGroupMotoren.items.add('D 60 KW');
    RadioGroupMotoren.items.add('D 75 KW');
  end
  else if Fahrzeugtyp = 250 then
  begin
    ListboxDaten.items.add('Typ: 250, Grundpreis: 32.750,00 €');
    RadioGroupMotoren.items.add('B 71 KW');
    RadioGroupMotoren.items.add('B 80 KW');
    RadioGroupMotoren.items.add('B 100 KW');
    RadioGroupMotoren.items.add('D 60 KW');
    RadioGroupMotoren.items.add('D 75 KW');
  end
  else if ...
Grund: du bist immer noch in der selben if..else Abfrage. Daher brauchst du auch nicht weiter einrücken. ;-)

Ja, wenn in dem Edit immer eine ganze Zahl steht, könntest du auch case benutzen.