Autor Beitrag
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Sa 02.11.02 15:58 
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:
ausblenden 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

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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...

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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?

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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".

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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)
ausblenden 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

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."