VB 의문점 part2

7304 단어 VB6.0VB. 네 t
이번에도 또 코드의 간략화가 의문점이 됩니다.
작성한 것은 이러한 디자인으로 참고서의 디자인을 바탕으로 작성했습니다.
참고서가 VB6.0의 것이었기 때문에, 비주얼 스튜디오를 이용해 스스로 작성한 것이 됩니다.



코드는 다음과 같습니다.

※이 시점에서는 아직 날짜 표시, 시각 표시, 굵게, 기울임꼴, 밑줄만이 되고 있습니다.
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

' 日付、時間の条件分岐
    Private Sub time()

        If optDate.Checked And optTime.Checked = True Then
            ' 英語&12h
            lblDate.Text = Format(Microsoft.VisualBasic.Today, "yyyy/MM/dd cl")
            lblTime.Text = Format(Microsoft.VisualBasic.TimeOfDay, "hh:mm:ss")
        ElseIf optDate.Checked And optTime1.Checked = True Then
            ' 英語&24h
            lblDate.Text = Format(Microsoft.VisualBasic.Today, "yyyy/MM/dd")
            lblTime.Text = Format(TimeString)
        ElseIf optDate1.Checked And optTime.Checked = True Then
            ' 日本語&12h
            lblDate.Text = Format(Microsoft.VisualBasic.Today, "yyyy年MM月dd日 (dddd)")
            lblTime.Text = Format(Microsoft.VisualBasic.TimeOfDay, "hh:mm:ss  tt")
        Else
            ' 日本語&24h
            lblDate.Text = Format(Microsoft.VisualBasic.Today, "yyyy年MM月dd日 (dddd)")
            lblTime.Text = Format(TimeString)
        End If

    End Sub

' 全チェックオブジェクト対応プロシージャ
    Private Sub CheckedChanged(sender As Object, e As EventArgs) Handles _
        optDate.CheckedChanged, optDate1.CheckedChanged, optTime.CheckedChanged, optTime1.CheckedChanged,
        chkBold.CheckedChanged, chkItalic.CheckedChanged, chkUnderLine.CheckedChanged

        If optDate.Checked Or optDate1.Checked Or optTime.Checked Or optTime1.Checked = True Then
            time()
        End If

' フォント指定
        If chkBold.Checked = True And chkItalic.Checked = True And chkUnderLine.Checked = True Then
            lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Bold Or FontStyle.Italic Or FontStyle.Underline)
            lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Bold Or FontStyle.Italic Or FontStyle.Underline)
        ElseIf chkBold.Checked = True And chkItalic.Checked = True And chkUnderLine.Checked = False Then
            lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Bold Or FontStyle.Italic)
            lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Bold Or FontStyle.Italic)
        ElseIf chkBold.Checked = True And chkItalic.Checked = False And chkUnderLine.Checked = True Then
            lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Bold Or FontStyle.Underline)
            lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Bold Or FontStyle.Underline)
        ElseIf chkBold.Checked = True And chkItalic.Checked = False And chkUnderLine.Checked = False Then
            lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Bold)
            lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Bold)
        ElseIf chkBold.Checked = False And chkItalic.Checked = True And chkUnderLine.Checked = True Then
            lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Italic Or FontStyle.Underline)
            lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Italic Or FontStyle.Underline)
        ElseIf chkBold.Checked = False And chkItalic.Checked = True And chkUnderLine.Checked = False Then
            lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Italic)
            lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Italic)
        ElseIf chkBold.Checked = False And chkItalic.Checked = False And chkUnderLine.Checked = True Then
            lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Underline)
            lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Underline)
        ElseIf chkBold.Checked = False And chkItalic.Checked = False And chkUnderLine.Checked = False Then
            lblDate.Font = New Font("ms ul gothic", 10)
            lblTime.Font = New Font("ms ul gothic", 10)
        End If
    End Sub
End Class


