読者です 読者をやめる 読者になる 読者になる

C#で、テキストファイルをドラッグ&ドロップで入力する

前回の続きっぽい。
CSVときたら、次はファイル入出力でしょ。

環境
Windows 7 Pro
Visual Studio 2010

参考にしたサイトは
C#で作る、あなただけのメモ帳 ~ドラッグ・アンド・ドロップ機能の実装~ - 帝国の野望ブログ - ものえおさむ - builder

まず、Windowsフォームアプリケーションを作るのは当たり前。

GUI部分の準備開始。

フォームにドロップした時点でファイルを読みたいなら

フォームのプロパティを選択しAllowDropをTrueにする。(これ大事!)

f:id:tatuas:20121108210859j:image

フォームのイベントハンドラ(雷マーク)の
DragDropイベントとDragEnterイベントをダブルクリックしてイベントを生成する。

f:id:tatuas:20121108210901j:image

今回は読み込んだテキストファイルのテキストをRichTextBoxで表示させるので、
フォームのコンポーネントに追加しておく。

f:id:tatuas:20121108211513j:image

これでGUIの準備は完了。

次はソース部分。

今回は、File関連のラッパークラス(?)としてmyFile.csを作ったので、まずそれを読み込む事にする。
プロジェクトに下記のクラスを作成。
クラスの追加について詳しくは
C#で、プロジェクトにクラスを追加する
を参照。

myFile.cs

using System;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormApplication1
{
    class MyFile
    {
        // fileNumは複数ドロップされた時、何番目のファイルパスを読み込むかを決める。
        // ファイルパスは配列で入って来る。普通は最初のだから0を指定。
        public string returnfilePath(DragEventArgs e, int fileNum)
        {
            string[] dragFilePathArr = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            string filePath = dragFilePathArr[fileNum];
            return filePath;
        }

        public bool checkFileType(string filePath)
        {
            //読み込みを許可するファイルの拡張子を指定 (app.config に定義した方が本当は便利。)
            string[] extnArray = { "txt", "cs", "vb", "htm", "html", "xml", "csv", "js", "vbs", "wsh" };
            foreach (string extn in extnArray)
            {
                int dotLen = extn.Length;
                if (extn == filePath.Substring(filePath.Length - dotLen, dotLen))
                {
                    return true;
                }
            }
            return false;
        }

        public bool isDropedFileAccessible(DragEventArgs e)
        {
            //ドラッグされたのがファイルであるか確認
            if ((e.Data.GetDataPresent(DataFormats.FileDrop)))
            {
                //ドラッグされたデータを受け取る
                return true;
            }
            else
            {
                //ドラッグされたデータを受け取らない
                return false;
            }
        }
    }
}

あとはProgram.csの各イベントにソースを追加する。
using節にIOの追加を忘れずに。

今回のフォーム名はMainForm.csにしているので注意。

Program.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

//これの追加を忘れない
using System.IO;

namespace WindowsFormApplication1
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();            
        }

        // 自分用のファイルクラスの読込
        MyFile myFile = new MyFile();

        private void MainForm_DragDrop(object sender, DragEventArgs e)
        {
            string fileName = myFile.returnfilePath(e, 0);
            if (myFile.checkFileType(fileName))
            {
                richTextBox1.Text = File.ReadAllText(fileName, Encoding.Default);
            }
        }

        private void MainForm_DragEnter(object sender, DragEventArgs e)
        {
            //ドラッグされたのがファイルであるか確認
            if (myFile.isDropedFileAccessible(e))
            {
                //ドラッグされたデータを受け取る
                e.Effect = DragDropEffects.All;
            }
            else
            {
                //ドラッグされたデータを受け取らない
                e.Effect = DragDropEffects.None;
            }
        }
    }
}

これで再生ボタンから実行すれば動作が確認できるはずだ。

どうでもいいが、C#Delphiよりはるかにコンパイルが遅い。
ややストレスだ・・・