北の窓から(芦田っち)

PC関連と私的雑感のブログ。
2015年7月10日、カッコ内に名前を加えました。昔の友だちに気付いてほしくて・・・

【VB.NET】ドラッグ&ドロップして画像・テキストを表示(サンプル・ダウンロード可能)

2020-06-02 07:53:13 | VB.NET
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 名)を書いていただいた場合に限らせていただきます。


ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 【VB.NET】DataGridView - ド... | トップ | ~ 2020/6/18 新型コロナウイ... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

VB.NET」カテゴリの最新記事