注册 登录
编程论坛 VB6论坛

vb6 怎么让一个过程参数有多个条件

Ez330阿牛 发布于 2014-03-05 23:43, 1855 次点击
在做一个dll自动用,想要用像别人一样做成有一个参数有多个条件的,一直想不明白call setfile("C:\1.txt",1+2+3+7) 这样调用的话,n都变成和了,我的目的很简单,不让他变成和,或者是有什么别的办法可以准确判断调用什么属性
sub setfile(byval path ,byval n )
dim val as string
select case n
case 0
val=FILE_ATTRIBUTE_ARCHIVE & val &"|"
case 1
val=FILE_ATTRIBUTE_COMPRESSED & val &"|"
以下省略
end sub
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20          '文档Public Const FILE_ATTRIBUTE_COMPRESSED = &H800      '合并Public Const FILE_ATTRIBUTE_DIRECTORY = &H10       '目录/文件夹Public Const FILE_ATTRIBUTE_HIDDEN = &H2             '隐藏Public Const FILE_ATTRIBUTE_NORMAL = &H80           '普通Public Const FILE_ATTRIBUTE_READONLY = &H1          '只读Public Const FILE_ATTRIBUTE_SYSTEM = &H4           '系统Public Const FILE_ATTRIBUTE_TEMPORARY = &H100       '临时
新人没分请见谅
9 回复
#2
wp2319572014-03-06 05:26
vB无法编写DLL

[ 本帖最后由 wp231957 于 2014-3-6 05:29 编辑 ]
#3
bczgvip2014-03-06 08:11
sub setfile(byval path ,byval n )
    if FILE_ATTRIBUTE_ARCHIVE and n then
    ......
    endif
    if FILE_ATTRIBUTE_COMPRESSED and n then
    ......
    endif
    ......
end sub
#4
Ez330阿牛2014-03-06 15:40
回复 3楼 bczgvip
这样的话就不能同时调用多个参数了,
#5
Ez330阿牛2014-03-06 15:46
回复 2楼 wp231957
我己经写了几十个命令自己用了,用VB6.0企业版做的
#6
风吹过b2014-03-06 19:23
1+2+3+7

它这个是属性的结合。
FILE_ATTRIBUTE_READONLY = &H1     =  1
FILE_ATTRIBUTE_HIDDEN = &H2       =  2
3 = 1 + 2

在 C 语言里,如果一个对像 有多个属性开关需要设置,为了节省 存储空间,一般使用一个位来表示一个开关。
例如一个文件 只读属性 0000 0001(2)  = &H1
             隐藏属性 0000 0010(2)  = &H2
             系统属性 0000 0100(2)  = &H4
        只读+隐藏属性 0000 0011(2)  = &H1+&H2 =1+2 = 3
   只读+隐藏+系统属性 0000 0111(2)  = &H1+&H2+&H4 = 1+2+4 = 7
---------------------
每位上的值分别是:以字节为例,不考虑符号位
  0000 0001    =1
  0000 0010    =2
  0000 0100    =4
  0000 1000    =8
  0001 0000    =16
  0010 0000    =32
  0100 0000    =64
  1000 0000    =128

所以,有些时候可以看到多个属性枚举时是一个不连续的值,就是把二进制转成10进制表示的。

组合属性时,直接把 相应的属性 加起来就是了。
所以 1+2+3+7 ,这个式子错了。 如果你要设 只读+隐藏+系统 属性 ,那么要么传 1+2+4 进去,要么直接传个 7 进去。
=============
判断很简单
如传进去的形参是  n
if (n and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
if n and FILE_ATTRIBUTE_READONLY then

以上两种判断都可以,第二种是3楼的判断方法。
这里解释一下。
第一种: AND 运算后,所需值对应位上,都是1的情况下就会保留,否则就置为 0 。然后判断运算后的结果是不是与所需要的值相同。这是严格判断。
第二种: AND 去处后,如果得到的结果不是0 ,(在VB里也就是逻辑真),也就说明对应位上有值。结果为0 时,逻辑假,说明对应位上无值。
新手,建议使用第一种方式,熟练者,建议使用第二种。
#7
Ez330阿牛2014-03-06 22:23
回复 6楼 风吹过b
你说得不错,但是有点不明白,我先按你的方法试试看,谢谢了

[ 本帖最后由 Ez330阿牛 于 2014-3-6 22:25 编辑 ]
#8
Ez330阿牛2014-03-06 22:49
回复 6楼 风吹过b
试过了,这样的方法可以,但是还是有点不明白
#9
xlhcy20142014-03-07 00:02
举个例子,一个字节,有8位,代表8个不同的开关
0000 0001   = 十进制的 1
0000 0010   = 十进制的 2
0000 0100   = 十进制的 4
那么  1+4   =   0000 0101   相当于 把 第1个 和 第3个 开关打开了,即可认为同时实现2种功能,看懂这一步

那么,你需要的功能的数值就必须 2的n次方的数值(即把二进制转换成十进制)
#10
Ez330阿牛2014-03-08 12:53
回复 9楼 xlhcy2014
谢谢了,怎么把分给你
1