例如,我正在将各种大小的文件备份到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和/或使用标志时,永远不要和 – .