2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VB 疑問点part2

Last updated at Posted at 2017-07-13

今回もまたコードの簡略化が疑問点となります。
作成した物はこのようなデザインで、参考書のデザインをもとに作成しました。
参考書がVB6.0の物であったため、visual studioを用いて自分で作成した物となります。

コードは以下の物になります。

※この時点ではまだ日付表示、時刻表示、太字、斜体、下線のみとなっております。

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

各ラベルやチェックボックスのNameは以下の通りです。

英語表示: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文もやってみましたが、撃沈です。

なにか方法があれば少しお勉強させてください。

以上です!

2
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?