2009/09/15

WinForm: 如何判斷表單是否開啟在 Visual Studio 的 Designer 中

最近工作上用到比較多微軟的開發工具,像是 Visual Studio, Reporting Servoces, ASP.NET 等。

我們採用了一套 UI Framework,可以在 ASP.NET 上,以 WinForm 的程式設計模式來開發 Web 表單。在表單開發上,可完全免除自行撰寫 Client 端 JavaScript 的需要。簡言之,這種開發模式具有 WinForm 的優點,相對的,開發 WinForm 時所需要面對的問題,這裡同樣要面對。

例如,在開發 WinForm 表單時,我們常會在元件的 Load 事件載入資料來源,進行資料綁定。在執行環境這樣的邏輯沒有問題,但在開發環境,以 Visual Studio 的 Designer 開啟元件時,就可能會遇到無法讀取設定檔、資料連結錯誤等等問題,而造成 Designer 無法順利開啟表單。

我查詢了一下,在 MSDN Windows Developer Center 上也有人詢問這個問題,其中有個開發者已經給了一個可用的 solution,但因為他的描述過於複雜,且要求改寫基底類別,所以我擷取了他的解法,加以簡化。

首先,我們撰寫一個 GuiUtil 類別,其中包括下列方法:

public static bool InDesignMode() 
{
    try 
    { 
        return System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv";
    }
    catch
    {
        return false;
    }
}

如此一來,我們就可以採用以下的程式碼,在 Client 端程式的 Load 事件中進行呼叫,而不會產生設計畫面出不來的狀況了。

if (!GuiUtil.InDesignMode())
{
        InitDataBinding();
}

-- 完 --

2009/07/07

有趣的 MIS 大大

剛剛 MIS 大大寄來一封停機公告,重點在那張圖:

各位辛苦的系統開發大大們,

這件事情已經拖了一個多月了,實在不一在拖下去了…

知道各位都相當的忙碌,不過一個多月的時間應該也足夠才對。

剛剛看過黃曆,7/18 是個好日子,我們會設定在 7/18 子時系統自動關機,之後就不再提供服務了!

如果各位還有資料沒有轉到新的測試主機 xx.xxx.xx.xxx 的,請利用這兩週趕快轉移。

感謝您的配合!!

yellow calendar.png

2009/07/04

Firefox 小技巧--將收藏庫開啟於分頁標籤中

Open Firefox Library in a Tab

不曉得有沒有人曾想過,把 Firefox 內的收藏庫 (Library, 管理書籤跟歷史的使用界面),開啟於分頁標籤中,而不是獨立視窗中。

如果你也曾想這麼做,那就這麼做吧 -- 在網址列中輸入以下 URL:

chrome://browser/content/places/places.xul

噹噹…

現在收藏庫便開啟於分頁標籤之中了:

Firefox Library in a Tab

Technorati : , , , ,

2009/06/05

JavaFX 與 TIOBE Programming Community Index

TIOBE Programming Community Index 是一個用來評量程式語言受歡迎程度的指標,其排名方式,在頁面上說明如下:

The index is updated once a month. The ratings are based on the number of skilled engineers world-wide, courses and third party vendors. The popular search engines Google, MSN, Yahoo!, Wikipedia and YouTube are used to calculate the ratings.

我大概每個月初都會略微的瞄一下,了解一下目前各主要程式語言的排名狀況。昨天在檢視的時候,發現了 Sun 推了一陣子的 JavaFX 語言,並沒有在排名裡面。可能原因是 JavaFX 並沒有在百大排名裡面,或者是 TIOBE 並沒注意到這個程式語言。而我發現網頁上有這一行字:

If you have the impression there is a programming language lacking, please notify us at tpci@tiobe.com.

也就是說,如果你發現 TIOBE 可能漏掉某個程式語言的排名,可以寫信告訴他們。因此,我想先確定一下,JavaFX 目前是否有資格擠進百大。我用了一個「比較法」來確認,也就是,如果某語言在 Top 100 或 Top 50,而 JavaFX 的熱門程式與該語言相當,那麼 JavaFX 也該在 Top 100 或 Top 50 左右。

