最終更新日 2024-09-25

ドラッグ&ドラッグとフォーム

概要

hmV8の例の1つとなります。

ドラッグアンドドロップ

フォームへのドラッグ&ドロップに対応する例となります。

#JS = loaddll( hidemarudir + @"\hmV8.dll" );

#_ = dllfuncw(#JS, "DoString", R"JS(

let LibForms = host.lib("System.Windows.Forms");
let LibDrawing = host.lib("System.Drawing");

class DragAndDropForm {
    constructor() {
        this.form = new LibForms.System.Windows.Forms.Form();
        let lb = new LibForms.System.Windows.Forms.ListBox();
        lb.AllowDrop = true;
        lb.FormattingEnabled = true;
        lb.ItemHeight = 12;
        lb.Location = new LibDrawing.System.Drawing.Point(12, 19);
        lb.Size = new LibDrawing.System.Drawing.Size(413, 208);
        lb.TabIndex = 0;

        // thisの問題を回避するためには、以下のように一度アロー関数を挟んでおくとよい。
        lb.DragEnter.connect( (sender, e) => this.DragEnter(sender, e) ); 
        lb.DragDrop.connect( (sender, e) => this.DragDrop(sender, e) );

        this.listBox = lb;
        this.form.AllowDrop = true;
        this.form.ClientSize = new LibDrawing.System.Drawing.Size(440, 250);
        this.form.Controls.Add(this.listBox);
        this.form.Text = "Drag and Drop Form";
    }

    // リストにドラッグ&ドロップで入ってきた
    DragEnter(sender, e) {
        // ファイルドロップなら、可能な効果を全て表示
        if (e.Data.GetDataPresent(LibForms.System.Windows.Forms.DataFormats.FileDrop)) {
            e.Effect = LibForms.System.Windows.Forms.DragDropEffects.All;
        // それ以外は消す
        } else {
            e.Effect = LibForms.System.Windows.Forms.DragDropEffects.None;
        }
    }

    // 実際にドロップした
    DragDrop(sender, e) {
        // データ取り出し
        let data = e.Data.GetData(LibForms.System.Windows.Forms.DataFormats.FileDrop, false);
        // let count = data.Count();

        // リストに加える
        for ( let d of data ) {
            this.listBox.Items.Add(d);
        }
    }

    ShowDialog() {
        this.form.ShowDialog();
    }
}

let dNd = new DragAndDropForm();
dNd.ShowDialog();

)JS"
);

// 解放
freedll(#JS);