星期二, 10月 31, 2006

KB925488修正惱人的全型問題

FIX: The status of the Chinese IME may change to the full-shape mode when you move the focus to a control in a Windows application that uses the .NET Framework 2.0

原來使用.NET Framework 2.0的程式(Visusl studio 2005、SQL Server 2005管理工具、自己開發的winform),常常ime mode會亂切,最常見的是把你切成中文全型,要不然把你切成二個方框,現在只要更新kb925488即可以修正這樣子的問題!

比起之前微軟建議在自己winForm中call IMMConversionStatus API做切換來的好太多了,且是全面性的!更新後就不用在design mode切的要死了~yaya~

星期六, 10月 28, 2006

Virtual PC 2007 Beta

在八月份時,看到了vpc2007的消息,不過當時只知道會支援vista、x64與可能會用free的型式發佈。

而剛在又逛了一下微軟的網站,發現connect十月己經有測試版可以使用了,無奈熊目前回南投過周未,只有慢慢的撥接可以使用,無法立即下載.. :

https://connect.microsoft.com/site/sitehome.aspx?SiteID=288

星期三, 10月 25, 2006

陳寬達釋出 Delphi 深度歷險 與 C++Builder 深度歷險 的電子檔

書雖然是有些年代了,但他的地位不會隨著時間而消逝!! 有興趣的朋友可以到連結去下載!

回想接觸delphi時,是在delphi5的年代,當初為了找尋 Delphi 深度歷險與錢達智的 win32學習筆記,真是找破了頭! 現在作者大方的公開了電子檔,真是很佩服他的分享精神!

星期二, 10月 24, 2006

.NET學習筆記--I/O檔案處理(上)

.NET學習筆記--I/O檔案處理(上)



幾個重要的 NameSpace

System.IO

System.IO.Compression




主要的 Class

檔案系統相關(FileSystemInfo)

DriveInfo、DriveType

Directory、DirectoryInfo

File、FileInfo

FileSystemInfo、FileSystemWatcher

Path



串流相關

Stream、FileStream、MemoryStream、BufferedStream



讀寫相關

StringReader、StringWriter

TextReader、TextWriter

StreamReader、StreamWriter

BinaryReader、BinaryWriter



壓縮

DeflateStream、GZipStream




主要功能如下

FileSystemInfo:是 FileInfo與DirectoryInfo的基礎類別,提供檔案目錄共用的資訊

Attributes:唯讀、隱藏、保存等資訊

Extension:副檔名

LastWriteTime、LastAccessTime、CreationTime :相關時間

Refresh():重新讀取


DriverInfo:取得磁碟機的資訊

DriveType:列舉型態,磁碟機是何類型(網路、固定、CDROM..等等)

如下的例子取資系統中所有磁碟機的資訊(可用空間、所有空間、格式、磁碟名稱等資訊)

{
listBox1.Items.Clear();
//取得系統所有磁碟機
DriveInfo[] driveinfos = DriveInfo.GetDrives();
listBox1.Items.Add(string.Format("系統共有{0}部磁碟機", driveinfos.Length));
foreach (DriveInfo di in driveinfos)
{
try
{
listBox1.Items.Add(string.Format("{0} 磁碟資訊如下 ", di.Name));
listBox1.Items.Add(string.Format("型態為:{0} 格式為:{1} 磁碟名稱:{2}",di.DriveType, di.DriveFormat, di.VolumeLabel));
listBox1.Items.Add(string.Format("所有空間:{0},剩餘空間:{1}", di.TotalSize,
di.AvailableFreeSpace));
//AvailableFreeSpace與TotalFreeSpace 最大不同是前者考量了windows的配額!
listBox1.Items.Add(string.Format("根目錄共有{0}個目錄,{1}個檔案", di.RootDirectory.GetDirectories().Length, di.RootDirectory.GetFiles().Length));
}
catch (IOException ee)
{
listBox1.Items.Add(ee.Message);
}
listBox1.Items.Add("");
}
}

