┏創刊号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜メニュー ■ご挨拶 ■.NET Tips ・ファイルを関連付けられたソフトで開いて終了まで待機する ■VBユーザーのためのC# ・VBのSplit関数と同じことをするには? ■.NET質問箱 ・表示中の画像ファイルが削除できません! ■ピンポイントリンク ・APIビューアを.NETで使いたい 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ─────────────────────────────── ■ご挨拶 ─────────────────────────────── はじめまして。「.NETプログラミング研究」発行人の「どぼん!」で す。よろしくお願いいたします。 この「.NETプログラミング研究」ではMicrosoft .NET Frameworkに関 するプログラミング情報(主にVisual Basic .NETとC#)を紹介するこ とを目的とします。私一人で作成しているメールマガジンのため、た いしたことはできないかもしれませんが、末永くご購読いただければ 幸いです。 次にそれぞれの項目について簡単にその趣旨を説明させていただきま す。 ●.NET Tips Microsoft .NET Frameworkのプログラミングに関するTipsを紹介しま す。 ●VBユーザーのためのC# VBユーザーがC#を使う際に役立つテクニックなどを紹介します。 ●.NET質問箱 私が管理人をしているサイト「どぼん!のVB道」( http://dobon.net/vb)の掲示板に寄せられた質問とその答えを紹介し ます。 ●ピンポイントリンク インターネットでは.NETプログラミングに役立つすばらしいTipsやサ ンプル、ツールなどがたくさん紹介されています。ここでは「○○す るにはどうすればいいのか?」といった個々の問題についての解決に 役立つページを紹介させていただきます。 ─────────────────────────────── ■.NET Tips ─────────────────────────────── ●ファイルを関連付けられたソフトで開いて終了まで待機する ファイルを関連付けられたソフトで開くには次のようにProcessクラス のStartメソッドを使用します。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ System.Diagnostics.Process.Start("C:\test.txt") '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ さらに終了まで待機するには次のようにProcessクラスのWaitForExit メソッドを使用します。このとき同期的に待機するため待機中はフリー ズしたようになります。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'ファイルを開いて終了まで待機する Dim objProcess As System.Diagnostics.Process = _ System.Diagnostics.Process.Start("C:\test.txt") objProcess.WaitForExit() 'ここを次のようにすると最大10秒間待機だけする 'objProcess.WaitForExit(10000) MsgBox("終了。") '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 次の例ではプロセスの終了まで非同期的に待機します。Button1をクリ ックしてメモ帳を起動し、メモ帳が終了するとOnExitedが呼び出され ます。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click 'ファイルを開いて終了まで待機する Dim objProcess As System.Diagnostics.Process = _ System.Diagnostics.Process.Start("notepad.exe") 'プロセスが終了したときに Exited イベントを発生させる objProcess.EnableRaisingEvents = True 'イベントハンドラの追加 AddHandler objProcess.Exited, AddressOf OnExited End Sub Private Sub OnExited(ByVal sender As Object, _ ByVal e As EventArgs) 'プロセスが終了したときに実行される MsgBox("終了しました。") End Sub '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ http://dobon.net/vb/dotnet/process/openfile.html ─────────────────────────────── ■VBユーザーのためのC# ─────────────────────────────── ●VBのSplit関数と同じことをするには? stringクラスのSplitメソッドは区切り文字としてChar型でしか指定で きないため、文字列で区切り文字を指定できるVBのSplit関数とは大き く異なります。ではVBのSplit関数のように区切り文字を文字列 (string型)で指定できるようにするにはどうすればよいのでしょうか? これにはMicrosoft.VisualBasic.StringsクラスのSplitメソッドを使 う方法とRegexクラス(System.Text.RegularExpression名前空間)の Splitメソッドを使う方法が考えられます。しかしRegexクラスの Splitメソッドはかなり処理速度が遅く、かといってMicrosoft. VisualBasic.Stringsクラスも使いたくない場合もあります。このよう な時は分割したい文字列内の区切り文字(列)をいったん適当な1文字 (分割したい文字列内の分割したくない位置に絶対現れることのない 文字)に置換した後、stringクラスのSplitメソッドにより分割した方 が速い場合も多いようです。 次のサンプルではRegex.Split、VisualBasic.Strings.Split、string. Splitそれぞれのメソッドを使ってstring型データを改行文字列("\r \n")で分割したときにかかった時間を計っています。この結果では VisualBasic.Strings.Splitが圧倒的に遅く、string.Splitは文字列を 適当に置換してから分割しているにもかかわらずRegex.Splitよりも倍 以上速く処理できました。 //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //いろいろな方法でstring型データを改行文字列("\r\n")で分割し //その時間を計る //テキストファイルをstrTextに読み込む string strFileName = "REDIST.TXT"; System.IO.FileStream fs = new System.IO.FileStream(strFileName, System.IO.FileMode.Open); System.IO.StreamReader sr = new System.IO.StreamReader(fs, System.Text.Encoding.GetEncoding(932)); string strText = sr.ReadToEnd(); sr.Close(); int t1, t2, t3; string [] s1, s2, s3; //Regex.Splitで分割する t1 = System.Environment.TickCount; s1 = System.Text.RegularExpressions.Regex.Split(strText, "\r\n"); t1 = System.Environment.TickCount - t1; //VisualBasic.Strings.Splitで分割する t2 = System.Environment.TickCount; s2 = Microsoft.VisualBasic.Strings.Split(strText, "\r\n", -1, Microsoft.VisualBasic.CompareMethod.Binary); t2 = System.Environment.TickCount - t2; //string.Splitで分割する t3 = System.Environment.TickCount; s3 = strText.Replace("\r\n", "\n").Split('\n');; t3 = System.Environment.TickCount - t3; //結果を表示 Console.WriteLine("Regex.Split: {0}", t1); Console.WriteLine("VisualBasic.Strings.Split: {0}", t2); Console.WriteLine("string.Split: {0}", t3); Console.WriteLine("Lines Count: {0}", s3.Length); //結果の例 //Regex.Split: 521 //VisualBasic.Strings.Split: 1452 //string.Split: 181 //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ http://dobon.net/vb/csharp/vb2cs1.html#split ─────────────────────────────── ■.NET質問箱 ─────────────────────────────── Q:表示中の画像ファイルが削除できません! A:「画像ファイルを表示」で紹介したFromFileメッソドを使用して 画像を表示した時や、PictureBox コントロールのImageプロパティを デザイン時に手動でファイルに設定した時は、その画像ファイルがロ ックされてしまい、削除する事が出来なくなります(「画像ファイル を表示」の例では"C:\Blue hills.jpg"が削除できません)。この問題 の回避するには「マイクロソフト サポート技術情報 - 309482」にあ る通り、FileStreamオブジェクトを使用して画像を表示します。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ Dim fs As System.IO.FileStream fs = New System.IO.FileStream("C:\Blue hills.jpg", _ IO.FileMode.Open, IO.FileAccess.Read) PictureBox1.Image = System.Drawing.Image.FromStream(fs) fs.Close() '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ・画像ファイルを表示 http://dobon.net/vb/dotnet/graphics.html#drawimage ・マイクロソフト サポート技術情報 - 309482 http://support.microsoft.com/default.aspx?scid=kb;JA;309482 http://dobon.net/vb/dotnet/graphics.html#drawpicture2 ─────────────────────────────── ■ピンポイントリンク ─────────────────────────────── ●APIビューアを.NETで使いたい VB6には"APIビューア"(VB 6 API Declaration Loader)というツールが ついていました。この"APIビューア"というものはVBでWin32 APIを簡 単に使えるようにするためのツールで、APIの定義が書かれたファイル を読み込むことにより、APIの検索とVBで使用する際の記述内容のコピー ができるというものです。 この"APIビューア"ですが、.NETではなくなってしまいました。.NETで はWin32 APIを使う必要はないと考えたのか、その辺の事情は分かりま せんが、.NETになっても相変わらずWin32 APIの必要性がなくなったと は到底思えず、さらに使用する際の宣言のめんどくささも変わってい ません。 そこでVB.NET、C#用のAPIビューアがないものかと思い探したところ、 "Pramod K. Singh"さん作の"API Viewer"というツールを見つけました。 この"API Viewer"はVB6の"APIビューア"で使われていた"WIN32API. TXT"を読み込むことにより使用します。VB.NETだけでなく、C#にも対 応しており、大変便利です。 以下にWriteFile関数について取得した内容を"APIビューア"を使った とき、およびこの"API Viewer"を使ったとき(VB.NET、C#)それぞれ 載せておきますので、どのような違いがあるかご確認ください(改行 されていますが、実際には一行です)。 ・APIビューア Public Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long ・VB.NET Public Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal hFile As Integer, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Integer, lpNumberOfBytesWritten As Integer, ByRef lpOverlapped As OVERLAPPED) As Integer ・C# [DllImport("kernel32.dll")] public static extern int WriteFile(int hFile,int lpBuffer, int nNumberOfbyte sToWrite,int lpNumberOfbyte sWritten, [MarshalAs(UnmanagedType.Struct)] ref OVERLAPPED lpOverlapped); ・C# Corner - API Viewer http://www.c-sharpcorner.com/Tools/APIViewerPKS.asp =============================== ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  http://dobon.net  dobon@bigfoot.com ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/bbs ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 DOBON! All rights reserved. ===============================