![]() |
SetFileAttributes bzw. FileSetAttr setzen Attribute nicht r.
Hi,
so setze ich Datei-Attribute:
Delphi-Quellcode:
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?
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); |
Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
das liegt daran das du
Delphi-Quellcode:
geschrieben hast. faAnyFile beinhaltet schon alle Attribute und du addierst noch welche drauf.
Attrib := faAnyFile;
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) |
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 |
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. |
Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
Zitat:
das mit 0 hab ich auch grad gefunden. Addieren geht aber auch so, oder?
Delphi-Quellcode:
Ansonsten so?
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);
Delphi-Quellcode:
[edit=Christian Seehase]Delphi-Tag geschlossen. Mfg, Christian Seehase[/edit]
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); |
Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
Delphi-Quellcode:
shl (SHiftLeft) schiebt die bit nach links, also: (0001 shl 1) = 0010Attrib := 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); dann noch alles oder verknüpt und fertig ist das Attribut :mrgreen: mfg mung |
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. |
Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
Moin!
@mung: warum vorher noch 0 setzen?
Delphi-Quellcode:
MfG
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); Muetze1 |
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:
völlig korrekt da keienr der faXXXXX Werte eine Kompinanten mehrere Attribute ist.
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); |
Re: SetFileAttributes bzw. FileSetAttr setzen Attribute nich
Moin SirThornberry,
Zitat:
Ich halte es für sinnvoll bei Bitfeldern nur logische Operatoren zu verwenden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr. |
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