Entwickler-Ecke
Windows API - rausfinden ob ShiftTaste gedrückt
kiwicht - Do 20.02.03 12:03
Titel: rausfinden ob ShiftTaste gedrückt
Hallöle...
ist warscheinlich ne ganz simple Frage, aber ich komm halt nich drauf: Also: Hab ne Tabelle, und wenn ich darauf Doppelklicke wird die angeklickte Spalte "aufsteigend" sortiert. Nun will ich auch "absteigend" sortieren können, undzwar dann, wenn gleichzeitig zum DoppelKlick die Shift-Taste gedrückt wird.
Ich habs so probiert:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| // bei MainForm.FormKeyDown folgendes if KEY = VK_LSHIFT then OrderDesc := True else OrderDesc := False;
// und das bei Doppelklick auf die Tabelle if OrderDesc = True then tempSQL := SQLText + 'ORDER BY ' + grArtMat.SelectedField.FieldName + ' DESC' else tempSQL := SQLText + 'ORDER BY ' + grArtMat.SelectedField.FieldName; |
klappt aber nicht, wüßte auch nicht wo der fehler liegt.....
mfg
kiwicht
Andreas Pfau - Fr 21.02.03 20:08
Lies mal die SDK... links und rechts lässt sich nur mit GetKeyState, AsyncGetKeyState und GetKeyboardState auslesen. Verwende Vk_Shift. Wenn du aber unbedingt links und rechts unterscheiden willst, probier das:
Quelltext
1:
| Shift = GetKeystate(Vk_LShift) And 128 <> 0; |
kiwicht - Mo 24.02.03 11:11
Hallöle...
also, ich habs jetzt mal mit GetKeyState probiert, und zwar so:
Quelltext
1: 2:
| if GetKeyState(VK_LSHIFT) = 0 then Label1.Caption := 'SHIFT' else if GetKeyState(VK_LSHIFT) = 1 then Label1.Caption := 'NOSHIFT'; |
Jetzt passiert folgendes: Drücke ich LSHIFT, wechselt der Wert auf 0, drücke ich nochmal LSHIFT, wechselt er auf 1. Kann ich also davon ausgehen, das ich die Delphi-Hilfe (da leider englisch), falsch interpretiert habe?
Wär nett wenn das nochmal einer analysieren und mir eine klitzekleine Hilfestellung geben könnte.. :wink:
mfg
kiwicht
Andreas Pfau - Mo 24.02.03 15:01
Hättest du's so gemacht, wie ich gesagt habe, würde es klappen :wink:
Nee, nee, ist egal. Also das ist so: Das niederwertige Bit ist 1, wenn die Taste getoggelt ist, also nach jeden 2. Druck. Das höchstwertige Bit ist 1, wenn die Taste im augenblick gedrückt wird. Was du da machst, ist absolut falsch. Du musst es schon mit AND machen. Also z.B.
Quelltext
1:
| If GetKeyState(...) And 1 = 1 Then {...} |
Prüft, ob die Taste getoggelt ist, und
Quelltext
1:
| If GetKeyState(...) And 128 = 1 Then {...} |
prüft, ob die Taste gedrückt ist. Wenn du
Quelltext
1:
| If GetKeyState(...) = 1 Then {...} |
eingibst, dann ist es auch dann false, wenn die Taste gedrückt wird (weil es ja 128 ist). Du verstehst doch was von logischen Operatorn, oder? Wenn ja, müsste dir ja mal ein Licht aufgehen.
kiwicht - Mo 24.02.03 22:12
... *moep* achtung, overkill on kiwichts brain... :o :o
Moment, nochmal langsam für die langsamen:
GetKeyState liefert einen Wert zurück. Den frag ich ab. Aber wieso in aller Herrgottsnamenkruzifix (tschuldigung.. :( ) frag ich "AND 1 = 1"???
1 IST 1! Hab ich da irgendwo was verpasst?
und warum "AND 128 = 1" ????
Das ist doch gegen alle Logik, 128 ist nicht 1, 128 ist 128?
Also eigentlich hat ich noch nie ein Problem mit Logik, aber das entbehrt wirklich jener!
Also, wenn du mir die Formeln oben nochmal herleitest, wär das ganz nett, ausprobieren werd ich das auf jeden Fall..
mfg und danke danke dankeschön
kiwicht
Andreas Pfau - Di 25.02.03 15:40
Tja, sieht so aus, als bräuchtest du 'nen kleinen Grundkurs in sahen Logik. Also:
Was ist z.B. 10? Klar, das ist 10^1. Aber für den PC ist es
1010
OK, aber wir arbeiten ja grade mit Byte, also 8-Bit:
00001010
Und was ist 5?
00000011
OK, und was ist dan 10 UND 5?
Quelltext
1: 2: 3:
| 10: 00001010 AND 5: 00000011 = 2: 00000010 |
Klar, nur da wo in beiden eine 1 ist, also in 10 UND in 5, da bleibt eine 1. Das wäre das 2. Bit, dann haben wir Dezimal 2.
Das geht auch mit ODER:
Quelltext
1: 2: 3:
| 10: 00001010 OR 5: 00000011 = 11: 00001011 |
Dazu muss ich nix sagen. Dann ist da nch XOR:
Quelltext
1: 2: 3:
| 10: 00001010 XOR 5: 00000011 = 9: 00001001 |
Nur da, wo die Werte unterschiedlich sind, blibt eine 1. So.
Stellen wir uns vor, Schift wäre gedrückt. GetKeyState() liefert 128:
10000000
Beim 2. Druck wäre die Taste sowohl gedrückt als auch getoggelt. Dann gibt's 129:
10000001
So. Fragst du jetzt nach 128 (If GetKeyState() = 128), dann kann es doch sein, dass die Func 'ne 129 zurückliefert. Was nun? Am einfachsten, dur fragst nur das 128er Bit ab:
Quelltext
1: 2: 3:
| 10000001 AND 10000000 = 10000000 |
Wenn also 2GetKeyState() And 128 <> 0" ist, dann ist die Taste down. Egal, ob sie getoggelt ist. Übrigens wundert es mich. Das musst du wissen! Ohne das ist die WinApi kaum zu verstehen. Beispiel: Du fragt den Joystick ab (doofes beispiel). Der gibt dir nene Wert. Jedes Bit = 1 Button. Wie willst du rausfinden, ob die 3. Taste gedrückt ist? Ganz einfach:
Quelltext
1: 2: 3:
| Bitmaske 00001101 AND 00000100 = 00000100 |
Ist ungleich null. Fazit: 3. Feuerknopf ist gedrückt. Oder: Hast du schon mal 'ner WinApi-funktion 'nen Parameter übergeben? Viele sind Flags, also Bitmasken, z.B.
Quelltext
1: 2: 3:
| Flag A = 00000001 Flag B = 00000010 Flag C = 00000100 |
Was macht du? Addieren? Nee, oder? Stell dir das vor:
00000001 + 00000010 + 00000100 = 00000111
Alles klar. Aber:
00000001 + 00000001 + 00000010 + 00000100 = 00001000
Fehler. Warum? 2-Facher Parameter. Und du wunderst dich, warum's nicht funzt. Aber:
00000001 OR 00000001 OR 00000010 OR 00000100 = 00000111
Alles klar! Auch bei OpenGL wichtig.
Na ja, ich hoffe, du hast alles verstanden. Frag halt.
kiwicht - Di 25.02.03 16:04
:D Danke, das war mal ne vernünftige Erklärung!
1. Du hattest Recht, ich war in diesem Bereich stark unterernährt. Bei "Logik" dachte ich einfach an was ganz anderes...
2. Ich kenn mich zwar mit dem Binärsystem gut aus.. 0 und 1 und 1 und 0.... aber das das bei Delphi so tief geht, hätt ich nicht gedacht. Jetzt weiß ichs, und ich verstehs auch...
3. Die Kombination von Binär und Logik, die Binäre Logik :shock: , ist garnicht so schwer... versinnbildlich ausgedrückt... ;)
Fazit: Vielen Dank für die Ausführliche Erklärung, jetzt leuchtet mir die Geschichte mit Shift-Kontrolle so langsam ein!
:D mfg kiwicht
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!