Autor Beitrag
pwsolaris
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 71
Erhaltene Danke: 1

MS DOS, Win 95, Win 98, Win ME, Win XP, Win Vista, Win 7 Ultimate
Delphi 5 Enterp., Delphi 2007, Delphi 2009, Informix 4GL, VB .NET, MS/SQL, PL/SQL
BeitragVerfasst: Do 12.05.11 08:25 
Guten Morgen,

ich benutze momentan mehrere CASE Bedingungen. Bisher habe ich immer sowas genutzt wie z.B. :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
case LampChn of
  1 : Begin ... end;
  2 : Begin ... end;
end;

oder auch
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
case LampChn of
  1..LampCnt : Begin ... end;
end;


Aber ich müsste das nun auch wie folgt machen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 12.05.11 08:32 
Ich vermutle LmpCnt ist keine Variable, sondern eine Konstante. Daher funktioniert das in dem Fall. Mit echten Variablen aber nicht.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 12.05.11 08: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 71
Erhaltene Danke: 1

MS DOS, Win 95, Win 98, Win ME, Win XP, Win Vista, Win 7 Ultimate
Delphi 5 Enterp., Delphi 2007, Delphi 2009, Informix 4GL, VB .NET, MS/SQL, PL/SQL
BeitragVerfasst: Do 12.05.11 08: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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 12.05.11 09: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 71
Erhaltene Danke: 1

MS DOS, Win 95, Win 98, Win ME, Win XP, Win Vista, Win 7 Ultimate
Delphi 5 Enterp., Delphi 2007, Delphi 2009, Informix 4GL, VB .NET, MS/SQL, PL/SQL
BeitragVerfasst: Do 12.05.11 09: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 12.05.11 09: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 12.05.11 10:48 
Du arbeitest mit dem FOR-CASE-Paradigma. Warum?

1. Was spricht gegen if?

2. Warum die for-Schleife?

Warum nicht so:

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