Autor |
Beitrag |
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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:
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
Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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
|
Verfasst: 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
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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
|
Verfasst: 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
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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
Beiträge: 302
Erhaltene Danke: 1
WinXP home
D6 Prof
|
Verfasst: 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
_________________ "Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
|
|