Directory:是一個 Helper類別,有多個Static method!
Exists:目錄是否存在
CreateDirectory:建立目錄
Delete(string 檔名, bool 包含目錄中所有):若目錄中有唯讀檔會失敗
Move:移動目錄
取得/設定時間等等

DirectoryInfo: 取得目錄的資訊
Parent:上一層的資訊
Root:根目錄的資訊
MoveTo:搬移目錄
Create:建立目錄
GetDirectories、GetFiles、GetFileSystemInfos ..

例子,用DirectoryInfo判斷目錄是否存在,不存在就建立他:
DirectoryInfo driveinfo = new DirectoryInfo(@"c:\huwk\bert");
if ( !driveinfo.Exists)
driveinfo.Create();

File:是一個Helper類別,有多個Static method!
Copy:複制
Encrypt:加密(只有當前帳戶能解密)
Decrypt:解密
Replace:取代
等等

FileInfo:檔案資訊
Length:檔案大小
IsReadOnly:是否唯讀
等等
Path:是一個Helper類別,有多個Static method!
Combine:組合路徑(第二個參數若包含絕對路徑,會直接回傳第二個)
GetTempPath:取得目前使用者的暫存路徑
GetRandomFileName:取得隨機檔名
GetTempFileName:取得一暫存檔名
ChangeExtension:變更副檔名
HasExtension:是否有副檔名
FileSystemWatcher:檔案系統監視,可以在檔案目錄被異動(新增、刪除、修改、更名)時,及時做出通知

void fw_Changed(object sender, FileSystemEventArgs e)
{
MessageBox.Show(e.FullPath+":被改變");
}

FileSystemWatcher fw = new FileSystemWatcher();
fw.Path = @"c:\"; //監看c槽
//包含子目錄
fw.IncludeSubdirectories = true;
//通知法則為檔案大小與最後寫入時間
fw.NotifyFilter = NotifyFilters.Size NotifyFilters.LastWrite;
//只監看文字檔
fw.Filter = "*.txt";
//掛上異動的事件
fw.Changed += new FileSystemEventHandler(fw_Changed);
//開始接收
fw.EnableRaisingEvents = true;

後記:

1.當裝置未就序時,會發生IOException,所以處理檔案系統最好加上處理

2.當對windows按右鍵點選新增檔案時,其實他是先建立一個"新增xx檔.xx",當你對他改名時,他又做了一次rename,若此時按取消,他會
做一次刪除的動作。

星期五, 10月 20, 2006

微軟技術論壇回答的文章整理


  • 問題:我的要求是:年份是闰年的判断
熊的回答:
闰年的判断
DateTime.IsLeapYear
  • 問題: 跪求:C#中CPU密集运算时如何获取控制权?
熊的回答:使用Application.DoEvents(); 即可!
  • 問題:Structure回收問題
查過資料後structure不是由記憶體回收行程管理,那如何回收?
不回收會不會造成記憶體不足?
自己要寫dispose?
是不是少用structure?
謝謝回答

熊的回答:
Structure算是value type的一種,所以不會有記憶體回收的問題!宣告一個value type他所佔用的空間是固定的,也就是不會因為你的資料量的增加而
佔用空間變多,也不會因為改變了儲存的值改變了容器的大小,而value type佔用的空間是在stack裡。


而記憶體回收主要是針對reference type,為什麼呢?因為他會有二段資料,指向器(存在stack中),而另一段是資料(存在heap中),例如你操作一個字串相加 例如 s + =
"123";
其實他做了如下的動作,將你原來s的資料搬出來後,與123做相加,然後放回了新的一堆記憶體中(heap),然後把你的指向器指向了新的記憶體中間。此
時問題來了,原始記憶體空間並沒有指向器指到那個空間,所以記憶體回收主要是做這一塊。


而stack中的資料是何時被回收呢? 其實當你一個行程結速時,他就會空出空間了,例如你在一個function中定義了個value type,當結束此function時,他就放出了資源。

  • 問題:讀取字串有幾個相同的字
假設我今天有一個字串是"A,B,C,E,F,G,"
我要如何得知 我的字串裡面有幾個 ","
不知道是否有現成的函式可用呢?
還是該如何去解決呢? 希望可以給個指示的方向阿!! 謝謝

