前回の「【MSBuilder】MSBuildの機能を実装する」のプログラムを使っていたら、ちょっと不満があったので、
ちょびっと改良
することにしました。その内容は、
(1)MSBuilder用のmsbファイルやビルド用のcsproj | slnファイルを与えて起動出来るようにする。
(2)同様にこれらのファイルをドラッグアンドドロップ出来るようにする。
だけです。(でも、これらをつけるとちょっと使い勝手が良くなります。)
変更点だけ、↓に記します。
//Drag and Dropのイベントハンドラの追加(2025年05月05日追加-MSB_Loadに追加する))
txtBox.DragEnter += new DragEventHandler(TB_DragEnter);
txtBox.DragDrop += new DragEventHandler(TB_DragDrop);
txtBox.AllowDrop = true;
//2025年05月05日追加(MSB_Loadの最後に追加する)
//起動時の引数をチェックし、引数にファイル名があればそれを読み込む
string[] arg = System.Environment.GetCommandLineArgs();
if(arg.Length > 1)
{
string ext = Path.GetExtension(arg[1]);
if(ext == ".MSB" || ext == ".msb")
{
//MSBDataFileを記録し、TargetFileとSwitchを読み込み、設定する
MSBDataFile = arg[1];
string InFile = File.ReadAllText(MSBDataFile, Encoding.GetEncoding("shift-jis"));
string[] tokens = Regex.Split(InFile, @"\r\n|="); //改行または'='をセパレーターとして分割する
if(tokens[0] == "TargetFile" && tokens[2] == "MSBSwitch") //出力形式が合う場合
{
//slnまたはprojファイル名を記録
tssl[1].Text = TargetFile = tokens[1];
tssl[1].ToolTipText = TargetFile; //ToolTip設定
//slnまたはprojファイル名を表示
txtBox.Text = File.ReadAllText(TargetFile, Encoding.GetEncoding("shift-jis"));
MSBSwitch = tokens[3];
}
}
else if(ext == ".CSPROJ" || ext == ".csproj" || ext == ".SLN" || ext == ".sln")
{
//slnまたはprojファイル名を記録
tssl[1].Text = TargetFile = arg[1];
tssl[1].ToolTipText = TargetFile; //ToolTip設定
//slnまたはprojファイル名を表示
txtBox.Text = File.ReadAllText(TargetFile, Encoding.GetEncoding("shift-jis"));
MSBSwitch = ""; //MSBSwitchを初期化する
MSBDataFile = ""; //MSBDataFileを初期化する
MessageBox.Show("現在のビルド情報は「保存」しなければ失われてしまいます。\r\n必ず「保存」してください。", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
MessageBox.Show("ファイルパスでない文字列です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
//2025年05月05日追加(MSBクラスの最後に追加する)
///////////////////////////
//コントロール関連メソッド
///////////////////////////
//txtBoxにドラッグされた時
private void TB_DragEnter(object sender, DragEventArgs e)
{
if(e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
//txtBoxにドロップされたとき
private void TB_DragDrop(object sender, DragEventArgs e)
{
//ドロップされたファイルパスを取得
string[] ddlist = (string[])e.Data.GetData(DataFormats.FileDrop, false);
foreach(string dd in ddlist)
{
string ext = Path.GetExtension(dd);
if(ext == ".MSB" || ext == ".msb")
{
//MSBDataFileを記録し、TargetFileとSwitchを読み込み、設定する
MSBDataFile = dd;
string InFile = File.ReadAllText(MSBDataFile, Encoding.GetEncoding("shift-jis"));
string[] tokens = Regex.Split(InFile, @"\r\n|="); //改行または'='をセパレーターとして分割する
if(tokens[0] == "TargetFile" && tokens[2] == "MSBSwitch") //出力形式が合う場合
{
//slnまたはprojファイル名を記録
tssl[1].Text = TargetFile = tokens[1];
tssl[1].ToolTipText = TargetFile; //ToolTip設定
//slnまたはprojファイル名を表示
txtBox.Text = File.ReadAllText(TargetFile, Encoding.GetEncoding("shift-jis"));
MSBSwitch = tokens[3];
}
}
else if(ext == ".CSPROJ" || ext == ".csproj" || ext == ".SLN" || ext == ".sln")
{
//slnまたはprojファイル名を記録
tssl[1].Text = TargetFile = dd;
tssl[1].ToolTipText = TargetFile; //ToolTip設定
//slnまたはprojファイル名を表示
txtBox.Text = File.ReadAllText(TargetFile, Encoding.GetEncoding("shift-jis"));
MSBSwitch = ""; //MSBSwitchを初期化する
MSBDataFile = ""; //MSBDataFileを初期化する
MessageBox.Show("現在のビルド情報は「保存」しなければ失われてしまいます。\r\n必ず「保存」してください。", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
MessageBox.Show("ファイルパスでない文字列です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
単純にコピペで追加したので「ファイルを開く」と同じ、または同様のコードが3つもできてしまいました。サイズを気にされたり、似たコードは纏めたい方はこれを一つのメソッドにして呼び出すように変更(注)してください。(わたしゃ面倒なので、これで結構ですわ。)
注:1ファイル版を用意して、起動時とドラッグアンドドロップはforeachでループさせるのが一番かと...