각 라벨과 체크박스의 이름은 다음과 같습니다.

영어 표시:lblDate, 한국어 표시:lblDate1
12h:lblTime, 24h:lblTime1
굵게: chkBold, 기울임꼴: chkItalic, 밑줄: chkUnderLine

여기서 의문이 된 것이 폰트 지정 부분의 코드 간략화입니다.
솔직히 이것은 Qiita에 올리기 전에 우선 동작하면 좋다고 해서 단순한 조건 분기로 만든 것이므로, 스스로 납득하고 있지 않습니다.
척의 유무의 패턴을 1개 1개 확인해 거기에 대응하도록(듯이) 폰트를 지정하고 있을 뿐이므로, 매우 사람에게 보여지는 것은 아닙니다. .

일단 자신 나름대로 여러가지 생각해 보고 간략화에 도전했습니다.

단순화를 목표로 그 1


If chkBold.Checked = True Then
    lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Bold)
    lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Bold)
ElseIf chkItalic.Checked = True Then
    lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Italic)
    lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Italic)
ElseIf chkUnderLine.Checked = True Then
    lblDate.Font = New Font("ms ul gothic", 10, FontStyle.Underline)
    lblTime.Font = New Font("ms ul gothic", 10, FontStyle.Underline)
Else
    lblDate.Font = New Font("ms ul gothic", 10)
    lblTime.Font = New Font("ms ul gothic", 10)
End If

우선 처음에 한 일.
실행하고 나서 깨달았지만 이것이라면 굵게 + 기울임꼴 등 복수의 지정시에
폰트 대응할 수 없다!

if 문이라면 중첩 할 수밖에 없을지도? ……

단순화를 목표로 그 2


Dim a As FontStyle
Dim b As FontStyle
Dim c As FontStyle

If chkBold.Checked Or chkItalic.Checked Or chkUnderLine.Checked = False Then
    If chkBold.Checked = True Then
        a = FontStyle.Bold
    End If

    If chkItalic.Checked = True Then
        b = FontStyle.Italic
    End If

    If chkUnderLine.Checked = True Then
        c = FontStyle.Underline
    End If

    lblDate.Font = New Font("ms ul gothic", 10 Or a Or b Or c)
    lblTime.Font = New Font("ms ul gothic", 10 Or a Or b Or c)
End If

이것이 원래 체크를 넣고 true로 하고 a에 대입한 후 체크를 해제한 경우
어떻게 하면 a의 내용이 사라지는가. . .FontStyle.Bold = false 같은 것을 할 수 있으면 else 문을 쓸 수 있지만, .net에는,
덧붙여서 else에게 a = ""라고 했는데 아무래도 네요. 웃음

단순화를 목표로 그 3


Dim a As String

If chkBold.Checked Or chkItalic.Checked Or chkUnderLine.Checked = False Then
    a = "New Font( " + Chr(34) + "ms ul gothic" + Chr(34) + ", 10"
    If chkBold.Checked = True Then
        a = a + "Or FontStyle.Bold"
    End If

    If chkItalic.Checked = True Then
        a = a + "Or FontStyle.Italic"
    End If

    If chkUnderLine.Checked = True Then
        a = a + "Or FontStyle.Underline"
    End If
    a = a + ")"

    lblDate.Font = a
    lblTime.Font = a
End If

그렇다면 문자열로 하고, 뒤에 연결을 해 가고 마지막에 ")"로 묶어 형태를 완성시키면 좋을까?
라고 생각해 보았습니다만,

심각도 수준 코드 설명 프로젝트 파일 행 억제 상태
오류 BC30311 'String' 형식의 값을 'Font'로 변환할 수 없습니다. p168

그렇습니다.

단순화는 역시 아직 어렵다.
덧붙여서 select case 문도 해 보았습니다만, 격침입니다.

뭔가 방법이 있으면 조금 공부하십시오.

이상입니다!

좋은 웹페이지 즐겨찾기