开发者

Boolean Table in VB.Net - Select Case, If-Else, or Something else?

I'm looking to simplify the handling of a three-item Boolean expression. "Select Case" doesn't seem offer a solution for triple values, and the If statement seems a bit much. It'll work the way I coded it, but if you have any ideas on how to simplify this, I'd appreciate your insights. If not, I hope this snippet can save someone else a little time.

Public Sub SetThisFontStyle(ByRef theTextBox As RichTextBox, ByVal StyleToChange As String)

    'Get Initial Values:'
    Dim BoldState As Boolean = theTextBox.SelectionFont.Bold
    Dim ItalicState As Boolean = theTextBox.SelectionFont.Italic
    Dim UnderlineState As Boolean = theTextBox.SelectionFont.Underline

    'Find out what we re trying to change:'
    Select Case StyleToChange
        Case "Bold" : If BoldState Then BoldState = False Else BoldState = True
        Case "Italic" : If ItalicState Then ItalicState = False Else ItalicState = True
        Case "Underline" : If UnderlineState Then UnderlineState = False Else UnderlineState = True
        Case Else : Exit Sub
    End Select

    'Boolean Table just for reference:'
    '0 - 0 - 0 None'
    '1 - 0 - 0 Bold Only'
    '0 - 1 - 0 Italic Only'
    '0 - 0 - 1 Underline Only'
    '1 - 1 - 0 Bold and Italic'
    '0 - 1 - 1 Italic and Underline '
    '1 - 0 - 1 Bold and Underline'
    '1 - 1 - 1 Bold, Italic, and Underline'

    If Not BoldState And Not ItalicState And Not UnderlineState Then
        'Regular, without any styles'
        theTextBox.SelectionFont = _
        New F开发者_C百科ont(txtRichText.SelectionFont, Drawing.FontStyle.Regular)
    ElseIf BoldState And Not ItalicState And Not UnderlineState Then
        'Bold Only'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Bold)
    ElseIf Not BoldState And ItalicState And UnderlineState Then
        'Italic Only'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Italic)
    ElseIf Not BoldState And Not ItalicState And UnderlineState Then
        'Underline Only'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Underline)
    ElseIf BoldState And ItalicState And Not UnderlineState Then
        'Bold and Italic'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Bold + Drawing.FontStyle.Italic)
    ElseIf Not BoldState And ItalicState And UnderlineState Then
        'Italic and Underline'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Italic + Drawing.FontStyle.Underline)
    ElseIf BoldState And Not ItalicState And UnderlineState Then
        'Bold and Underline'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Bold + Drawing.FontStyle.Underline)
    ElseIf BoldState And ItalicState And UnderlineState Then
        'Bold, Italic, and Underline'
        theTextBox.SelectionFont = _
        New Font(txtRichText.SelectionFont, Drawing.FontStyle.Bold + Drawing.FontStyle.Italic + Drawing.FontStyle.Underline)
    Else
        Exit Sub
    End If

End Sub


I would use an Enum with the [Flags] attribute and then you can check combinations. It would also make the code more readable.

[Flags]
public enum TextSettingType
{
    None = 0x0,
    Bold = 0x1,
    Italic = 0x2,
    Underline = 0x3
}

Sorry about the C#, not sure how to translate that to VB.Net


 'Boolean Table just for reference:'
        '0 - 0 - 0 None' = 0
        '1 - 0 - 0 Bold Only' = 4
        '0 - 1 - 0 Italic Only' = 2
        '0 - 0 - 1 Underline Only' = 1
        '1 - 1 - 0 Bold and Italic' = 6
        '0 - 1 - 1 Italic and Underline' = 3
        '1 - 0 - 1 Bold and Underline' = 5
        '1 - 1 - 1 Bold, Italic, and Underline' = 7

        Dim bold As Boolean = False
        Dim italic As Boolean = False
        Dim under As Boolean = False
        Dim fNum As Byte

        If chkBold.Checked Then
            bold = True
        End If
        If chkItalic.Checked Then
            italic = True
        End If
        If chkUnder.Checked = True Then
            under = True
        End If

        fNum = ((4 * Convert.ToByte(bold)) + (2 * Convert.ToByte(italic)) + (1 * Convert.ToByte(under)))
        'MsgBox(fNum)

        Select Case fNum
            Case 0
                ' Regular
                txtEntry.Font = New Font("Arial", 12, FontStyle.Regular)
            Case 1
                ' Underline
                txtEntry.Font = New Font("Arial", 12, FontStyle.Underline)
            Case 2
                ' Italic
                txtEntry.Font = New Font("Arial", 12, FontStyle.Italic)
            Case 3
                ' Italic and Underline
                txtEntry.Font = New Font("Arial", 12, FontStyle.Italic Or FontStyle.Underline)
            Case 4
                ' Bold
                txtEntry.Font = New Font("Arial", 12, FontStyle.Bold)
            Case 5
                ' Bold and Underline
                txtEntry.Font = New Font("Arial", 12, FontStyle.Bold Or FontStyle.Underline)
            Case 6
                ' Bold and Italic
                txtEntry.Font = New Font("Arial", 12, FontStyle.Bold Or FontStyle.Italic)
            Case 7
                'Bold, Italic, and Underline
                txtEntry.Font = New Font("Arial", 12, FontStyle.Bold Or FontStyle.Italic Or FontStyle.Underline)
        End Select
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