delphi – 整数标志如何工作?

我不明白标志是如何工作的,并且会感谢一些帮助以及指向教程的链接,以尝试理解在将Integer作为标志添加到整数时发生的情况.

例如,我正在将各种大小的文件备份到SD卡.许多文件通常已经存在,所以我首先运行并检查FileExists,FileAge和size,如果合适,将其添加到列表中以使用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;

有人可以给我一个例子说明我需要做些什么吗?

和/或是按位运算符.这意味着它们可以独立地应用于每个操作数位.在了解按位运算时,有助于以二进制而不是十进制来描绘操作数. (一旦你熟悉它们如何工作,十进制仍然不是理想的格式;大多数人更喜欢十六进制,或者,在较小程度上,八进制.)

对于和,当且仅当两个操作数的位都置位时,才设置结果位;否则,结果被清除.对于或,如果设置了其中一个操作数位,则设置结果.当它们都被设置时它也被设置,所以它被称为包容性或. (也有独占或者,只有当两个操作数中的一个被设置时才设置结果.德尔福使用xor运算符.)

为了计算大于一位的操作数的结果,这些位是并行计算的,因此结果的第一位是从操作数的第一位计算的,第二位是从第二位计算的,依此类推.

组合标志时,使用或表示您希望设置两个标志.例如:

// Indicate we want both a simple progress bar *and* a lack of confirmation.
OpStruc.fFlags := fof_NoConfirmation or fof_SimpleProgress;

二进制的第一个标志值是00010000.第二个标志是000100000000.这使得结果为000100010000.

您不会经常使用和设置标志.相反,当你想检查是否设置了标志时,通常会使用它.例如:

// Check whether the no-confirmation flag is set:
var FlagSet: Boolean;
FlagSet := (OpStruc.FFlags and fof_NoConfirmation) = fof_NoConfirmation;

由于输入为000100010000,并且带有标志值的结果为000000010000.这等于标志值,因此FlagSet的值将为true.

有时候检查和操作的结果是否为非零,而不是检查它是否与您正在测试的标志完全相等.当标志由多个设置位组成时,您希望检查它们是否都存在.如果只有一个存在,则和操作的结果仍然不为零.

要删除标志,请使用不要反转要删除的标志位(清除所有设置位,反之亦然),然后使用和清除这些位.例如:

OpStruc.FFlags := OpStruc.FFlags and not fof_SimpleProgress;

fof_SimpleProgress的倒数是111011111111.到目前为止,FFlags的值是000100010000.将它们组合起来将产生000000010000,它等于fof_NoConfirmation,正如我们通过删除fof_SimpleProgress所期望的那样.

既然您了解了各个标志值的组合方式,那么您就可以指明要将哪些标志传递给您遇到问题的特定API函数.阅读每个标志的文档,并确定它是否是您想要使用的标志.如果是,请将其包含在标志列表中.

您可以将标志与任何顺序组合在一起.如果您知道自己总是需要某些标志,并且有条件地想要其他标志,则可以从常用标志列表开始,然后再添加其他标志.例如:

OpStruc.FFlags := fof_NoConfirmation or fof_SimpleProgress;
if BigFiles then
  OpStruct.FFlags := OpStruc.FFlags or fof_Silent;

经常使用加法来组合标志.显然,fof_NoConfirmation或fof_SimpleProgress的结果等于fof_NoConfirmation fof_SimpleProgress.但是,这仅在每个标志的位值不同时,以及多次不包含任何标志时才有效. fof_Silent或fof_Silent的结果等于fof_Silent,而fof_Silent fof_Silent的结果是fof_RenameOnCollision,这是一个完全不相关的标志.始终使用and和/或使用标志时,永远不要和 – .

https://stackoverflow.com/questions/22440473/how-do-integer-flags-work

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:delphi – 整数标志如何工作?