Autor Beitrag
kiwicht
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Do 20.02.03 12:03 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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:
ausblenden Quelltext
1:
Shift = GetKeystate(Vk_LShift) And 128 <> 0;					
kiwicht Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Mo 24.02.03 11:11 
Hallöle...

also, ich habs jetzt mal mit GetKeyState probiert, und zwar so:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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.
ausblenden Quelltext
1:
If GetKeyState(...) And 1 = 1 Then {...}					

Prüft, ob die Taste getoggelt ist, und
ausblenden Quelltext
1:
If GetKeyState(...) And 128 = 1 Then {...}					

prüft, ob die Taste gedrückt ist. Wenn du
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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?
ausblenden 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:
ausblenden Quelltext
1:
2:
3:
 10:    00001010
 OR 5:  00000011
 = 11:  00001011

Dazu muss ich nix sagen. Dann ist da nch XOR:
ausblenden 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:
ausblenden 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:
ausblenden 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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