SimpleComposite_Forms.py

  • Windows Forms アプリケーションとして、IronPython で実現した事例を紹介します。

# -*- coding: utf-8 -*-
#===============================================================================
# Copyright (C) 2000-2008, 小泉ひよ子とタマゴ倶楽部
#
# History: Design Pattern
# 2008/01/25, IronPython 1.1.1 (download)
# 2008/08/22, IronPython 1.1.2 (download)
# 2008/01/15, ver.1.0, Windows Forms
# 2008/10/01, ver.2.1, IronPython 1.1.2
#===============================================================================
import clr
clr.AddReference("System")
from System import *
clr.AddReference("System.Drawing")
from System.Drawing import *
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import *

Employee.cs

class Employee:
def __init__(self, nm, salry):
self.subordinates = [] # ArrayList
self.name = nm
self.salary = salry

  • ArrayList に代えて、list を利用しています。

    def getSalary(self):
return self.salary
def getName(self):
return self.name
def add(self, nm, salary=None):
if salary: # add(string nm, float salary)
emp = Employee(nm, salary)
else: # add(Employee emp)
emp = nm
self.subordinates.append(emp)

  • メソッド add(string,float)/add(Employee) を統合しています。

    def getSubordinates(self):
return self.subordinates # IEnumerator

  • IEnumerator に代えて、list を利用しています。

    def getSalaries(self):
return reduce(
lambda sum, esub: sum + esub.getSalaries(),
self.subordinates,
self.getSalary())

  • 組み込み関数 reduce() を利用しています。

Form1.cs

class SimpleComposite_Form(Form):
def init(self):
self.rand = Random()
self.buildEmployeeList()
self.buildTree()
def buildEmployeeList(self):
self.prez = Employee("CEO", 200000)
marketVP = Employee("Marketing VP", 100000)
self.prez.add(marketVP)
salesMgr = Employee("Sales Mgr", 50000)
advMgr = Employee("Advt Mgr", 50000)
marketVP.add(salesMgr)
marketVP.add(advMgr)
prodVP = Employee("Production VP", 100000)
self.prez.add(prodVP)
advMgr.add("Secy", 20000)
for i in range(5):
salesMgr.add("Sales" + `i+1`, self.rand_sal(30000))
prodMgr = Employee("Prod Mgr", 40000)
shipMgr = Employee("Ship Mgr", 35000)
prodVP.add(prodMgr)
prodVP.add(shipMgr)
for i in range(3):
shipMgr.add("Ship" + str(i+1), self.rand_sal(25000))
for i in range(4):
prodMgr.add("Manuf" + str(i+1), self.rand_sal(20000))
def buildTree(self):
nod = EmpNode(aemp=self.prez)
self.EmpTree.Nodes.Add(nod)
self.addNodes(nod, self.prez)
def getNodeSum(self, node):
emp = node.getEmployee()
sum = emp.getSalaries()
self.lbSalary.Text = str(sum)
def addNodes(self, nod, emp):
for newEmp in emp.getSubordinates(): # IEnumerator
newNode = EmpNode(aemp=newEmp)
nod.Nodes.Add(newNode)
self.addNodes(newNode, newEmp)

  • IEnumerator に代えて、for 文を利用しています。

    def rand_sal(self, sal):
rnum = self.rand.Next()
rnum = float(rnum) / Int32.MaxValue
return int(rnum * sal / 5 + sal)
def __init__(self, **args):
self.InitializeComponent()
self.init()
def InitializeComponent(self):
self.lbSalary = self._lbSalary()
self.EmpTree = self._EmpTree()
self._Controls()
def _lbSalary(self):
return Label(
Font = Font(
"Microsoft Sans Serif",
9.75,
FontStyle.Bold,
GraphicsUnit.Point,
0),
Location = Point(64, 208),
Name = "lbSalary",
Size = Size(152, 24),
)

  • System.Windows.Forms.Label を利用しています。


def _EmpTree(self):
e = TreeView(
Location = Point(32, 24),
Name = "EmpTree",
Size = Size(224, 168),
)
e.AfterSelect += self.EmpTree_AfterSelect
return e

  • System.Windows.Forms.TreeView を利用しています。




def _Controls(self):
self.ClientSize = Size(292, 273)
for e in self.lbSalary, self.EmpTree:
self.Controls.Add(e)


def EmpTree_AfterSelect(self, sender, e):
self._eventLog("EmpTree_AfterSelect", sender, e) # (@.@) keep a log
node = self.EmpTree.SelectedNode
self.getNodeSum(node)

def _eventLog(self, s, sender, e):
print ">>> %s"%s
for e in sender, e:
print "... %s"%e