2008年5月8日 星期四

Visual Studio 2008的重構功能(1) – for C#

在程式寫完之後,重新審視程式可能會發現程式有很多地方需要最佳化。例如,類別中的公開變數需要封裝、變數名稱不合規範要修改、太多重複出現的程式可以提列為方法…等等。在你的程式碼需要做大手術時,工具有沒有提供重構(Refactor)功能就很重要了。重構功能在Visual Studio 2005的C#編輯器中首次出現,可惜的是Visual Basic編輯器的重構功能只有「重新命名」這一項(Visual Studio 2005及Visual Studio 2008皆是)。這篇文章將介紹重構(Refactor)功能。

什麼是重構?

重構(Reactor)是指在程式完成之後,在不變更外部行為的情況下修改程式碼內部的結構,以達到最佳化程式碼程序的目的。Visual Studio 2008的C#編輯器內含的重構功能包含以下項目:
  • 重新命名: 可以為變數、方法、命名空間、類別名稱…等多種類型的名稱重新命名,並且會將所有參考到這個名稱的程式一併修改,免除了修改名稱的後遺症。
  • 封裝欄位:熟知物件導向的朋友看到這四個字,應該就知道這是做什麼的了。它可以幫你將Public的欄位封裝成屬性及私有欄位。 擷取方法可以將選取的程式碼區段提出成為一個新的方法。
  • 擷取介面:可以從現有的類別或結構根據其成員產生一個新介面。
  • 重新排列:參數用來變更方法、索引子、Delegate的參數順序,同時會更新呼叫到此成員的程式參數順序。
  • 移除參數: 將方法、索引子、Delegate的參數移除。同時更新呼叫端的程式。
  • 將區域變數升級為參數: 名稱已經很清楚的表達用途了,可將方法、索引子、建構函式的區域變數升級為參數,並且更新其他呼叫端的程式。重新命名、重新排列參數、移除參數、將區域變數升級為參數等功能都會影響到其他呼叫端的程式,Visual Studio會進行多專案跨檔案的更新,同時為了預防自動更新所發生的錯誤,也提供了預覽變更的對話方塊以供確認。
詳全文...

2008年5月5日 星期一

Visual Basic 的表單列印功能

應用程式的資料若需要設計可輸出的報表,可以藉由Visual Studio開發工具所附的報表工具(Microsoft Report或Crystal Report)設計可輸出的報表。某些時候,使用者的需求是要將目前執行中的表單狀態輸出,而不是另外製作的報表格式。

對於Visual Basic的開發者來說,直接列印執行中的表單,並不是一件難事。Visual Studio 2008的Visual Basic語言Windows應用程式專案,可以在「工具箱」的「Visual Basic Power Packs」索引頁籤看到PrintForm控制項。控制項的名稱已經直接了當的介紹它的用途。

更多詳細內容, 請參考: http://www.delightpress.com.tw/article_c.aspx?article_id=36

Visual Basic 2008最佳實務講座內容勘誤-1

感謝讀者Jeffrey 回報書中錯誤, 以下是修正內容:
1.第6頁, 第12行
應為Visual Basic 2008, 而不是Visual Basic 2005
2.第56頁,練習中的Label1屬性應該要設定:
UseMnemonic=>False , ForeColor=>ButtonHighlight, 沒有FontColor屬性(筆誤).
3.第67頁, 第7題
答案應為B

2008年4月3日 星期四

2008年3月20日 星期四

.NET 可以算出農曆嗎?

答案, 還是Yes!!

