Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - "Case ... Of" Frage


Blackout - Di 11.03.03 00:29
Titel: "Case ... Of" Frage
hi leute,
ich habe gerade mal eine Frage zur Case Anweisung.

Unszwar wollte ich folgendes mal probieren:


Quelltext
1:
2:
3:
4:
Case edit1.text Of
  'test': ShowMessage('Test');
  'exit': Application.Terminate;
End;


Das will irgendwie nicht funktionieren :cry:
Wie geht das genau mit Strings?

Mit Integern gehts:


Quelltext
1:
2:
3:
4:
Case I Of
  1: ShowMessage('Eins');
  2: ShowMessage('Zwei');
End;


Und noch ne Frage:
Kann man zum Beispiel folgendes machen?


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Case I Of
  1: Begin
        // Code
      End;
  2: Begin
        // Code
      End;
End;


Danke schonmal im Vorraus


Popov - Di 11.03.03 00:34

Es geht nicht mit Strings. Es geht aber mit Integer's und Char's, also:


Quelltext
1:
2:
3:
4:
5:
case Integer of
1: ...
2: ...
3, 4: ...
usw.


oder


Quelltext
1:
2:
3:
4:
5:
case Char of
'a': ...
'b': ...
'c', 'd': ...
usw.


Für Strings mußt du schom if-Abfragen oder CompareText oder CompareStr nehmen.


grayfox - Di 11.03.03 00:40

hallo blackout!

nachdem popov schneller als ich geantwortet hatte, beschränke ich mich auf deine 2. frage:

ja, es funktioniert so:


Quelltext
1:
2:
3:
4:
5:
case x of
  1: begin... 
         irgendwas...
     end;
  end;


darf ich mal was fragen?
warum probierst denn solche sache nicht aus, bevor du im forum nachfragst? meistens kommt man doch durch try und error viel schneller zum ziel, oder ?

mfg, stefan


Blackout - Di 11.03.03 00:49

@grayfox
ja du hast recht ich habs auch erst selbst probiert aber mit nem String hab ich es einfach nicht zum laufen gebracht ich dachte das geht.
Und das mit Begin und End das is mir beim Schreiben des Beitrags eingefallen :wink:

@popov
Mit Char's bekomme ich immer nur einen Buchstaben eines Textes heraus :cry:

Wie soll das denn mit CompareText oder CompareStr gehen?


Delete - Di 11.03.03 09:35

Ist deine F1-Taste auch kaputt?
die Delphi-Hilfe hat folgendes geschrieben:
Beschreibung
CompareText vergleicht S1 mit S2 und gibt 0 zurück, wenn beide identisch sind. Ist S1 größer als S2, wird ein Integer-Wert größer als 0 zurückgegeben. Ist S1 kleiner als S2, ist der Rückgabewert kleiner als 0.

usw.

Kurz gesagt: mit der Funktion bekommst du maximal nur 3 Zustände geliefert - der String #1 ist kleiner, gleich, oder größer als String #2. Ich glaube nicht, dass das für eine "case"-ähnliche Abfrage reicht. Daher würde ich, wohl oder übel, "if" vorschlagen.


Ice - Di 11.03.03 09:37

Hi ,

könnte so funktionieren:

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:
function Vergleich(Text):integer;
var
 HandleI : integer;
begin
 if Comparestr('test',Text)=0 then
  HandleI := 1
 else if Comparestr('exit',Text)=0 then
  HandleI := 2;
 else
  HandleI := 0;
 result := HandleI;
end;

procedure Hauptfunction;
var
 I : integer;
begin
 I := vergleich(Edit1.text);
 case I of
   0:showmessage('Nicht unterstützter Text'); 
   1:showmessage('Test');
   2:Application.terminate;
 end;
end;

sollte eigentlich funktionieren ist aber noch nicht getestet...

mfg
Ice

Moderiert von user profile iconTino: Code-Tags hinzugefügt.


Delete - Di 11.03.03 09:43

Schön, dass du deinen Code noch mal geändert hast. :) Nun mach doch bitte noch das [code]-Tag drum herum.


Delete - Di 11.03.03 09:59

@Ice: als Vorschlag

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function Vergleich(Text: string): integer;
const
  ValidThings : array[1..2]of string =
    ('test','exit');
var
  i : integer;
begin
  Result := 0; // Standardergebnis

  for i  := 1 to length(ValidThings) do
    if(CompareText(Text,ValidThings[i]) = 0) then begin
      Result := i; // Rückgabewert entspricht dem
                   // Schleifenwert

      break;       // und abbrechen
    end;
end;

Das macht Erweiterungen, IMHO, einfacher als endlose if-Abfragen.


Popov - Di 11.03.03 11:04

Natürlich bleibt IF immer einfacher. Allerdings hat CompareText den Vorteil, daß es Groß- und Kleinschreibung ignoriert. Man spart sich also zwei mal AnsiUpperCase.


Blackout - Di 11.03.03 20:52

Danke für die Hilfe :!:

Werds gleich mal ausprobieren