這個用來做比較的語言,最好不要有一字多義的傾向。例如,Ruby、Python、Groovy、Alice 等就都不適合,因為他們不是一字多義,就是菜市場名字。後來我決定以 Erlang 來做比較,比較結果如下:

就查詢量來看,javafx 有超越 erlang 的趨勢。有了這個發現,我便動筆寫了信給 TIOBE 的成員,而沒想到昨天才寄的信,今早就收到回信。而 TIOBE 也把 JavaFX 納入排名,目前排名第 72。另一個值得小小高興一下的是,TIOBE 的回信者 Paul 在信中說道,為了感謝我的建議,他會在最近一期的排名中公提到我的名字。看看 6 月份的排名,哇,真的有提到我耶 ^_^!

2009/05/05

有趣的 Ruby 字串操作

irb(main):025:0> a= "abc def"
=> "abc def"
irb(main):026:0> a["def"] = "abc"
=> "abc"
irb(main):027:0> a
=> "abc abc"
irb(main):028:0> a["abc"] = "xyz"
=> "xyz"
irb(main):029:0> a
=> "xyz abc"
irb(main):030:0> a["abc"]
=> "abc"
irb(main):031:0> a["def"]
=> nil
irb(main):032:0>

date = "2009/12/12"
month, day, year = date.split('/')

Technorati : ,

2009/04/23

C # 裡面 ?? (雙問號)運算子的妙用

?? 運算子是在 2.0 版後新增的,至今我在別人的程式中還很少看到有在使用。
它的使用方式如下:

a = b ?? c;

上式的意思是,如果 b != null,那就把 b 的值指定給 a,否則就把 c 的值指定給 a。
照理講,?? 的功能完全可以由 ?: 運算子替代,如上式可以改寫如下:

a = b != null ? b : c;

不過,?? 對於簡化程式碼很有幫助,我相信許多 one liner 會很喜歡它,例如:

if (Session["WEB_TYPE"] == null)
{
Session.Add("WEB_TYPE", "");
}

可以改寫為:

Session["WEB_TYPE"] = Session["WEB_TYPE"] as string ?? "";

?? 的另一個特點是使用上可以串連,例如:

string a = null;
string b = null;
string c = "c";
string d = a ?? b ?? c;

這樣的意思,也就是由左到右,找到第一個非 null 值的變數,指定給 d。

於是,如果有一段程式如下 (抓取系統中的舊程式碼舉個例子):

if (Session["WEB_TYPE"] == null)
{
Session.Add("WEB_TYPE", "");
}

//接收 Web_type
if (!IsPostBack)
{
if (Request.QueryString["WEB_TYPE"] != null)
{
webtype = Request.QueryString["WEB_TYPE"].ToString();
Session["WEB_TYPE"] = webtype;
}
}

可以用 ?? 運算子改寫成以下版本:

Session["WEB_TYPE"] = Session["WEB_TYPE"] as string ?? Request.QueryString["WEB_TYPE"] ?? "";

這樣程式就精簡許多,也更好理解與維護了。

2009/04/22

在麥當勞看了一場戲

一個皮膚黝黑的男子,兩眼無神的呆坐在餐飲區的一角。
一個體格壯碩的男子帶著一個清瘦的女生走了進來,坐在黝
黑男子的身旁,對他交待了幾句,拍拍了那女生的肩,便走
開了。

那男的哭喪著臉,哀求的詢問著那女生,那女生正顏厲色的
反過來詰問那個男的… 那男的無言以對,熱淚涔涔而下,
這種狀況來回幾次,那男的奪門而出。

那個壯碩的男子回來,再度拍拍那女生的肩,安慰她幾句,
再度離去把那女生留在現場。

最後,另一個面容白晰的男生走了進來,拉著那女生的手,
摟了摟那女生的肩,聊了幾句。那女生嘆了口氣,如釋重負
般的站了起來,那男生也跟著站了起來,兩個人牽著手,漫
步離開現場。