.NET Framework (2.0以上)的類別庫中有一個TaiwanLunisolarCalendar 類別(參考: http://msdn2.microsoft.com/zh-tw/library/system.globalization.taiwanlunisolarcalendar.aspx)

這個類別的可看性就多囉!

它與一般的西曆及國曆是很不一樣的, 尤其可能有閏月. 要顯示完整的年月日, 至少要用到以下幾個方法:

  • GetSexagenaryYear
  • GetCelestialStem
  • GetTerrestrialBranch
  • GetMonth
  • GetLeapMonth
  • GetDayOfMonth

下列程式是完整的範例:

        Dim cal As New TaiwanLunisolarCalendar()
Dim now As Date = Date.Now.AddYears(-1)

Dim 天干 As String = "甲乙丙丁戊己庚辛壬癸"
Dim 地支 As String = "子丑寅卯辰巳午未申酉戌亥"

Dim lun60Year As Integer = cal.GetSexagenaryYear(now)
Dim 天干Year As Integer = cal.GetCelestialStem(lun60Year) - 1
Dim 地支Year As Integer = cal.GetTerrestrialBranch(lun60Year) - 1

Dim lunMonth As Integer = cal.GetMonth(now)
Dim leapMonth As Integer = cal.GetLeapMonth(cal.GetYear(now))

If leapMonth > 0 AndAlso lunMonth >= leapMonth Then
lunMonth -= 1
End If
Dim lunDay As Integer = cal.GetDayOfMonth(now)

MessageBox.Show(String.Format("農曆:{0}年{1}月{2}日", _
天干(天干Year) & 地支(地支Year), lunMonth, lunDay))

                TaiwanLunisolarCalendar cal =new TaiwanLunisolarCalendar()  ;
DateTime now = DateTime.Now.AddYears(-1) ;

String 天干= "0甲乙丙丁戊己庚辛壬癸" ;
String 地支= "0子丑寅卯辰巳午未申酉戌亥" ;

int lun60Year = cal.GetSexagenaryYear(now) ;
int 天干Year = cal.GetCelestialStem(lun60Year) ;
int 地支Year = cal.GetTerrestrialBranch(lun60Year) ;

int lunMonth = cal.GetMonth(now) ;
int leapMonth = cal.GetLeapMonth(cal.GetYear(now)) ;

if (leapMonth > 0 && lunMonth >= leapMonth )
{
lunMonth -= 1 ;
}
int lunDay = cal.GetDayOfMonth(now) ;

MessageBox.Show(String.Format("農曆:{0}年{1}月{2}日",
天干[天干Year].ToString() + 地支[地支Year].ToString(), lunMonth, lunDay));

以今天的日期(AddYears(-1))來執行, 得到的結果會是(去年的今天):
農曆:丁亥年2月2日

2008年3月19日 星期三

.NET 會算中華民國曆嗎?

答案是: Yes!!

.NET Framework (2.0以上)的類別庫中有一個 TaiwanCalendar (參考http://msdn2.microsoft.com/zh-tw/library/system.globalization.taiwancalendar.aspx)

不過, 台灣曆法與西曆只有差在紀元的計算, 例如, 西曆的2008年3月18日, 等於中華民國年的97年3月18日.

比較常用的會是它的GetYear方法, 如以下範例:

Dim cal As New TaiwanCalendar
Dim twYear As Integer = cal.GetYear(Date.Now)
MessageBox.Show("現在是中華民國:" & twYear & "年")
如果想直接讓應用程式使用中華民國曆法, 可以這樣寫:
Dim twCI As New CultureInfo("zh-TW")
twCI.DateTimeFormat.Calendar = New TaiwanCalendar()
Thread.CurrentThread.CurrentCulture = twCI
Console.WriteLine(Date.Now.ToLongDateString)

            CultureInfo twCI =new CultureInfo("zh-TW")  ;
twCI.DateTimeFormat.Calendar = new TaiwanCalendar() ;
Thread.CurrentThread.CurrentCulture = twCI ;
listBox1.Items.Add(DateTime.Now.ToLongDateString());

這樣將會印出如下格式的日期:
中華民國97年3月18日

2008年3月18日 星期二

書上架了!!

Visual Studio 2008 系列書終於上架囉!!

媽咪說只要讀完這些書我就是.net神童了!

小寶1

要從哪一本書開始呢?

 小寶2