VB.NET ネタです。
本ネタでは 画像またはテキストファイルをドラッグ&ドロップして
フォーム上に表示するサンプルをご紹介。
動きはこんな感じです・・
フォーム左側に PictureBox を、右側に TextBox を配置しています。
エクスプローラなどから、画像ファイル・テキストファイルをドラッグ&ドロップして
画像またはテキストを表示します。
なお、画像であるかテキストであるかは、ファイルの拡張子で判断しています。
判断の元になる拡張子はプログラム内で登録しています。
また、画像ファイルの場合は、ドラッグ中(イベントは DragOver)に画像を表示するようにしています。
テキストファイルの場合は、北窓舎のロゴ画像を表示しています。
これがサンプルの肝となる部分です。
コードは次のとおりです。
=================================================================
' --- 変数
Private IsText As Boolean ' -- ファイル内容が文字列型に変換可能なら True
Private IsImage As Boolean ' -- 画像ファイルなら True
' --- フォームロード時
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.AllowDrop = True
Me.TextBox1.AllowDrop = True
' ---
With Me.pct_DD
.SizeMode = PictureBoxSizeMode.Zoom
.Visible = False
End With
' ---
Me.PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
Me.Label_FileName.Text = "ファイルをドラッグ&ドロップしてください"
End Sub
' ---● Drag Enter
Private Sub Form1_DragEnter(sender As Object, e As DragEventArgs) _
Handles MyBase.DragEnter, PictureBox1.DragEnter, TextBox1.DragEnter
' --- コントロール初期化
Me.PictureBox1.Image = Nothing
Me.TextBox1.Text = ""
' --- 変数初期化
Me.IsText = False
Me.IsImage = False
' --- ドラッグ中のファイルやディレクトリを文字型配列に格納
Dim Drags() As String = CType(e.Data.GetData(DataFormats.FileDrop), String())
' --- フォルダーかファイルかを判別(FileSystemType)
Select Case Me.fnc_FileSystemType(Drags)
Case = "File"
' ---▼ ファイルの場合
e.Effect = DragDropEffects.Copy ' -- コピーを可能にする
Me.Label_FileName.Text = Drags(0) ' -- ファイル名(フルパス)
' --- ドラッグされているファイルをテキストとみなすか?
If (Me.fnc_IsText(Me.Label_FileName.Text)) Then
Me.IsText = True
Me.pct_DD.Image = My.Resources.Hokusosha_Logo
Me.pct_DD.Visible = True
Exit Sub
End If
'--- ドラッグされているファイルを画像とみなすか?
If (Me.fnc_IsImage(Me.Label_FileName.Text)) Then
Me.IsImage = True
Me.pct_DD.Image = Image.FromFile(Me.Label_FileName.Text)
Me.pct_DD.Visible = True
Exit Sub
End If
Case = "Folder"
' ---▼ フォルダーの場合
e.Effect = DragDropEffects.None ' -- コピー不可
Me.Label_FileName.Text = "フォルダーはドラッグ&ドロップできません"
Case Else
e.Effect = DragDropEffects.None ' -- コピー不可
Me.Label_FileName.Text = "ドラッグ対象が不明です"
End Select
End Sub
' ---● Drag Over
Private Sub Form1_DragOver(sender As Object, e As DragEventArgs) _
Handles MyBase.DragOver, PictureBox1.DragOver, TextBox1.DragOver
' --- フォームを基準に、スクリーン座標をクライアント座標に変換して表示
Dim clientPos As Point = Me.PointToClient(Cursor.Position)
Me.pct_DD.Location = New Point(clientPos.X + 20, clientPos.Y + 20)
End Sub
' ---● Drag Drop
Private Sub Form1_DragDrop(sender As Object, e As DragEventArgs) _
Handles MyBase.DragDrop, PictureBox1.DragDrop, TextBox1.DragDrop
' ---
If (Me.IsText) Then
Dim Reader As IO.StreamReader = New IO.StreamReader(Me.Label_FileName.Text)
Me.TextBox1.Text = Reader.ReadToEnd
Reader.Close()
Me.pct_DD.Visible = False
Exit Sub
End If
' ---
If (Me.IsImage) Then
Me.PictureBox1.Image = Image.FromFile(Me.Label_FileName.Text)
Me.pct_DD.Visible = False
Exit Sub
End If
' ---
Me.TextBox1.Text = "ドラッグ&ドロップ対象外のファイルです"
End Sub
' ---[関数]ドラッグされたものがフォルダーかファイルかを判別
Private Function fnc_FileSystemType(ByVal drags() As String) As String
If (System.IO.File.Exists(drags(0)) = True) Then
Return "File"
ElseIf (System.IO.Directory.Exists(drags(0)) = True) Then
Return "Folder"
Else
Return "None"
End If
End Function
' ---[関数]テキストとみなすか?
Private Function fnc_IsText(ByVal fileName As String) As Boolean
' ---[配列]テキストとみなす拡張子
Dim AryExt() As String = {".txt", ".csv", ".htm", ".html"}
' ---
Dim ext As String = System.IO.Path.GetExtension(fileName)
For idx As Integer = 0 To AryExt.Length - 1
If (ext.ToLower = AryExt(idx)) Then
Return True
End If
Next
' ---
Return False
End Function
' ---[関数]画像とみなすか?
Private Function fnc_IsImage(ByVal fileName As String) As Boolean
' ---[配列]画像とみなす拡張子
Dim AryExt() As String = {".jpg", ".jpeg", ".png", ".gif", ".bmp"}
' ---
Dim ext As String = System.IO.Path.GetExtension(fileName)
For idx As Integer = 0 To AryExt.Length - 1
If (ext.ToLower = AryExt(idx)) Then
Return True
End If
Next
' ---
Return False
End Function
=================================================================
サンプル DragDrop_Plus1.zip のダウンロードはここから・・・
コード、フォームなどすべてを含んでいます。
# サンプルとしてご提示しているコードは、実際に使っているコードです。
もちろん全く同一というわけではなく、実際にはもう少し複雑なコードで、
例外処理も入れています。
公開には2つの意図があります。
1つは、だれかの参考になればいいというもの。
もう1つは、よりシンプルであったり、効率的であったり、分かりやすいコードを
提案して頂きたいというもの。
あることを実現するのに、何種類ものコードが考えられます。
プログラミングに唯一の回答はないと思っています。
なので、より良いコードを教えてほしい、そのためにサンプルを公開・・・
というわけです。
# 開発環境は Visual Studio です。
個人や学生さんなら Visual Studio Community が使えます(無償です)。
ここからダウンロードできます。
---------------------------------------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・
# ご質問にはできる限りお答えしています。
ただし、お名前(本名の姓 and/or 名)を書いていただいた場合に限らせていただきます。
ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・
本ネタでは 画像またはテキストファイルをドラッグ&ドロップして
フォーム上に表示するサンプルをご紹介。
動きはこんな感じです・・
フォーム左側に PictureBox を、右側に TextBox を配置しています。
エクスプローラなどから、画像ファイル・テキストファイルをドラッグ&ドロップして
画像またはテキストを表示します。
なお、画像であるかテキストであるかは、ファイルの拡張子で判断しています。
判断の元になる拡張子はプログラム内で登録しています。
また、画像ファイルの場合は、ドラッグ中(イベントは DragOver)に画像を表示するようにしています。
テキストファイルの場合は、北窓舎のロゴ画像を表示しています。
これがサンプルの肝となる部分です。
コードは次のとおりです。
=================================================================
' --- 変数
Private IsText As Boolean ' -- ファイル内容が文字列型に変換可能なら True
Private IsImage As Boolean ' -- 画像ファイルなら True
' --- フォームロード時
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.AllowDrop = True
Me.TextBox1.AllowDrop = True
' ---
With Me.pct_DD
.SizeMode = PictureBoxSizeMode.Zoom
.Visible = False
End With
' ---
Me.PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
Me.Label_FileName.Text = "ファイルをドラッグ&ドロップしてください"
End Sub
' ---● Drag Enter
Private Sub Form1_DragEnter(sender As Object, e As DragEventArgs) _
Handles MyBase.DragEnter, PictureBox1.DragEnter, TextBox1.DragEnter
' --- コントロール初期化
Me.PictureBox1.Image = Nothing
Me.TextBox1.Text = ""
' --- 変数初期化
Me.IsText = False
Me.IsImage = False
' --- ドラッグ中のファイルやディレクトリを文字型配列に格納
Dim Drags() As String = CType(e.Data.GetData(DataFormats.FileDrop), String())
' --- フォルダーかファイルかを判別(FileSystemType)
Select Case Me.fnc_FileSystemType(Drags)
Case = "File"
' ---▼ ファイルの場合
e.Effect = DragDropEffects.Copy ' -- コピーを可能にする
Me.Label_FileName.Text = Drags(0) ' -- ファイル名(フルパス)
' --- ドラッグされているファイルをテキストとみなすか?
If (Me.fnc_IsText(Me.Label_FileName.Text)) Then
Me.IsText = True
Me.pct_DD.Image = My.Resources.Hokusosha_Logo
Me.pct_DD.Visible = True
Exit Sub
End If
'--- ドラッグされているファイルを画像とみなすか?
If (Me.fnc_IsImage(Me.Label_FileName.Text)) Then
Me.IsImage = True
Me.pct_DD.Image = Image.FromFile(Me.Label_FileName.Text)
Me.pct_DD.Visible = True
Exit Sub
End If
Case = "Folder"
' ---▼ フォルダーの場合
e.Effect = DragDropEffects.None ' -- コピー不可
Me.Label_FileName.Text = "フォルダーはドラッグ&ドロップできません"
Case Else
e.Effect = DragDropEffects.None ' -- コピー不可
Me.Label_FileName.Text = "ドラッグ対象が不明です"
End Select
End Sub
' ---● Drag Over
Private Sub Form1_DragOver(sender As Object, e As DragEventArgs) _
Handles MyBase.DragOver, PictureBox1.DragOver, TextBox1.DragOver
' --- フォームを基準に、スクリーン座標をクライアント座標に変換して表示
Dim clientPos As Point = Me.PointToClient(Cursor.Position)
Me.pct_DD.Location = New Point(clientPos.X + 20, clientPos.Y + 20)
End Sub
' ---● Drag Drop
Private Sub Form1_DragDrop(sender As Object, e As DragEventArgs) _
Handles MyBase.DragDrop, PictureBox1.DragDrop, TextBox1.DragDrop
' ---
If (Me.IsText) Then
Dim Reader As IO.StreamReader = New IO.StreamReader(Me.Label_FileName.Text)
Me.TextBox1.Text = Reader.ReadToEnd
Reader.Close()
Me.pct_DD.Visible = False
Exit Sub
End If
' ---
If (Me.IsImage) Then
Me.PictureBox1.Image = Image.FromFile(Me.Label_FileName.Text)
Me.pct_DD.Visible = False
Exit Sub
End If
' ---
Me.TextBox1.Text = "ドラッグ&ドロップ対象外のファイルです"
End Sub
' ---[関数]ドラッグされたものがフォルダーかファイルかを判別
Private Function fnc_FileSystemType(ByVal drags() As String) As String
If (System.IO.File.Exists(drags(0)) = True) Then
Return "File"
ElseIf (System.IO.Directory.Exists(drags(0)) = True) Then
Return "Folder"
Else
Return "None"
End If
End Function
' ---[関数]テキストとみなすか?
Private Function fnc_IsText(ByVal fileName As String) As Boolean
' ---[配列]テキストとみなす拡張子
Dim AryExt() As String = {".txt", ".csv", ".htm", ".html"}
' ---
Dim ext As String = System.IO.Path.GetExtension(fileName)
For idx As Integer = 0 To AryExt.Length - 1
If (ext.ToLower = AryExt(idx)) Then
Return True
End If
Next
' ---
Return False
End Function
' ---[関数]画像とみなすか?
Private Function fnc_IsImage(ByVal fileName As String) As Boolean
' ---[配列]画像とみなす拡張子
Dim AryExt() As String = {".jpg", ".jpeg", ".png", ".gif", ".bmp"}
' ---
Dim ext As String = System.IO.Path.GetExtension(fileName)
For idx As Integer = 0 To AryExt.Length - 1
If (ext.ToLower = AryExt(idx)) Then
Return True
End If
Next
' ---
Return False
End Function
=================================================================
サンプル DragDrop_Plus1.zip のダウンロードはここから・・・
コード、フォームなどすべてを含んでいます。
# サンプルとしてご提示しているコードは、実際に使っているコードです。
もちろん全く同一というわけではなく、実際にはもう少し複雑なコードで、
例外処理も入れています。
公開には2つの意図があります。
1つは、だれかの参考になればいいというもの。
もう1つは、よりシンプルであったり、効率的であったり、分かりやすいコードを
提案して頂きたいというもの。
あることを実現するのに、何種類ものコードが考えられます。
プログラミングに唯一の回答はないと思っています。
なので、より良いコードを教えてほしい、そのためにサンプルを公開・・・
というわけです。
# 開発環境は Visual Studio です。
個人や学生さんなら Visual Studio Community が使えます(無償です)。
ここからダウンロードできます。
---------------------------------------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・
# ご質問にはできる限りお答えしています。
ただし、お名前(本名の姓 and/or 名)を書いていただいた場合に限らせていただきます。
ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・