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