發表文章

StatusStrip裏的text元件無法更新

一般在C#中要更新某個TextBox或Label,只要將它的Text屬性設定成新的值就可以即時在畫面上看到最新的資料。 但今天使用到了一個StatusStrip裏的ToolStripStatusLabel元件,想要即時更新它的內容值時,同樣是指定了它的Text屬性,但並沒有即時更新。 查了一下網路上的解法,好多人都是說要用 this.Refresh(); 是可以這樣啦,只是這樣是叫整個Form本身去更新,更新的範圍會不會太大了。如果呼叫的頻率太高的話,我想效能上應該會有所影響。 後來想說去找一下ToolStripStatusLabel元件本身是否有Refresh()函式可以呼叫。結果是沒有。難怪大家都沒辦法,只好對整個Form來下手。 順手看了一下,那StatusStrip本身有沒有Refresh()呢,沒想到還真的有耶,那就叫StatusStrip去更新就好啦,不用叫到整個Form去更新。 問題就解決囉。

沒有預設建構子無法對List<>進行xml序列化

圖片
突然需要寫個xml的設定檔,於是就簡單寫了一個類別TestXml,其中含有一個List<TestA>的成員。TestA也是個簡單的類別,只有兩個屬性及一個帶有參數的建構子。 針對Xml的序列化也是簡單地使用XmlSerialize類別來處理,程式碼如下。但是一執行就出現了Exception。 Exception的內容是這樣寫的,它說無法序列化List<>中的型別。 一開始以為是TestA類別上要加上[Serializable],結果加了也沒用。後來又加了XmlArray、XmlArrayItem等等的,還是沒用。 最後就放棄List<>,先針對單一的類別TestA來進行Xml序列化,才知道原來是TestA這個類別沒有預設建構子(就是不帶任何參數的建構子)。找了半天,原來是這個問題。一切只能說List<TestA>無法序列化時的錯誤訊息也太不直覺了吧。

IntelliSense: PCH warning: header stop

圖片
下圖中的程式碼基本上語法都沒有錯,但在VS2010中卻出現了一項錯誤訊息:IntelliSense: PCH警告:標的停駐點不可以在巨集 ...。 查了一下MSDN剛好也有人反映這項問題,不過是英文的錯誤訊息( IntelliSense: PCH warning: header stop cannot be in a macro or #if block. An intellisense PCH file was not generated. ),難怪用中文都Google不到。 看來好像是在專案建立時如果選擇使用預先編譯的模式的話,在你新增的標頭檔還沒有任何程式碼引用到時,就會出現這個錯誤訊息。只要一旦你開始在任何一份程式碼中開始引用這份新的標頭檔後,就會開始自動地產生Intellisense的資訊,這項錯誤也會自動消失。

System.Data.OracleClient將過時

圖片
最近開始要試著使用.NET C#來存取Oracle資料庫。基本上所使用的物件跟MSSQL Server的差不多,只是由SqlConnection改為OracleConnection這類的。 只是一開始發現.NET中也有提供Oracle資料庫的Provider,所以就直接使用System.Data.OracleClient。程式碼編譯是沒有問題,但卻出現了警告,主要是說 這組函式庫即將會過時 。看MSDN網站是說在.NET 4.0中還會支援,但未來就不一定了,所以希望大家先改為使用第三方函式庫的方式來存取Oracle資料庫。 如果是要用第三方函式庫的話,當然最好的方式就是找原廠的函式庫囉。在Oracle的官網中可找到給Visual Studio 使用的Oracle函式庫開發工具: ODAC 11.2 Release 4 and Oracle Developer Tools for Visual Studio (11.2.0.3.0) 安裝成功後,在加入參考時應該可以找到Oracle.DataAccess這個函式庫。程式碼基本上都不用改,直接就可以編譯了。 Oracle資料庫的連線字串跟MS SQL的也有點不同: string connStr = @"Data Source=10.6.111.11;User Id=tx;Password=tx;";

用捷徑方式執行需帶入命令列參數的Windows Form程式

圖片
假設我們有個需要在執行時帶入一些命令列參數的Windows Form程式的話,以前我的做法就是會另外寫一個批次檔來呼叫這個Windows Form程式,並寫好所需的命令列參數。例如: <Test.bat> TITME Test Test.exe –debug 這種方式雖然可以正常地執行,但就是會再多一個命令列視窗出現,只有在那個它所執行的Windows Form程式被關閉時,這個執行批次檔而產生的命令列視窗才會一併被關閉。 於是我就想說是不是有其它方式可以達到同樣的目的,但又可以不用出現那個多餘的命令列視窗。 後來想到說在捷徑中好像可以指定命令列參數的樣子,或許用捷徑是可行的。於是就開始測試。 首先先在你要執行的程式上按右鍵,並選擇「建立捷徑」。此時檔案總管會幫你建一份捷徑出來。 在新建的捷徑上按右鍵,選「內容」來進行修改。在「目標」中加上你需要的命令列參數。 按下「套用」後,直接執行這個捷徑就可以達到我們一開始的目的了,在執行Windows Form程式時帶入所需的命令列參數。
上次找到 免費的UML 軟體BOUML,可是後來才發現,原來它不支援中文。 只好再找其它的軟體來試用看看了。 ArgoUML 這套也是免費的UML軟體,不過安裝後,還真的不太會使用。而且它好像只支援到UML 1.4的版本。 JUDE 這套是一開始Java人士愛用的一最UML軟體了。不過,後來就沒有再持續開發。但是它倒是改名稱了。改叫 Astah 。一樣也有免費版本( astah community )。只要上網註冊就可以下載及使用了。 這套是目前我試到最好用的一套了: 支援UML 2.0 支援中文 介面好看 免費^^

UML免費軟體--BOUML

圖片
最近開始整理一些程式碼,發現有些流程需要使用到UML中的順序圖來表示。於是就打開了Office 2007的Visio。畫了一下,發現如果有個函式呼叫要,要再呼叫自己這個物件的某個函式,而這個函式又要再呼叫到其它物件的函式時,這樣那個「啟動」的區塊很難去表示。 一開始我是直接再多拉一個「啟動」的區塊,並將它接到原來的那個「啟動」區塊上,只是偏一邊這樣。雖然是可以接得上,可是在要選擇呼叫的函式時,發現是無法選擇的。因為這個另外加上去的「啟動」區塊,並不知道它對應的類別是哪個。 查了一下網路,發現在UML 2.0以上的規格中,應該就是可以支援這樣的表示方式才對。但是我在Visio 2007中找不到可用的方式。 於是,只好在網路上搜尋一下免費的UML軟體。以前知道 StarUML 是套免費的UML軟體,原本想要用這套的,但是發現它最新的版本是2005年更新的。這…不是表示它不再被維護了嗎。所以又再找其它可用的軟體。 最後,發現有一套新的軟體: BOUML 。它目前還有在更新版本中。看來也是可以支援我需要的順序圖表示方式。只是它是英文版本的。不過,可以表示我需要的功能就好。