Powered By Blogger

23 May 2007

ตัวอย่างโปรแกรม IronPython ( .NET 2.0)

เป็นตัวอย่าง WinForm ด้วย Iron Python for .NET
ซึ่งโปรแกรม นี้ ต้องลง .NET 2.0 Runtime ก่อน
โปรแกรม Iron Python โหลด ได้จาก http://www.codeplex.com/IronPython ขนาดไม่ใหญ่นัก ไม่เกิน 5 MB
แต่ อาจต้อง ติดตั้ง .NET 2.0 Redistribut ที่อาจตัวใหญ่หน่อย
หรือ ถ้า ได้ติดตั้ง VS.NET 2005 Express แล้วก็ไม่ต้อง ติดตั้ง Redistribut อีก

ตัว Ironpython สามารถ integrate เข้ากับ VS.NET ได้ ตามคู่มือ แต่ยังไม่ได้ทดลองทำ
ในตัวอย่าง นี้ลองเขียนด้วย notepad
และ run โดย ใช้


c:\>ipy db.py


โดย db.py จะเป็นไฟล์ที่เก็บ โปรแกรมนี้
ใน package ของ iron python อาจจะไม่มีข้อมูล วิธีการเขียน python นัก
แต่อาจหาได้ โดย อ่าน Help ของ Python 2.5 ที่โหลดและ ติดตั้งจาก http://www.python.org/

ตัวโปรแกรม จะทำหน้าที่ สร้าง Form และ สร้าง Control ตาม Table ตาม
Odbc DataSoure , Database ที่ใช้ เป็น MSAccess และดึงข้อมูล Table เข้า
สร้างเป้น Field Label , TextBox, ComboBox สำหรับ LookupTable ที่หน้าจอ
และ มีการ ผูก Event Click เข้ากับ Function

โค้ด มีดังนี้




import clr
clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")
clr.AddReference("System.Data")

import System.Windows.Forms as WForm
import System.Drawing as    Draw
import System.Data as    Data
import System.Data.Odbc as    Odbc
import System.Console as Con

class Form1(WForm.Form):
def __init__(self):
Con.WriteLine("OK")
self.Text= "OK"
self._mLeft = 175
self._mTop = 10
#self.BackColor= Draw.Color.White
#self.addControls()
self.addCtrlDb()
@property
def mLeft(self):
return self._mLeft
@property
def mTop(self):
return self._mTop

# not use now
def addControls(self):
t = WForm.TextBox()
t.Text=  "dbApp"
self.Controls.Add( t )
self.Size=  Draw.Size(300 ,200)
def getCon(self):
str1 = "DSN=spt_import_cd";
self.dbg(str1)
cn = Odbc.OdbcConnection(str1)
cn.Open()
self.dbg(" ConnectOK")
return cn
def getDt(self,sql):
cn = self.getCon()
da = Odbc.OdbcDataAdapter(sql , cn)
dt = Data.DataTable()
da.Fill(dt )
return dt

def readToCombo(self ,combo ,sql , fldvalue , flddisplay):
dt  = self.getDt(sql)
for r in dt.Rows :
disp = r[flddisplay] + ''
combo.Items.Add ( disp )

def addCtrlDb(self):
cn = self.getCon()
sql = "select * from cd WHERE idcd = 0 "
da = Odbc.OdbcDataAdapter(sql ,cn )
dt = Data.DataTable()
row =da.Fill(dt )
cn.Close()

#self.AddLabel( "TableCD")
#self.NewLine()

lookupwi = 300
maxwi = 0
for col in dt.Columns:
self.dbg(col.ColumnName )
colname = col.ColumnName
self.AddLabel( colname)
if colname=="ProvID" :
sql2=  "Select * , ProvID & ':' & ProvName as ProvName2 from Province"
wi =self.AddLookupCombo(colname,sql2,"ProvID","ProvName2",lookupwi)
else:
if colname=="WhEnvID" :
sql2=  "Select * , WhEnvID & ':' & Title  as Title2 from WhEnvelope"
wi =self.AddLookupCombo(colname,sql2,"WhEnvID","Title2" ,lookupwi) 
else: 

