我不明白标志是如何工作的,并且会感谢一些帮助以及指向教程的链接,以尝试理解将Integer中的值作为标志添加时发生的事情。
例如,我正在将各种大小的文件备份到SD卡。许多文件通常已经存在,因此我首先检查FileExists
,FileAge
和大小,然后将其添加到列表中以复制ShFileOperation
。使用彼得·巴洛(Peter Barlow)的例行程序,这是有效的,但我想压制一些东西。
如果文件大于10M,那么我想显示win-progress栏,我不想提示覆盖现有文件。另外,我不希望它检查是否有足够的空间,因为我已经做了,所以我知道有足够的空间进行所有更新。
我曾尝试弄乱AND
和OR
以及+
和-
,但似乎无法弄清楚我需要的组合。
if aBigFile then
OpStruc.fFlags:=FOF_NOCONFIRMATION or FOF_SIMPLEPROGRESS else
OpStruc.fFlags:=FOF_SILENT or FOF_NOCONFIRMATION;
有人可以举一个例子说明我需要做些什么工作吗?
答案 0 :(得分:7)
And
和or
是按位运算符。这意味着它们可以独立地应用于每个操作数位。在了解按位运算时,有助于以二进制而不是十进制来描绘操作数。 (一旦你熟悉它们的工作原理,十进制仍然不是理想的格式;大多数人更喜欢十六进制,或者在较小程度上,更喜欢八进制。)
对于and
,当且仅当两个操作数的位都置位时,才设置结果位;否则,结果被清除。对于or
,如果设置了操作数位的一个,则设置结果。当两者都已设置时,它也会设置,因此它被称为包含或。 (还有独占或,其中只有在设置两个操作数中的一个时才设置结果.Delphi使用xor
运算符。)
要计算大于一位的操作数的结果,这些位是并行计算的,因此结果的第一位是从操作数的第一位计算的,第二位是从第二位计算的,所以上。
组合标志时,使用or
表示您要设置两个标志。例如:
// Indicate we want both a simple progress bar *and* a lack of confirmation.
OpStruc.fFlags := fof_NoConfirmation or fof_SimpleProgress;
二进制中的第一个标志值是00010000.第二个标志是000100000000。这使得结果为000100010000。
设置标志时,您不会经常使用and
。相反,当您想要检查是否设置了标志时,通常会使用这种方法。例如:
// Check whether the no-confirmation flag is set:
var FlagSet: Boolean;
FlagSet := (OpStruc.FFlags and fof_NoConfirmation) = fof_NoConfirmation;
由于输入为000100010000,带有标志值的and
的结果为000000010000.这等于标志值,因此FlagSet
的值将为真。 / p>
足以检查and
操作的结果是否为非零,而不是检查它是否与标志完全相等你正在测试。当标志由多个设置位组成时,您希望检查它们的所有是否存在。如果只有一个存在,and
操作的结果仍然不为零。
要删除标志,可以使用not
反转要删除的标志位(清除所有设置位,反之亦然),然后使用{{1}清除这些位。例如:
and
OpStruc.FFlags := OpStruc.FFlags and not fof_SimpleProgress;
的倒数是111011111111.到目前为止,fof_SimpleProgress
的值是000100010000。将FFlags
与and
组合将产生000000010000,等于fof_NoConfirmation
,就像我们& #39; d期望删除fof_SimpleProgress
。
现在,您已了解各个标记值的组合方式,您已配备指示要传递给您遇到问题的特定API函数的标记。阅读每个标志的文档,并确定它是否是您想要使用的标志。如果是,请将其包含在标志列表中。
您可以按任意顺序将标记与or
结合使用。如果您知道自己总是需要某些标志,并且有条件地想要其他标志,则可以从常用标志列表开始,然后再添加其他标志。例如:
OpStruc.FFlags := fof_NoConfirmation or fof_SimpleProgress;
if BigFiles then
OpStruct.FFlags := OpStruc.FFlags or fof_Silent;
经常使用加法来组合标志。显然,fof_NoConfirmation or fof_SimpleProgress
的结果等于fof_NoConfirmation + fof_SimpleProgress
。但是,这仅在每个标志的位值不同时,以及多次不包含任何标志时才有效。 fof_Silent or fof_Silent
的结果等于fof_Silent
,而fof_Silent + fof_Silent
的结果是fof_RenameOnCollision
,这是一个完全不相关的标志。使用标记时始终使用and
和or
,永远不要+
和-
。