处理大量的“IF”

时间:2013-09-11 09:03:01

标签: vb6

我的代码中有一大块ifs,我不想放入数组,因为我需要它们有唯一的名称。

我如何为这块IF制作更小的代码?

If chkPO.Value = True Then
    ReportTaskCount = ReportTaskCount + 1
End If

If chkGRN.Value = True Then
    ReportTaskCount = ReportTaskCount + 1
End If

If chkSO.Value = True Then
    ReportTaskCount = ReportTaskCount + 1
End If

etc

etc

etc

5 个答案:

答案 0 :(得分:2)

你应该做的第一件事是摆脱多余的= True位。布尔值的全部意义在于,不必将它们与其他布尔值进行比较 - 您只需说if somethingif not something。否则,你在哪里停下来?类似的东西:

If ((chkSO.Value = True) = True) = True Then

无限广告?

请记住,标准复选框的值(假设它们是您正在使用的复选框)是一个整数,对于未选中可以是0,对于已检查可以是1,对于灰色可以是2。因此,您的代码(和我的代码)依赖于隐式转换为布尔值。如果您没有将代码中的框变灰,那将不会成为问题,因为0(未选中)将被强制为false。但是,灰色将被视为检查了bos。

如果您允许灰显,则可能需要修改代码以将其考虑在内。如何执行此操作取决于您希望如何处理灰色复选框,这只是您可以做出的决定。如果您没有将状态设置为灰色,则可以忽略此状态,并忽略前一段。

然后,假设您不能使用数组(如您所述),您至少可以使用if语句的单行变体:

If chkPO.Value  Then ReportTaskCount = ReportTaskCount + 1
If chkGRN.Value Then ReportTaskCount = ReportTaskCount + 1
If chkSO.Value  Then ReportTaskCount = ReportTaskCount + 1

这应该会使代码大小减少大约75%(基于行数),这是一个很大的数量。

答案 1 :(得分:0)

在这种情况下,我认为您应该考虑使用IIF function;

ReportTaskCount = IIF(chkPO.Value, ReportTaskCount + 1, ReportTaskCount)
ReportTaskCount = IIF(chkGRN.Value, ReportTaskCount + 1, ReportTaskCount)

这可能会节省您的时间并保持可读性。

并且无需为每个条件指定= True,因为它是布尔值

答案 2 :(得分:0)

对于这么简单的事情可能有点多,但如果你有一百个如此 -

Private mReportTaskCount As Integer

Private Sub IncrementCount(ByVal blnValue As Boolean)
    If blnValue Then mReportTaskCount = mReportTaskCount + 1
End Sub

Private Sub Whatever()
    IncrementCount chkPO.Value
    IncrementCount chkGRN.Value
    IncrementCount chkSO.Value
    IncrementCount chkBLU.Value
    IncrementCount chkYEL.Value
    IncrementCount chkPUR.Value
End Sub

答案 3 :(得分:0)

Public Sub YourSub()
    ReportTaskCount = CountTrueBooleans (chkPO.Value, chkGRN.Value, chkSO.Value)
End Sub

Public Function CountTrueBooleans (ParamArray Values())
    Dim ret as long
    For i = LBound(aa) To UBound(Values)
        If Values(i) <> 0 Then ret = ret + 1 'checking for "True" and counting them...
    Next
    CountTrueBooleans = ret
End Function

答案 4 :(得分:0)

如果您知道要为窗口上所有已检查的CheckBox控件增加ReportTaskCount,则可以执行以下操作:

Private Sub MakeReportTaskCount()

    Dim ctl As Control

    ReportTaskCount = 0

    For Each ctl In Controls
        If TypeOf ctl Is CheckBox Then
            ReportTaskCount = ReportTaskCount + 1
        End If
    Next ctl

End Sub

或者,您可以为每个CheckBox赋予其Tag属性特殊值,例如: “ReportCountCheck”,并进行字符串比较而不是TypeOf检查。