wi = self.AddTextBox(colname )
if  wi > maxwi :
maxwi = wi
self.NewLine()
self.dbg("ListColAndCloseOK")
self.Height = self.mTop + 50
self.Width = self.mLeft + maxwi + 40
self.Text = "Table CD"

bt =  WForm.Button()
bt.Text = "Close"
bt.Left = self.mLeft
bt.Top = self.mTop
bt.Click += self.OnButtonClose
self.Controls.Add( bt )
self.Height += bt.Height

def AddLabel(self,name):
lb = WForm.Label()
lb.Name = "lb" + name
lb.Left =  20
lb.Top  = self.mTop
lb.Text = name
lb.AutoSize = True
self.Controls.Add(lb)
def AddTextBox(self,name):
t = WForm.TextBox()
t.Name = "tx" + name
t.Left =  self.mLeft
t.Top  = self.mTop
self.Controls.Add(t)
return t.Width
def AddLookupCombo(self,name,sqlsel,fldValue ,fldDisp,wi):
t = WForm.ComboBox()
t.Name = "cblookup" + name
t.Left =  self.mLeft
t.Top  = self.mTop
self.Controls.Add(t)
t.Width = wi
self.readToCombo(t ,sqlsel, fldValue ,fldDisp)
t.DropDownStyle = WForm.ComboBoxStyle.DropDownList

return t.Width
def NewLine (self ):
self._mTop += 23

def ListData(self,dsn):
str1 = "DSN=" + dsn;
self.dbg(str1)
cn = Odbc.OdbcConnection(str1)
cn.Open()
self.dbg(" ConnectOK")
cmd = cn.CreateCommand( )
cmd.CommandText = "SELECt * from cd "
rd = cmd.ExecuteReader()
while (rd.Read()):
self.dbg(str(rd["idcd"]) + ' ' + rd["Title"])
pass
cn.Close()
self.dbg(" CloseOK")
def dbg(self ,str1 ):
#WForm.MessageBox.Show(str1)
Con.WriteLine(str1)
#def OnButtonClose(*arg ):
def OnButtonClose(self ,ctrl, a ):
self.Close()

f = Form1()
WForm.Application.Run( f)











ปัญหา เท่าที่พบ คือ ไม่มี intellisense แต่ถ้าหากใช้กับ VS.NET และ มี Intellisense ได้
ก็น่าจะช่วยแก้ปัญหาได้
และ ปัญหาอีกอย่างที่พบ คือ Python หรือภาษาตระกูล นี้จะให้ความสำคัญกับ ย่อหน้ามากๆ
หาก มีการเปลี่ยนย่อหน้าหลายๆบรรทัดติดกัน การใช้ Editor notepad อาจไม่สะดวก
อาจใช้ editor ตัวอื่นๆ เช่น editplus แทน

และ พบว่า เราสามารถ compile code ของ iron python ให้เป็น .exe ได้
( แต่อาจต้อง ลง iron python ในเครื่อง ที่มี .exe นั้น ) โดย ทำตามขั้นตอนของ
การถามตอบ ดังนี้
http://lists.ironpython.com/pipermail/users-ironpython.com/2006-February/001825.html







In the IronPython distribution, Src/Scripts/Tests/compiler.py should
be enough to get started.

Here's a minimal example in IronPython:

# compiler.py
from IronPython.Hosting import PythonCompiler

from System.Collections.Generic import List
sources = List[str]()
sources.Add('hello.py')
outfile = 'hello.exe'

compiler = PythonCompiler(sources, outfile)
compiler.Compile()

Seo Sanghyeon





หวังว่า สำหรับใครที่ลองดู จะทำให้ งานง่ายขึ้น

รูปโปรแกรม หลังรันกับ database ตัวอย่าง ( ไม่ได้ให้มา ในนี้ )

1 comment:

Anonymous said...

This phrase is simply matchless :), it is pleasant to me))) acheter levitra The excellent and duly message.