熊的回答
善用regex即可~
Imports
System.Text.RegularExpressions

Dim text1 As String = "A,B,C,E,F,G,"
Dim regex1 As New Regex("[,]")
MessageBox.Show(regex1.Matches(text1).Count.ToString)
  • 問題:如果取得目前營幕解析度?
熊的回答:
MSDN中
即有例子,run一下應可以知道!

Bound 指的是營幕設定的解析度~
Private
Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnGetScreenInfo.Click

Dim Index As Integer

Dim UpperBound As Integer

' Gets an array of all the screens connected to the system.

Dim Screens() As System.Windows.Forms.Screen = _

System.Windows.Forms.Screen.AllScreens

UpperBound = Screens.GetUpperBound(0)

For Index = 0 To UpperBound

' For each screen, add the screen properties to a list box.

ListBox1.Items.Add("Device Name: " + Screens(Index).DeviceName)

ListBox1.Items.Add("Bounds: " + Screens(Index).Bounds.ToString())

ListBox1.Items.Add("Type: " + Screens(Index).GetType().ToString())

ListBox1.Items.Add("Working Area: " +Screens(Index).WorkingArea.ToString())

ListBox1.Items.Add("Primary Screen: " +Screens(Index).Primary.ToString())

Next

End
Sub

  • 問題:程式片段
小弟觀摩他人的程式以下片段一直不得搞不懂 不知是否可以指點一二
其Function GetDataSplit 是啥作用呢

If tmp.GetLength(0) > index Then Return tmp(index)又有何目的
略...
熊的回答:
1.Dim tmp As String() = data.Split(Sep),這段是在將字串用step拆解
2.If tmp.GetLength(0) > index Then Return tmp(index)
,判
段你要取回的index是否合理

例如你下 GetDataSplit("abc", "0") 會得到因為在1步時tmp(0) 為a
1為b 2為c
第2步判別陣列大小3比你要取的index值來得大(表示合理值,取用不會出錯), 回傳a
  • 問題:win form內崁 WebBrowser的問題?
請問各位大大
我在win form裡面內崁 WebBrowserControl(與Form同大小),
但我把win form的FormBorderStyle設為None
因此無法移動視窗
雖然有些書說明只要在MouseMove和MouseDown上撰寫相關程式即可解決
但是由於我內嵌WebBrowserControl所以沒有MouseMove和MouseDown事件
請問該如何解決呢?
感謝^^

熊的回答

使用 HtmlElementEventHandler!

private void Document_MouseDown(object sender, HtmlElementEventArgs e)
{

}

private void Document_MouseMove(object sender, HtmlElementEventArgs e)

{
}
private void Document_MouseUp(object sender, HtmlElementEventArgs e)

{
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.MouseDown += new
HtmlElementEventHandler(Document_MouseDown);

webBrowser1.Document.MouseMove += new
HtmlElementEventHandler(Document_MouseMove);

webBrowser1.Document.MouseUp += new
HtmlElementEventHandler(Document_MouseUp);
}

  • 問題: 請教一下Calendar用法

你好,我是一個剛接觸visual studio的初學者.現在我剛好遇到一個問題,就是Calendar的用法不太清楚.
問題如下:
我要設計的是它不可以點選當天以前的時間.如今天是2006年8月11日,那我想設定的是只可以點選8月11日當天或以後的時間.
希望各位前輩可以指導一下用法.
我是不想讓使用者切換到別的月份,只有是過去的月份都不能點.

熊的回答:
Sorry沒注意到你是asp.net版,下面的範例為 只能選取8/1日後的日期.之前也會顯示.但無法選取應符合您的需求~

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
DateTime dt = new DateTime(2006, 08, 1);
if (e.Day.Date >= dt)
{
e.Day.IsSelectable = true;
}
else
{
e.Day.IsSelectable = false;
}
}

  • 問題:關於tabcontrol上的標籤問題

請問一下tabcontrol上的tab能夠在選到他的時候更改它的字型顏色或者是在字的下方加底線,因為想要讓user能更明顯的知道使用的是哪一個tab

