Robert Meek wrote: > Actually I learned that a long time ago and keep an updated copy on > my desktop. But having read the documentation I still didn't > understand why it was necessary to mask out the other bits in one > situation and not another.
Who said it wasn't necessary in the other? > GetKeyState(VK_SHIFT) works fine by itself so evidently it is > returning the value of the high order bit. It could be returning a value in *any* bit. Asking whether a number is greater than zero is not the same as asking whether it can be expressed as the sum of 32768 plus other distinct powers of two. > Also I don't have a clue as to what $8000 means or how it works...I'm > just guessing...remember no comp sci at all! As I mentioned before, GetKeyState returns a Word -- that's a 16-bit type. The help says the high-order bit is the one we should look at. The "high-order bit" is the most significant bit. Written in binary, our mask would be 1000000000000000. That's a one in the highest bit and zeros for the other 15. Delphi doesn't support binary notation for numeric literals, so we bit the next best thing, hexadecimal, in which case the mask is 8000. We could also have expressed it in decimal as 32768. When we use the "and" operator, it compares its operands bit-by-bit. When a bit is set -- equal to one -- in both operands, then that bit will also be set in the result. If either of the operands' bits is zero, then the corresponding bit in the result will be zero. http://en.wikipedia.org/wiki/Binary_and Since our mask only has one bit set, we're guaranteed that everything *other* than that one bit will be cleared -- equal to zero -- in the result, allowing us to focus on just the bit we're interested in -- the bit that MSDN told us we should be interested in. That one bit is now solely responsible for determining whether the result is zero. If the bit is cleared -- if the key is not down -- then the result is zero; if the bit is set, then the result is nonzero and the key is down. > Now Malcolm is saying that simply if (key=VK_F1) and (ssShift in > Shift) then should work as well, Correct. The Shift parameter to the OnKeyDown event handler tells the states of the Shift, Alt, and Ctrl keys. > but why then doesn't if (key=VK_F1) and (Key = VK_SHIFT) then work as > well? You're kidding, right? For the same reason "if (x = 1) and (x = 2)" won't work. > They both check for any Shift Key? One checks for Shift keys. The other checks for nonsense. > Is it a syntax problem that you cannot check for two virtual key > codes together? No, the compiler is perfectly happy to compile that code. It will never evaluate to True, though, because no variable can have two values simultaneously. A sufficiently smart compiler (or other static-analysis tool) might even warn about that. -- Rob _______________________________________________ Delphi mailing list -> [email protected] http://www.elists.org/mailman/listinfo/delphi

