後々の拡張を前提に設計してあれば良いのですが ... 。
往々にして、こんな場合には、見通しの悪いコードになっている事が多いものです。
気を付けましょうね。
実は、msdn の ご質問に返信する形で、コードをちょこちょこっと、書きました。
そして書きながら思ったのです。
最初から書いていれば、こんな流れにはならないのだろうな! っと。
その投稿は 2回に渡ります。
https://social.msdn.microsoft.com/Forums/ja-JP/8e669e37-9bf6-4cc5-9f07-f5eaa32f0b5e#2d2f9e0e-87f4-4623-add5-7079ad2f4cb6
https://social.msdn.microsoft.com/Forums/ja-JP/15871804-18c2-48c7-99f8-53f10b59b5c6?forum=vbgeneralja
元々、ご質問者さんが参考になさったコードが在って、 それに機能追加を2回行った形です。
一応、動く事を確認して、上げたのですが ... 。
その時の感想が冒頭に書いた なんかスッキリしない のです。
別の書き方をしたいなぁ~ と思ったのが、正直な感想でした。
只、そうした書き方をすれば、ご質問者さんの混乱を招き兼ねない と思いましたので、
敢えて、この形にしました。
元のコードの 拡張路線 ですね。
大元の構成である、 OpenFileDialog から択一選択されたファイルを元に、
他のファイル群をも扱う形ですね。
今回の経験は、多かれ少なかれ、自分の書いたものでも起こり得る点に、慄いたのです。
あっ、 ぐちゃぐちゃにしている! と。
(正確には、仕様変更に基づき、ロジックを変えたい欲求に駆られました。)
自分の他のコードに較べれば、今回のものは スパゲッティ度! は低いのですが ... 。
でも、 何か、違うのになぁ~ と 呟く私 がいます。
重複しますが、そのコードを 引用(再掲) して置きます。
Public Class Form1
Dim listPics As New List(Of String)
Dim currentPicIndex As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Form デザイン追加指定
Me.PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
Me.PictureBox1.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right
Me.upButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
'コマンドライン引数処理
Dim args() As String = GetCmdArgs()
If args.Count > 0 Then
listPics.Clear()
listPics.AddRange(args)
currentPicIndex = 0
PictureBox1.Load(listPics(0))
Dim t = "" 'for Debug Point
End If
End Sub
Private Sub showButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles showButton.Click
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
PictureBox1.Load(OpenFileDialog1.FileName)
'変数にファイル群取得
Dim path As String = IO.Path.GetDirectoryName(OpenFileDialog1.FileName)
Dim files As String() = IO.Directory.GetFiles(path, "*.jpg")
listPics.Clear()
listPics.AddRange(files)
currentPicIndex = listPics.IndexOf(OpenFileDialog1.FileName())
Dim t = "" 'for Debug Point
End If
End Sub
Private Sub upButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles upButton.Click
'画像ナシなら何もしない
If Me.PictureBox1.Image Is Nothing Then
Exit Sub
End If
Dim t = "" 'for Debug Point
'画像切り替え 戻る
currentPicIndex = currentPicIndex - 1
If currentPicIndex < 0 Then
currentPicIndex = listPics.Count - 1
End If
PictureBox1.Load(listPics(currentPicIndex))
End Sub
Private Function GetCmdArgs() As String()
Dim value() As String = Nothing
Dim valueList As New List(Of String)
Dim cmdArgs() As String = Environment.GetCommandLineArgs
Dim cmdArgTxt As New System.Text.StringBuilder
If cmdArgs.Count > 1 Then
For i As Integer = 1 To cmdArgs.Count - 1 'First Is AppFile
If IsMatchTarget(cmdArgs(i)) Then
valueList.Add(cmdArgs(i))
End If
Next
End If
value = valueList.ToArray
Return value
End Function
Private Function IsMatchTarget(ByVal fileName As String) As Boolean
Dim fileExt() As String = {".jpg", ".jpeg"} 'Set Lower Char.
Dim value As Boolean = False
'Check File Exists (For Mistyping)
If Not IO.File.Exists(fileName) Then
Return value
Exit Function
End If
'Check File's Extension
For i As Integer = 0 To fileExt.Count - 1
If IO.Path.GetExtension(fileName).ToLower = fileExt(i) Then
value = True
Exit For
End If
Next
'Check ... If You Need, Add Here
'If Then
'
'End If
Return value
End Function
画面設計 |
0 件のコメント:
コメントを投稿