熊的回答
1.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed
2.掛上事件自己畫,想怎麼晝就怎麼畫
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
TabControl tctmp = (TabControl)sender;

Graphics g = e.Graphics;
Pen p = new Pen(Color.Blue);
Font font;
SolidBrush brush;

if (tctmp.SelectedIndex == e.Index)
{
brush = new SolidBrush(Color.Red);
font = new Font("Arial", 8.0f, FontStyle.Underline);
}
else
{
brush = new SolidBrush(Color.Black);
font = new Font("Arial", 8.0f);
}
g.DrawRectangle(p, tctmp.GetTabRect(e.Index));
g.DrawString(tctmp.TabPages[e.Index].Text, font, brush,
(RectangleF)tctmp.GetTabRect(e.Index));
}

  • 問題:CreateSpecificCulture()與New CultureInfo()的差異
請教各位大大:(.Net Framework 2.0)
CultureInfo.CreateSpecificCulture("??-??")與
CurrentCulture = New CultureInfo("??-??")有何差別呢?
例如使用CultureInfo.CreateSpecificCulture("ja")便沒有 exception發生,
但CurrentCulture = New CultureInfo("ja")就發生exception!

熊的回答
基本上二者是相同的..就算是靜態函式CreateSpecificCulture內部也是叫用CultureInfo的建構子~
不同的事情在,當CreateSpecificCulture在呼叫CultureInfo建構子時,若有發生錯訊他會幫你做必要的處理當他發現你的參數是無法建立起來時,他會幫你check是否有此參數開頭相同的名稱若有就幫你建立,所以他也不是無止盡的不出錯,例如你可以試試看

CultureInfo ci = CultureInfo.CreateSpecificCulture("JA-"); //ok不出錯
CultureInfo ci = CultureInfo.CreateSpecificCulture("JA-aaa"); //ok不出錯
CultureInfo ci = CultureInfo.CreateSpecificCulture("J-aaa"); //出錯
所以CreateSpecificCulture只是會幫你額外做檢查而以
對於文化資訊,你可以參考文化資訊的格式說明,與自訂文化資訊,應會有更深的認識~

  • 問題:將記事本檔案的編碼從ANSI 轉成 Unicode
我現在有 100個 純文字檔 每個檔案 約有 10000筆資料
我知道 我的文字檔的編碼方式都是使用 ANSI 但是現在我想要改成Unicode
不知道有沒有什麼比較好的方式 可以轉換呢?
呵呵 總不可能把文字檔打開 另存新檔 選擇 Unicode 的編碼方式
我是使用Visual Basic 2005 來開發的
作業系統 Windows Server 2003
謝謝

熊的回答:
您好給你二段程式參考
我vb比較不熟,您再自己組合一下
Imports System.IO
Imports System.Text
1.
取得特定目錄下所有副檔名為txt的方式

