Visual Studio Community 2013始めました。

Visual Studio Community 2013が出ましたね。Expressでは使えなかった拡張が使えるようになりました。これのためにProの購入を考えては踏み止まって、ということを繰り返していたところなのでやっと来たかという感じ。

真っ先に入れたのがVsVim。お仕事ではPHPStorm + ideavimなので、この環境に慣れ切った指で素のVSでC#を書くのはちょっと腰が重かったのです。

Ctrl+n、Ctrl+pを上下に割り当てて、インテリセンスの選択もカーソルを使わないようにしているのですが、Ctrlを押しているとインテリセンスが半透明になってしまうのが邪魔になっていて回避策を模索中。この機能が付いた当時はとても嬉しかったんですけどね。

あとはPython Tools for Visual Studio。まだしっかりとは試せていないのですが、ClipboardExtenderの拡張スクリプト(IronPython)を書くのが捗りそうです。

MSさん超GJです。

IronPythonでインターフェースのイベントを実装する

Pythonにはイベントを定義する構文がないから困った。

そんなときはadd_イベント名(self, handler)、remove_イベント名(self, handler) を実装する。

例えば、INotifyPropertyChangedインターフェースのPropertyChangedイベントだとこう。

class NotifyObject(INotifyPropertyChanged):
	def add_PropertyChanged(self, handler):
		if not hasattr(self, "_propertyChangedHandlers"):
			self._propertyChangedHandlers = [handler]
		else:
			self._propertyChangedHandlers.append(handler)

	def remove_PropertyChanged(self, handler):
		if not hasattr(self, "_propertyChangedHandlers"):
			self._propertyChangedHandlers = []
		else:
			try:
				self._propertyChangedHandlers.remove(handler)
			except ValueError:
				pass

	def RaisePropertyChanged(self, propertyName):
		if not hasattr(self, "_propertyChangedHandlers"):
			self._propertyChangedHandlers = []
		else:
			for handler in self._propertyChangedHandlers:
				handler(self, PropertyChangedEventArgs(propertyName))

 

こんな感じでイベントハンドラの管理も自分でやる。

IronPythonでメソッドをオーバーライドして基底クラスに投げる。

IronPythonに限ったことじゃないけど、IronPythonでWinforms触ってたら避けられない問題なので。組込み関数のsuperを使う。

import clr
clr.AddReference("system.windows.forms")
from System.Windows.Forms import *
class HogeForm(Form):
	WM_LBUTTONDBLCLK = 0x0203
	count = 0

	def WndProc(self, m):
		if m.Msg == self.WM_LBUTTONDBLCLK:
			self.Text = self.count.ToString()
			self.count += 1
		super(HogeForm, self).WndProc(m)

if __name__ == "__main__":
	Application.Run(HogeForm())

 

Form.WndProc(self, m)

でも動くけど推奨されていないみたい。