2009年10月30日 星期五

aspnet 動態加入使用者控制項

要完成這個工作,有幾種選項。

(1.1)先在要使用「使用者控制項」的頁面,切換至「設計」模式。
(1.2)拖拉「使用者控制項.ascx」到頁面上,會產生@ Register指示詞,就可以把「使用者控制項」殺掉。
(1.3)在Page_Load的地方,先用
Control t1 = Page.LoadControl("MyUserControl.ascx");
取得實體,再用
t1.GetType().GetProperty("myAtt1").SetValue(t1, "value1", null);
設定屬性。

或者

(2.1)在要使用「使用者控制項」的頁面加入
<%@ Reference Control="MyUserControl.ascx" %>
(2.2)在Page_Load的地方,先用
MyUserControl t1 = (MyUserControl)LoadControl("MyUserControl.ascx");
取得實體,再設定屬性。
或者
Control t1 = this.Page.LoadControl("MyUserControl.ascx");
取得實體,再用
t1.GetType().GetProperty("myAtt1").SetValue(t1, "value1", null);
設定屬性。

(3.1)使用以下的一定失敗,我不知為何會失敗:
MyUserControlt1 = new MyUserControl();
t1.myAtt1= "value1";

註:t1.myAtt1 是會設定到 MyUserControl 裡面的 TextBox1.Text 的值。錯誤發生是因為設定時,TextBox1還是個null。我不知道為什麼當時TextBox1還是個null。

2009年8月19日 星期三

python + gtk + glade 緣起

最近決定把自己寫的程式,儘量用 python 或 c# 來做。
這樣可以減少學習太多語言把自己搞混的情況。
其實我以前也只有用 VB 及 Java。

在 python 部份,快速開發真的是很方便,跳過了型別檢查,沒有了大括號、end 來包佔腦細胞,真的可以很專心在邏輯上面。
而且,沒有型別宣告,函數回傳值也可以有多個,且直接可以裝成 list。只要在函數內部改好回傳值的增減,在函數外面就直接取用,真是太方便了。
我在開發的時候這個優勢真的省去規劃函數定義的時間。

說了這些只是要為接下來的做引子。在 python 的 solution 裡,
GUI 的部份是 tcl/tk,說實在的,tcl/tk 本身要找範例及書就不是很多,
要使用 python 與 tcl/tk 的範例及書就更少了。為了多平台執行,我選了gtk + glade。實在是為了要偷懶去學 GUI 的那些語法,glade 可以用拖拉的方式建立 GUI 及程式架構,建好之後就是把程式邏輯放進去。
手工把 GUI 建立起來的工作我真的很少做,都是 VB 太好用的關係。

glade 是 gtk+ 的 RAD tool,它的主要網站是 http://glade.gnome.org/
它的 tutorials 在 http://live.gnome.org/Glade/Tutorials
欣賞它的地方就是有 python 的範例。
目前我還在 basic 裡面打轉 http://tadeboro.blogspot.com/2009/04/gtkdialog-tutorial-part-1.html
不知道是其他語言不太需要 gtk+ 還是有其他原因,除了 python 的選擇就是 C。
這裡抱怨一下,我的腦容量也許太小,c/c++ 的一大堆宣告,還有 build 的問題我到現在還是搞不出一個我開心的 solution。都是 VB 搞得太無腦的關係。

好,接下來,就是建立一個 GUI 來玩玩吧。

2009年6月16日 星期二

Python 與 Windows ShortCut

在Windows下,有機會要處理ShortCut,也就是捷徑。
試了幾天,有幾種做法:

(1)利用windows 內建 vb script 執行引擎。先建立一個 .vbs 檔
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set Shortcut1 = WSHShell.CreateShortcut(shortcut_name & ".lnk")
Shortcut1.TargetPath = WScript.Arguments.Item(0)
Shortcut1.WorkingDirectory = WScript.Arguments.Item(1)
Shortcut1.Arguments = WScript.Arguments.Item(2)
Shortcut1.Save
再利用 python 的 os.system 來執行這個 vbs。
執行的時候可以帶參數,例:
os.system('createShortCut.vbs 1 2 3')
在 vbs 裡取得參數的方法為 WScript.Arguments.Item(0)

(2)安裝 win32com,按照文件 win32com.shell and Windows Shell Links 來做。
from win32com.shell import shell
import pythoncom
shortcut = pythoncom.CoCreateInstance( shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink )
# load short cut
shortcut.QueryInterface( pythoncom.IID_IPersistFile ).Load( filename )
# save short cut
shortcut.QueryInterface( pythoncom.IID_IPersistFile ).Save( filename, 0 )
但是,要怎麼去改捷徑內容呢?我沒研究出來。據說可以去研究http://msdn.microsoft.com/isapi/msdnlib.idc?theURL=/library/sdkdoc/shellcc/shell/ifaces/ishelllink/ishelllink.htm

(3)利用 win32com 取得 WScript.Shell 的 python 物件。這很酷喔,只要兩行
import win32com.client
shell = win32com.client.Dispatch('WScript.Shell')
好了,接下來,shell 要怎麼用,去看 windows 的 vb script 怎麼用就行了,文件非常好查,也就是說,照第(1)個方法去寫就行了。
shortcut = shell.CreateShortCut('test.lnk') 
shortcut.Targetpath = 'C:\\test.exe'
shortcut.WorkingDirectory = 'C:\\'
shortcut.Arguments = '1'
shortcut.save()

(4)使用 winshell 來處理,前人將 shell 包好成一個物件來使用
http://timgolden.me.uk/python/winshell.html
import os, sys
import winshell

winshell.CreateShortcut (
Path=os.path.join (winshell.desktop (), "shortcut.lnk"),
Target=r"c:\Program Files\Mozilla Firefox\firefox.exe",
Arguments="http://localhost",
Description="Open http://localhost with Firefox"
)

由這個例子,體會一下,python 當膠水的能力。
把別的語言的工具,拿來自己用的能力。我最佩服第(3)種寫法。
感謝前人很辛苦的寫了 win32com ,否則才沒這麼簡單哩。

2009年6月5日 星期五

被 C# 搞死了 編譯器錯誤 CS0165

http://msdn.microsoft.com/zh-tw/library/4y7h161d.aspx
C# 編譯器不允許使用未初始化的變數。

我猜想這個是為了讓寫程式的人永遠記得,變數一定要初始化。
這原意很好。
但是有時候,會依據條件,使用不同的 constructor。以下的寫法就會出問題。
=============
TcpClient tcp;
if (ip ==""){
  tcp = new TcpClient();
}
else{
  tcp = new TcpClient(ip, port);
}
Console.WriteLine(tcp.connected);
=============
因為放進條件式,編譯器就以為沒有初始化了,於是就發生這樣子的問題。這樣真的太小氣了。我真的不能這樣寫嗎?
我也不曉得該怎麼辦,只好用個最笨的方法,一開始設成 null,讓編譯器不出問題。
TcpClient tcp = null;
既然如此,何不一開始,編譯器永遠都是開頭設成 null 就好了?
為什麼不的原因我實在想不出來。