Dim info1 As New DirectoryInfo("c:\")

Dim info2 As FileInfo

For Each info2 In info1.GetFiles("*.TXT")

MessageBox.Show(info2.Extension)

Next
2.將字碼做轉換.由ansi轉為unicode!
Dim reader1 As New StreamReader("C:\TEST-ANSI.txt", Encoding.Default)

Dim writer1 As New StreamWriter("c:\TEST.TXT", True, Encoding.Unicode)
writer1.Write(reader1.ReadToEnd)

writer1.Flush()

writer1.Close()

reader1.Close()

  • 問題:Crystal Report無法處理直式字型?
請問一下,我使用vs2005內的Crystal Report製作報表,因為要列印標籤的關係所以將欄位字型選成直式字型(@細明體),但在CrystalReport viewer中及列印結果均無法顯示成直式字型,奇怪的是如果把它匯出成PDF,就可以正常顯示出直式字型,之前使用vs2003的crystal report不會有此問題,請問這應該如何解決?謝謝.

熊的回答:
我發覺幾件事情
1.在properties windows中點選的字型會選不到@的字型
2.在properties windows無法改變font.gdiverticlfont 與gdicharset!
但若你對text object按右鍵選format object則字型可以選到"@xxx"
而若使用format object的方式去設定.我打印的結果是正常的(使用@細明體)。
  • 問題:如何得知一個控制項目中是否有某一個屬性值
要如何得知一個控制項目中是
否有某一個屬性值,的指令?

因為我想判斷,如何這個控制項有這個屬性的話會去執行某斷指令?
熊的回答
使用PropertyInfo!
imports System.Reflection
Dim info1 As PropertyInfo = xxxx.GetType.GetProperty("Hint")
If (Not info1 Is Nothing) Then
表示有

  • 問題:如何自動編號??
各位高手:我是使用SQL
2000 ,我有二個資料表,我使用SELECT
方式,JOIN出我要的資料,但是如我想要在這些資料中增加一個欄位做自動流水編號,應該要如何下指令?

熊的回答
使用rowid,若你是sql2005那可以使用row_number()!
IF EXISTS
(SELECT * FROM TEMPTABLE)

DROP
Table TEMPTABLE

GO

select
ROWID=IDENTITY(int,1,1), *

INTO
TEMPTABLE

from
YourTable

go

select * from TEMPTABLE;
go
  • 問題:請教如何攔截BindingSource.MoveNext VB2005
BindingNavigator1.BindingSource= BindSource1
當我們按下BindingNavigator1的MoveNextItem
它會自動呼叫BindSource1的MoveNext
並且會針對目前這筆資料作EndEdit動作
我希望能在EndEdit之前先做資料判斷
如果資料錯誤則不要做EndEdit以及MoveNext的動作
請問應該要怎麼做
謝謝

熊的回答:
原生的bindingsource無法做到!
你可以試著使用 datatable.RowChanging
AddHandler Me.dataSet1.TABLENAME.RowChanging, New
DataRowChangeEventHandler(AddressOf Me.TABLENAME_RowChanging)


Private Sub TABLENAME_RowChanging(ByVal sender As Object, ByVal e As
DataRowChangeEventArgs)

do something!

End
Sub

  • 問題:關於SQL時間函數
各位前輩大大
請問在sql server中有 類似 my sql 中的UNIX_TIMESTAMP(date)及FROM_UNIXTIME(unix_timestamp) 的函數用法嗎??
或者 要如何達到這個功能? 煩請各位前輩不吝指導~

熊的回答
你是要計算二個日期間距離的天數、時、分等資料吧? 試試看 datediff吧!
DATEDIFF( datepart , startdate , enddate )
selectDATEDIFF(minute, Convert(DateTime, '2006/01/01'), Convert(DateTime,
'2006/01/02'))

  • 問題:功能表的快速鍵?
請教各位大大一個笨問題
我看書上寫說如果要設定功能表上的快速鍵
只要設定ShortcutKeys的值就好
可是我怎麼設了之後都沒反應呢?
麻煩幫我解惑一下~~感謝^^

熊的回答
若你是要設定最外層的hotkey.你可以試試如下的方式~
ToolStripMenuItem.Text= "熊(&A)"; 在&後的第一個英文字母即MENU的HOTKEY! 按ALT+A即是!
若你是要設定ShortcutKeys,那要設在第一層之下(你可以看看現在IE與OFFICE的操作方式),而按壓的功能即會馬上被觸發才是!
  • 問題:讓程式不會繼續往下執行
熊的回答
使用void的型式,其實都是省略return,所以直拉在你想離開整個處理函式時,下return;(無回傳值)即可!
  • 問題:IErrorInfo.GetDescription 因為 E_FAIL(0x80004005) 而失敗
不好意思我想請問一下
我的ACCESS是2003 但是我現在有個資料庫檔是97的版本
那我用2003可以將資料庫打開但是我用vs.c#2003
去連資料表的時候會發生下面的錯誤
IErrorInfo.GetDescription因為 E_FAIL(0x80004005) 而失敗。
我想請問一下這事什麼原因
謝謝
熊的回答
http://www.dbforums.com/showthread.php?p=4550116
當你的資料表有sql的保留字時,就會發生此問題~不管是tabname或是fieldname~