今回もまたコードの簡略化が疑問点となります。
作成した物はこのようなデザインで、参考書のデザインをもとに作成しました。
参考書が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文もやってみましたが、撃沈です。
なにか方法があれば少しお勉強させてください。
以上です!