Thema: Delphi Bitweise Operatoren

Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Bitweise Operatoren

  Alt 7. Sep 2006, 16:46
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat