SimpleIterator_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/09/28, ver.2.1, IronPython 1.1.2 
#===============================================================================
import clr
clr.AddReference("System.Drawing")
from              System.Drawing import *
clr.AddReference("System.Windows.Forms")
from              System.Windows.Forms import *

KidData.cs

class KidData:      # IEnumerator
    def __init__(self, filename):
        self.kids = []       # ArrayList
        fl = csFile(filename)
        for line in fl.file().readlines():
            kd = Kid(line)
            self.kids.append(kd)
        else:
            fl.close()
        self.index = 0
  • ArrayList に代えて、list を利用しています。
    def next(self):    # MoveNext; Current
        current = self.index
        if current < len(self.kids):    # .Count          
            self.index += 1
            return self.kids[current]
        else:
            raise StopIteration
  • MoveNext/Current に代えて、next を定義しています。
  • Count に代えて、len を利用しています。
  • 参照できる要素がなくなると、StopIteration を生成しています。
    def __iter__(self):    # getIterator
        return self
  • getIterator に代えて、__iter__ を定義しています。

Form1.cs

class SimpleIterator_Forms(Form):
    def __init__(self, **args):
        self.InitializeComponent()
        self.init()
    def init(self):
        kids = KidData("50free.txt")
        for kd in kids:
            self.lsKids.Items.Add(kd.frname+" "+kd.lname)
    def InitializeComponent(self):
        self.lsKids = self._grdProd()
        self._Controls()
    def _grdProd(self):
        return ListBox(
            Location = Point(40, 32),
            Size = Size(208, 173),
            )
    def _Controls(self):
        self.ClientSize = Size(292, 273)
        e = self.lsKids
        self.Controls.Add(e)
        self.Text = "Simple Iterator Demo"