Delphi 整数标志是如何工作的?

Delphi 整数标志是如何工作的?,delphi,flags,Delphi,Flags,我不了解标志是如何工作的,如果能提供一些帮助和一个教程的链接,尝试了解将值作为标志添加到整数时发生的情况,我将不胜感激 例如,我正在将各种大小的文件备份到SD卡。很多文件通常已经存在,所以我首先运行并检查FileExists、FileAge和size,如果合适的话,将其添加到列表中,以便通过ShFileOperation进行复制。从这里开始使用Peter Barlow的例程是可行的,但我想抑制一些事情 如果文件大于10M,则我希望显示win进度条,我不希望出现覆盖现有文件的提示。另外,我不希望它

我不了解标志是如何工作的,如果能提供一些帮助和一个教程的链接,尝试了解将值作为标志添加到整数时发生的情况,我将不胜感激

例如,我正在将各种大小的文件备份到SD卡。很多文件通常已经存在,所以我首先运行并检查FileExists、FileAge和size,如果合适的话,将其添加到列表中,以便通过ShFileOperation进行复制。从这里开始使用Peter Barlow的例程是可行的,但我想抑制一些事情

如果文件大于10M,则我希望显示win进度条,我不希望出现覆盖现有文件的提示。另外,我不希望它检查是否有足够的空间,因为我已经这样做了,所以我知道有足够的空间进行所有的更新

我尝试过与AND+AND-混在一起,但似乎无法找到我需要的组合

if aBigFile then
  OpStruc.fFlags:=FOF_NOCONFIRMATION or FOF_SIMPLEPROGRESS else
  OpStruc.fFlags:=FOF_SILENT or FOF_NOCONFIRMATION;
有人能给我举个例子,说明我需要什么来实现这个功能吗?

和或是位运算符。这意味着它们独立地应用于操作数的每一位。在学习按位运算时,它有助于以二进制而不是十进制表示操作数。一旦你熟悉了它们的工作原理,十进制仍然不是理想的格式;大多数人更喜欢十六进制,或者,在较小程度上,八进制

对于和,当且仅当两个操作数的位都已设置时,才设置结果位;否则,结果将被清除。对于或,如果设置了任一操作数位,则设置结果。当两者都被设置时,它也被设置,所以它被称为包含或。还有一个异或,只有当两个操作数中正好有一个被设置时,才会设置结果。Delphi为此使用xor运算符

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

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

// Indicate we want both a simple progress bar *and* a lack of confirmation.
OpStruc.fFlags := fof_NoConfirmation or fof_SimpleProgress;
// Check whether the no-confirmation flag is set:
var FlagSet: Boolean;
FlagSet := (OpStruc.FFlags and fof_NoConfirmation) = fof_NoConfirmation;
OpStruc.FFlags := OpStruc.FFlags and not fof_SimpleProgress;
OpStruc.FFlags := fof_NoConfirmation or fof_SimpleProgress;
if BigFiles then
  OpStruct.FFlags := OpStruc.FFlags or fof_Silent;
第一个标志的二进制值为00010000。第二个是000100000000。这使得结果为00010000

设置标志时,您不会经常使用和。相反,当您想要检查是否设置了标志时,通常会使用该选项。例如:

// Indicate we want both a simple progress bar *and* a lack of confirmation.
OpStruc.fFlags := fof_NoConfirmation or fof_SimpleProgress;
// Check whether the no-confirmation flag is set:
var FlagSet: Boolean;
FlagSet := (OpStruc.FFlags and fof_NoConfirmation) = fof_NoConfirmation;
OpStruc.FFlags := OpStruc.FFlags and not fof_SimpleProgress;
OpStruc.FFlags := fof_NoConfirmation or fof_SimpleProgress;
if BigFiles then
  OpStruct.FFlags := OpStruc.FFlags or fof_Silent;
由于输入为0001000010000,带标志值的and的结果为0000000 10000。这等于flag值,因此FlagSet的值为true

有时,检查and操作的结果是否为非零就足够了,而不是检查它是否完全等于您正在测试的标志。当标志由多个集合位组成时,您需要检查它们是否都存在。如果只有一个存在,and操作的结果仍然是非零的

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

// Indicate we want both a simple progress bar *and* a lack of confirmation.
OpStruc.fFlags := fof_NoConfirmation or fof_SimpleProgress;
// Check whether the no-confirmation flag is set:
var FlagSet: Boolean;
FlagSet := (OpStruc.FFlags and fof_NoConfirmation) = fof_NoConfirmation;
OpStruc.FFlags := OpStruc.FFlags and not fof_SimpleProgress;
OpStruc.FFlags := fof_NoConfirmation or fof_SimpleProgress;
if BigFiles then
  OpStruct.FFlags := OpStruc.FFlags or fof_Silent;
fof_SimpleProgress的倒数是111011111。到目前为止,FFlags的价值为00010000。将这些与and组合将产生0000000 10000,这等于fof_NoConfirmation,正如我们通过删除fof_SimpleProgress所期望的那样

现在,您已经了解了各个标志值是如何组合的,您已经准备好指示要传递给遇到问题的特定API函数的标志。阅读每个标志的文档,并决定是否要使用它。如果是,请将其包含在您的旗帜列表中

您可以将标志与或以任何顺序组合。如果您知道您总是需要某些标志,并且有条件地需要其他标志,则可以从公用标志列表开始,然后添加其他标志。例如:

// Indicate we want both a simple progress bar *and* a lack of confirmation.
OpStruc.fFlags := fof_NoConfirmation or fof_SimpleProgress;
// Check whether the no-confirmation flag is set:
var FlagSet: Boolean;
FlagSet := (OpStruc.FFlags and fof_NoConfirmation) = fof_NoConfirmation;
OpStruc.FFlags := OpStruc.FFlags and not fof_SimpleProgress;
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_碰撞,这是一个完全无关的标志。在使用标志时始终使用and和or,绝不使用+和-。

为什么要使用and和help?您当前的尝试以何种方式失败?使用“或”组合标志。您通过组合一个标志来设置更大数据类型的适当位。我认为你找不到关于“SHFILEOPSTRUCT”的“fFlags”的教程,因为写一篇没有任何意义,不过,您可以搜索按位标志以获得一般性解释。您肯定是指下面的Peter?也许您在编写此代码之前已在代码中准备了OpStruc.fFlags:那么这就丢失了。我最初是以@rob的edit封装的一般方式解释您的问题的。但我认为你想知道SHFILE操作的细节
. 你的试错法帮不上忙。非常感谢你,罗布。我对比特是如何设置的有一个模糊的概念,但现在我能更好地理解它了。那么,如何做与或相反的操作,并从组合中删除一个标志,比如Flag=fof_NoConfirmation或fof_SimpleProgress?Flags:=Flags and fof_SimpleProgress是否会删除fof_SimpleProgress并只保留fof_NoConfirmation?否,如果在使用not and and运算符删除标志之前设置了此标志,则只保留fof_SimpleProgress,例如:flag:=flag and not fof_SimpleProgress