Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SetFileAttributes bzw. FileSetAttr setzen Attribute nicht r. (https://www.delphipraxis.net/37592-setfileattributes-bzw-filesetattr-setzen-attribute-nicht-r.html)

Die Muhkuh 7. Jan 2005 17:37


SetFileAttributes bzw. FileSetAttr setzen Attribute nicht r.
 
Hi,

so setze ich Datei-Attribute:

Delphi-Quellcode:
Attrib := faAnyFile;
      if cbProtectedFile.Checked then
        Attrib := Attrib + faReadOnly
      else
        Attrib := Attrib - faReadOnly;

      if cbArchiv.Checked then
        Attrib := Attrib + faArchive
      else
        Attrib := Attrib - faArchive;

      if cbHiddenFile.Checked then
        Attrib := Attrib + faHidden
      else
        Attrib := Attrib - faHidden;

      if cbSystemFile.Checked then
        Attrib := Attrib + faSysFile
      else
        Attrib := Attrib - faSysFile;

      FileSetAttr(FDoc.FFilename, Attrib);
Wenn ich Z.B. nur auf "cbProtectedFile" klicke so das es "checked" ist, und diese Procedure ausführe werden zwar Datei-Attribute gesetzt, aber die Falschen. Woran kann das liegen?

SirThornberry 7. Jan 2005 17:57

Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
 
das liegt daran das du
Delphi-Quellcode:
Attrib := faAnyFile;
geschrieben hast. faAnyFile beinhaltet schon alle Attribute und du addierst noch welche drauf.
Außerdem beinhaltet faAnyFile, faDirectory was aber zum setzen nicht nötig ist da man dieses attribut über die funktion nicht setzen kannst (sonst würdest du damit aus einer Datei ein verzeichnis machen können)

Muetze1 7. Jan 2005 18:32

Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
 
Moin!

Und die einzelnen Attribute sind einzelne Bits und werden im Normalfall mit oder verknüpft...

MfG
Muetze1

Christian Seehase 7. Jan 2005 18:46

Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
 
Moin Spider,

der Wert muss mit 0 initialisiert werden.
Addieren geht dann, wie Mütze ja schon sagte mit or, abziehen mit and not.

Die Muhkuh 7. Jan 2005 18:58

Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
 
Zitat:

Zitat von Christian Seehase
Moin Spider,

der Wert muss mit 0 initialisiert werden.
Addieren geht dann, wie Mütze ja schon sagte mit or, abziehen mit and not.

Hi,

das mit 0 hab ich auch grad gefunden.


Addieren geht aber auch so, oder?

Delphi-Quellcode:
Attrib := 0;
      if cbProtectedFile.Checked then
        Attrib := Attrib + faReadOnly;

      if cbArchiv.Checked then
        Attrib := Attrib + faArchive;

      if cbHiddenFile.Checked then
        Attrib := Attrib + faHidden;

      if cbSystemFile.Checked then
        Attrib := Attrib + faSysFile;

      FileSetAttr(FDoc.FFilename, Attrib);
Ansonsten so?
Delphi-Quellcode:
Attrib := 0;
      if cbProtectedFile.Checked then
        Attrib := Attrib or faReadOnly;

      if cbArchiv.Checked then
        Attrib := Attrib or faArchive;

      if cbHiddenFile.Checked then
        Attrib := Attrib or faHidden;

      if cbSystemFile.Checked then
        Attrib := Attrib or faSysFile;

      FileSetAttr(FDoc.FFilename, Attrib);
[edit=Christian Seehase]Delphi-Tag geschlossen. Mfg, Christian Seehase[/edit]

mung 7. Jan 2005 19:00

Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
 
Delphi-Quellcode:
   
 Attrib := 0; //Initialisieren
 Attrib :=  Attrib or
              byte(cbProtectedFile.Checked) or
              (byte(cbHiddenFile.Checked) shl 1) or
              (byte(cbSystemFile.Checked) shl 2) or
              (byte(cbArchiv.Checked )   shl 5) ; //Bits an die richtige stelle schieben

 FileSetAttr(FDoc.FFilename, Attrib);
shl (SHiftLeft) schiebt die bit nach links, also: (0001 shl 1) = 0010
dann noch alles oder verknüpt und fertig ist das Attribut :mrgreen:

mfg mung

Christian Seehase 7. Jan 2005 19:13

Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
 
Moin Manuel,

solange Du nicht die Zahlenwerte kennst, die jeweils dahinterstecken, solltest Du keinesfalls bei solchen Bitmasken mit + arbeiten.
Es gibt nämlich viele Fälle, in denen hinter den Konstantenbezeichnern schon die Kombination von Einzelkonstanten steckt (hier z.B. faAnyFile), so dass bei Addition durch Übertrag die falschen Bits gesetzt werden, bzw. nicht die, die Du haben willst.

Muetze1 7. Jan 2005 22:15

Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
 
Moin!

@mung: warum vorher noch 0 setzen?

Delphi-Quellcode:
Attrib :=
              byte(cbProtectedFile.Checked) or
              (byte(cbHiddenFile.Checked) shl 1) or
              (byte(cbSystemFile.Checked) shl 2) or
              (byte(cbArchiv.Checked )   shl 5) ; //Bits an die richtige stelle schieben

FileSetAttr(FDoc.FFilename, Attrib);
MfG
Muetze1

SirThornberry 8. Jan 2005 09:04

Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
 
Also das mit dem Addieren ist völlig OK solange er nur einzelAttribute addiert. Dementsprechend war
Delphi-Quellcode:
Attrib := 0;
      if cbProtectedFile.Checked then
        Attrib := Attrib + faReadOnly;

      if cbArchiv.Checked then
        Attrib := Attrib + faArchive;

      if cbHiddenFile.Checked then
        Attrib := Attrib + faHidden;

      if cbSystemFile.Checked then
        Attrib := Attrib + faSysFile;

      FileSetAttr(FDoc.FFilename, Attrib);
völlig korrekt da keienr der faXXXXX Werte eine Kompinanten mehrere Attribute ist.

Christian Seehase 8. Jan 2005 16:28

Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
 
Moin SirThornberry,

Zitat:

Zitat von SirThornberry
völlig korrekt da keienr der faXXXXX Werte eine Kompinanten mehrere Attribute ist.

In diesem Falle schon, aber spätestens wenn man integer nimmt, und ein Bit an der Vorzeichenstelle steht, oder man die Werte nicht kennt hat man ggf. verloren.
Ich halte es für sinnvoll bei Bitfeldern nur logische Operatoren zu verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz