最終更新日 2024-09-25

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

概要

IronPythonの例の1つとなります。www.ironpython.infoにある例題と同じです。

ドラッグアンドドロップ

フォームに適当にドラッグ&ドロップし、最後に秀丸にリストを返すといった例にしてみましょう。

以下のファイルをdraganddrop.pyとして保存します。

# coding : cp932

import clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')

from System.Drawing import Point, Size
from System.Windows.Forms import Application, DragDropEffects, DataFormats, Form, ListBox

class DragAndDropForm(Form):
    def __init__(self):

        self._listBox1 = ListBox()
        self._listBox1.AllowDrop = True
        self._listBox1.FormattingEnabled = True
        self._listBox1.ItemHeight = 12
        self._listBox1.Location = Point(12, 19)
        self._listBox1.Size = Size(413, 208)
        self._listBox1.TabIndex = 0
        self._listBox1.DragEnter += self._drag_enter
        self._listBox1.DragDrop += self._drag_drop


        self.AllowDrop = True
        self.ClientSize = Size(440, 250)
        self.Controls.Add(self._listBox1)

        self.Text = 'Drag and Drop Form'


    def _drag_enter(self, sender, e):
        if e.Data.GetDataPresent(DataFormats.FileDrop):
            e.Effect = DragDropEffects.All
        else:
            e.Effect = DragDropEffects.None


    def _drag_drop(self, sender, e):
        data = e.Data.GetData(DataFormats.FileDrop, False)
        for s in data:
            print self._listBox1.Items.Add(s)

listcnt = 0
listref = []
dNd = DragAndDropForm()
try:
    dNd.ShowDialog()
    hm.debuginfo(dNd._listBox1.Items.Count)
    for i in dNd._listBox1.Items:
        listref.append(i)
        hm.debuginfo(i)
    listcnt = dNd._listBox1.Items.Count
except:
    dNd.Close()
finally:
    dNd.Close()

.macからの呼び出し

本来は、IronPython内で「hm.Macro.Var[...]で処理した方が楽ですが、
ここでは秀丸マクロからIronPythonの値を取得する形で記述してみましょう。
「リストの個数」を得て、Get***ItemOfListで取得していく、というモノです。

#PY = loaddll( hidemarudir + "\\hmPy.dll");

#_ = dllfuncw( #PY, "DoFile", currentmacrodirectory + "\\draganddrop.py");

#listcnt = dllfuncw( #PY, "GetNumVar", "listcnt" );

##i=0;
while(##i < #listcnt) {
    $$item = dllfuncstrw( #PY, "GetStrItemOfList", "listref", ##i );
    message($$item);
    ##i = ##i + 1;
}

freedll( #PY );