papapa314 发表于 2011-1-30 07:07:59

自定义函数能否return一个表达式

本帖最后由 papapa314 于 2011-1-30 10:49 编辑

现在有很多复选框,需要对复选框的状态进行判断,不同的复选框的组合需要不同的语句,为了节省语句,我想到了用自定义函数return一个表达式,函数如下:

Func _size($a)
        If GUICtrlRead($size)=$GUI_UNCHECKED Then
                Return 1=1
        EndIf
        If GUICtrlRead($size)=$GUI_CHECKED Then
                Return InetGetSize($a)>=GUICtrlRead($min)*1024 And InetGetSize($a)<=GUICtrlRead($max)*1024
        EndIf
       
EndFunc

把这个函数加进其它的复选框判断中,当$size没有选中的时候返回恒真表达式1=1,不影响原来if语句的判断,这样可以节省一半的语句,但是运行出错,自定义函数不能return一个表达式吗,还是我的写法错误?或者各位有更好的办法解决?

republican 发表于 2011-1-30 07:57:01

返回表达式的话,可以考虑使用字符串形式。

netegg 发表于 2011-1-30 08:26:24

本帖最后由 netegg 于 2011-1-30 08:31 编辑

首先搞明白return到底是干什么的,return 1=1 相当于return true,你觉得这样的话,前面的判断是用来干什么的
另外,多个复选框的判断,你这样简直是多此一举,什么叫节省一半语句,如果你这样算得话,七句就够了
for $i = 1 to n
if guictrlread(eval('$check' & $i)) = $gui_checked then
   
else

endif
next

papapa314 发表于 2011-1-30 10:01:53

本帖最后由 papapa314 于 2011-1-30 11:34 编辑

回复 3# netegg


你误会了,并不是所有复选框的选中都能用for语句,除非他们之间有某种关联。但当他们没有关联的时候,就不能用了。我举个例子,如果第一个复选框选中,则执行:
if InetGetSize($a)>=GUICtrlRead($min)*1024 and InetGetSize($a)<=GUICtrlRead($max)*2048

第二个复选框选择则执行if StringInStr($olink.href,GUICtrlRead($input1))

同时选中则执行if InetGetSize($a)>=GUICtrlRead($min)*1024 and InetGetSize($a)<=GUICtrlRead($max)*2048 and StringInStr($olink.href,GUICtrlRead($input1))

如果有三个复选框同时选中,情形更复杂,可以类推。

所以我才想到用StringInStr($olink.href,GUICtrlRead($input1)) and _size($a)

当第一个复选框没有选中,让_size($a)返回一个恒真表达式,相当于只判断StringInStr($olink.href,GUICtrlRead($input1))
当第一个复选框选中的时候,返回InetGetSize($a)>=GUICtrlRead($min)*1024 and InetGetSize($a)<=GUICtrlRead($max)*2048
第一个复选框的选择状态只要在一开始判断一下就行了,不用再分支,是能够省下一半语句的。

papapa314 发表于 2011-1-30 10:47:07

回复 2# republican


谢谢!return 一个字符串的形式,也就是return的内容加双引号,是可以正常return的,但问题是rerurn表达式完以后程序好像不对这个表达式进行判断,而直接判断return的表达式为真。

republican 发表于 2011-1-30 11:26:18

回复 5# papapa314

用字符串,只是为了能让Return正确返回值。要执行字符串,请用Execute。

再者, 我不知道
InetGetSize($a)>=GUICtrlRead($min)*1024 and InetGetSize($a)<=GUICtrlRead($min)*2048
这个究竟是啥值,请以机器能够理解的方式来表达。
你上面的这个语句,除了能作为条件进行判断之外,我不认为机器能够识别。

papapa314 发表于 2011-1-30 11:33:09

谢谢,我现在用Execute来试试看。
这个表达式是用来判断下载的文件的大小是否符合用户的设定。$a是下载网址,$min,$max分别是用户设定的最小值和最大值。晕,这里好像打错了,后面的是$max而不是$min,不好意思

papapa314 发表于 2011-1-30 12:07:39

回复 6# republican

哇,用Execute确实能用了,谢谢你,再一次帮了我的忙!
作为感谢,把这个分享给各位:

当存在多个复选框,而不同的复选框组合有不同的判断语句导致分支结构太多的时候,可以用自定义函数返回可以执行的字符串(其中包含一个恒真的字符串表达式),可以省下一半的语句。
例如,
if GUICtrlRead($check1))=$GUI_CHECKED then

if StringInStr($olink.href,GUICtrlRead($input1)) and Execute(_size(1)) then

msgbox(0,0,"0")
.
.
.
.
.
.
.
.
.(表示很多行代码)
endif
endif

Func _size($a)
        If $a>0 Then
       
        If GUICtrlRead($check2)=$GUI_UNCHECKED Then
        Return        "1=1"
        EndIf
        If GUICtrlRead($check2)=$GUI_CHECKED Then
                Return "InetGetSize($olink.href)>=GUICtrlRead($min)*1024 And InetGetSize($olink.href)<=GUICtrlRead($max)*1024"
        EndIf
        EndIf
EndFunc

如果不用自定义函数的话,就可能需要这样写:

if GUICtrlRead($check1))=$GUI_CHECKED and GUICtrlRead($check2))=$GUI_UNCHECKED then


if StringInStr($olink.href,GUICtrlRead($input1)) then

msgbox(0,0,"0")
.
.
.
.
.
.
.
.
..(表示很多行代码)

endif
endif


if GUICtrlRead($check1))=$GUI_CHECKED and GUICtrlRead($check2))=$GUI_CHECKED then


if StringInStr($olink.href,GUICtrlRead($input1)) and InetGetSize($a)>=GUICtrlRead($min)*1024 and InetGetSize($a)<=GUICtrlRead($max)*2048 then

msgbox(0,0,"0")
.
.
.
.
.
.
.
.
..(表示很多行代码)

endif
endif

很显然,可以使程序的语句大为精简。

stcyk 发表于 2011-1-30 17:02:44

返回表达式的话,可以考虑使用字符串形式。

sxd 发表于 2011-1-31 12:40:39

我回帖一个都没看我只回答标题
可以

easied 发表于 2011-1-31 18:23:48

怎么看都觉得很别扭.

我碰到这种问题的时候,假设是n个复选框,解决办法是:
1.设定一下函数fn_IsCheck(),判断具体某个选项是否被选中了,如果选中了返回1,没选中选回0.
2.设置一组代码.分别对应不同的按键值.在执行前,先把全部代码加起来,得到一个数值
$iCode = 0
If fn_IsCheck($sButton1) Then $iCode &= 1
If fn_IsCheck($sButton2) Then $iCode &= 2
If fn_IsCheck($sButton3) Then $iCode &= 4
If fn_IsCheck($sButton4) Then $iCode &= 8
If fn_IsCheck($sButton5) Then $iCode &= 16
If fn_IsCheck($sButton6) Then $iCode &= 32
If fn_IsCheck($sButton7) Then $iCode &= 64
If fn_IsCheck($sButton8) Then $iCode &= 1283.最后根据$iCode 使用Select..case来执行不同的任务.
页: [1]
查看完整版本: 自定义函数能否return一个表达式