Moin Mackhack,
umgang mit Bitfeldern allgemein, am Beispiel des Feldes Style aus CreateWindow, bzw. GetWindowLong, um den Wert auszulesen:
(Das Beispiel erhebt nicht den Anspruch sinnvoll zu sein
)
Delphi-Quellcode:
var
dwStyle : DWORD;
begin
// Windowstyle (siehe CreateWindow) des durch Handle angegebenen Fensters auslesen
dwStyle := GetWindowLong(
Handle,GWL_STYLE);
// Den Style WS_CAPTION hinzufügen, egal, ob dieser schon enthalten ist oder nicht
dwStyle := dwStyle
OR WS_CAPTION;
// Alle Bits Löschen, die für den Style WS_DISABLED zuständig sind
// Alle übrigen Bits bleiben erhalten
// Dass heisst: Der Style WS_DISABLED wird entfernt
dwStyle := dwStyle
AND NOT WS_DISABLED;
// Prüfen, ob der Style WS_SYSMENU gesetzt ist
if (dwStyle
AND WS_SYSMENU) <> 0
then ...
// oder (gleichbeutend)
if (dwStyle
AND WS_SYSMENU) = WS_SYSMENU
then ...
// Man könnte auch schreiben
// dwStyle := dwStyle AND WS_SYSMENU;
// hierdurch würde man dafür sorgen, dass alle Werte ausser
// WS_SYSMENU gelöscht werden.
// WS_SYSMENU ist allerdings nur dann noch enthalten, wenn er vorher
// auch schon enthalten war
// ... und den neuen Wert setzen
SetWindowLong(
Handle,GWL_STYLE,dwStyle);
end;
Wichtig:
Es spielt bei der Verwendung OR/AND/NOT keine Rolle, wieviele Bits in den Werten gesetzt sind.
Beispielsweise gibt es auch zusammengesetzte Werte, wie GENERIC_READ (siehe CreateFile) die mehrere Werte zu einem neuen zusammenfassen, so dass man nicht alle Einzelwerte mit OR verknüpft selber schreiben muss.
Deshalb darf man diese Werte auch niemals addieren (+) oder subtrahieren (-), da es ansonsten durch Überträge zu falschen Bitmasken kommen kann (siehe auch in der Delphi-Hilfe das Beispiel zu FindFirst. So macht man es falsch), was zu völlig unverhersagbaren Ergebnissen führen kann, bishin zum Datenverlust.