Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Bei CASE Anweisungen mit Variablen arbeiten


pwsolaris - Do 12.05.11 07:25
Titel: Bei CASE Anweisungen mit Variablen arbeiten
Guten Morgen,

ich benutze momentan mehrere CASE Bedingungen. Bisher habe ich immer sowas genutzt wie z.B. :

Delphi-Quelltext
1:
2:
3:
4:
case LampChn of
  1 : Begin ... end;
  2 : Begin ... end;
end;

oder auch

Delphi-Quelltext
1:
2:
3:
case LampChn of
  1..4 : Begin ... end;
end;

usw.

Jetzt möchte ich das ganze statt mit festen Zahlen mit Variablen lösen.
Mit einer Variablen klappt das auch ganz gut:

Delphi-Quelltext
1:
2:
3:
case LampChn of
  1..LampCnt : Begin ... end;
end;


Aber ich müsste das nun auch wie folgt machen:

Delphi-Quelltext
1:
2:
3:
case LampChn of
  LampCnt .. LampCntMax : Begin ... end;
end;


Und genau da liegt das Problem...
Ich bekomme nun immer die Meldung, dass statt dem zwei Punkten zwischen den Variablen eine andere Anweisung erwartet wird.
Wie kann ich meinen Code nun so umbiegen, dass ich dort mit meinen Variablen arbeiten kann?


Nersgatt - Do 12.05.11 07:32

Ich vermutle LmpCnt ist keine Variable, sondern eine Konstante. Daher funktioniert das in dem Fall. Mit echten Variablen aber nicht.


jaenicke - Do 12.05.11 07:39

Der Grund ist, dass die case-Anweisung zur Designzeit optimiert und in Sprünge umgesetzt wird. Bei Variablen ist zur Designzeit der Wert aber nicht bekannt, daher geht das nicht.


pwsolaris - Do 12.05.11 07:41

LampCnt ist schon eine Variable... der Wert zählt an einem Gerät angeschlossene Lampen und diese können sich auch zur Laufzeit ändern.

Wie gesagt es funktioniert bei dem "1..LampCnt" Beispiel.

Wie könnte ich das Ganze denn sonst lösen, wenn es mit CASE nicht so richtig klappt.

Situation ist folgende:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
for ChNr := 0 to LampCntMax do begin
  case ChNr of
    0 : Begin ... end;

    1..LampCnt1 : Begin ... End;

    // Und nun das Problemkind (LampCnt2 ist LampCnt1 + 1)
    LampCnt2 .. LampCntMax : Begin ... end;
  end;
end;


Ich könnte sonst ja in der FOR-Schleife auch die Werte mit einem IF abfragen... jedoch habe ich mehrere solcher Situationen und benutze sonst immer CASE. Und der Code soll ja auch irgendwie einheitlich wirken :D


jaenicke - Do 12.05.11 08:17

user profile iconpwsolaris hat folgendes geschrieben Zum zitierten Posting springen:
Wie gesagt es funktioniert bei dem "1..LampCnt" Beispiel.
Dann musst du wohl irgendwelche Erweiterungen benutzen. Vielleicht können die DDevExtensions oder ähnliche sowas.

Standardmäßig funktioniert sowas weder mit Delphi noch mit Lazarus. :nixweiss:

Womit arbeitest du denn gerade?


pwsolaris - Do 12.05.11 08:26

Ich erstelle sogennante "Helper" Dateien mit Delphi. Also es wird Delphi Syntax benutzt.
Diese Helper Dateien werden dann von einem Programm eingelesen und über einen Interpreter dann in Code umgewandelt und ausgeführt.

Habe das Problem aber nun auch behoben und einfach mit IF Abfragen gearbeitet. Sieht jetzt zwar etwas durcheinander aus aber es funktioniert...


jaenicke - Do 12.05.11 08:56

user profile iconpwsolaris hat folgendes geschrieben Zum zitierten Posting springen:
Ich erstelle sogennante "Helper" Dateien mit Delphi. Also es wird Delphi Syntax benutzt.
Diese Helper Dateien werden dann von einem Programm eingelesen und über einen Interpreter dann in Code umgewandelt und ausgeführt.
Du stellst eine Frage zur Syntax, sagst aber nicht dazu, dass es sich gar nicht um Delphi handelt und woher die Syntax überhaupt kommt (welcher Interpreter, ...)?!? Sehr logisch... :roll: :autsch:

Delphi Syntax ist es jedenfalls nicht 100%ig, sonst hätte das case mit Variablen gar nicht funktioniert.


baka0815 - Do 12.05.11 09:48

Du arbeitest mit dem FOR-CASE-Paradigma [http://thedailywtf.com/Articles/The_FOR-CASE_paradigm.aspx]. Warum?

1. Was spricht gegen if?

2. Warum die for-Schleife?

Warum nicht so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
begin
  // ... Code der bei 0 aufgerufen wird

  for 1 to LampCnt1 do
  begin
    // Code der bei 1..LampCnt1 ausgeführt wird
  end;

  for LampCnt2 to LampCntMax do
  begin
    // Code der bei LampCnt2 .. LampCntMaxausgeführt wird
  end;
end;