Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - case mit set


tommie-lie - Sa 02.11.02 15:58
Titel: case mit set
Hallo,

Ich möchte eine case...of-Abfrage in einem MouseClick.Event machen. Das klappt mit der Button-Variable (TButtonState), aber nicht mit der Shift-Variable (TShiftState).
Wenn man mal unter den beiden typen nachguckt, sieht das ganze so aus:

Quelltext
1:
2:
3:
type TMouseButton = (mbLeft, mbRight, mbMiddle);

type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);


Der ShiftState ist also ganz offensichtlich ein Set. Wie kann ich dessen Inhalt in einer Case-Abfrage prüfen?

Tschüß
Thomas


Tino - Sa 02.11.02 17:54

Hallo Tommie,

ich frage mich gerade ob Du den Unterschied zwischen einem Aufzählungs- und einem Mengentypen kennst ?!?! Wenn nicht dann schau mal in der Hilfe unter Aufzählungstype und Mengentypen nach. Dort wird das Thema wirklich gut beschrieben.

So weit ich weiß kann man eine Mengentyp-Variable nicht in einer CASE-Anweisung benutzen. Ich habe bislang immer mit einer IF-THEN Anweisung gearbeitet:

Quelltext
1:
2:
3:
4:
If ssShift in aShift Then
  { ssShift ist in aShift enthalten };
If ssAlt in aShift Then
  { ssAlt ist in aShift enthalten };


Gruß
TINO


tommie-lie - Sa 02.11.02 19:01

okay, jetz weiß ich wie das zweite heißt, aber ich wusste schon vorher den unterschied.
Aber deswegen will ich ja wissen, ob's irgendwie geht, sowas mit einer case-schleife zu machen, oder zumindest etwas ähnlichem, was etwas übersichtlicher ist als hunderttausend if-Anweisungen...


Anonymous - Sa 02.11.02 19:32

Es geht, aber ob es einfacher ist? Du kannst einfach den Bit abfragen.

Habs aber selbst so noch nie gemacht. Müßte aber möglich sein.


tommie-lie - Sa 02.11.02 20:09

und wie mache ich sowas?
also ein kleines Beispiel oder so, mit einer Abfrage...

Oder ich mach's doch mit IF-Abfragen.... :-(
Was wäre denn deiner Meinung nach schneller: IF-Abfragen oder bitwise vergleiche mit case?


Anonymous - Sa 02.11.02 23:05

Wie kommst du drauf, das es hunderttausend if-Anweisungen werden könnten. Es können maximal 6 Abfragen werden. Eine Case Anweisung wäre auch nicht kürzer.


tommie-lie - So 03.11.02 14:09

Gut. Sind aber 7: Wenn man alle drei Tassten drückt...
Und wenn es auch noch um Mausbuttons geht, kommen wieder welche hinzu...
Ich muss ja die genaue Kombination wissen, nicht ob nur eine Taste gerade gedrückt wird, sondern genau welche.
Außerdem könnte ich ja auch mal in was anderem sowas benötigen. Aber bisher würden IFs reichen, da hast du recht. Ich finde nur CASEs übersichtlicher und "schöner".


Wolff68 - Di 12.11.02 22:17

Also wenn Du es unbedingt in einer CASE auswerten willst musst Du Dir eben vorher eine Ordinale Variable füttern.
(Was man aber auch klasse in eine Funktion auslagern kann)

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var Raster : Word;
begin
  Raster := 0;
  if ssShift  in Shift then Raster := Raster +  1;
  if ssAlt    in Shift then Raster := Raster +  2;
  if ssCtrl   in Shift then Raster := Raster +  4;
  if ssLeft   in Shift then Raster := Raster +  8;
  if ssRight  in Shift then Raster := Raster + 16;
  if ssMiddle in Shift then Raster := Raster + 32;
  if ssDouble in Shift then Raster := Raster + 64;

  case raster of
    17 : Edit1.Text := 'ssShift, ssRight';
    35 : Edit1.Text := 'ssShift, ssAlt, ssMiddle';
    24 : Edit1.Text := 'ssleft, ssRight';
    63 : Edit1.Text := 'Mach den Knoten aus den Fingern';
  end;
end;

Ob es nun 'schöner' ist mit den nichtssagenden Bitwerten von Raster zu hantieren mag mal dahingestellt sein...

Gruß,
Wolff68