┏第11号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜メニュー ■ピンポイントリンク ・C#のコードをVB.NETへ変換する(及びその逆) ・.NETの命名規則2 - "m_"復活(?!)の巻 ■.NET Tips ・DataGrid内の特定のセルの色を変える 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ─────────────────────────────── ■ピンポイントリンク ─────────────────────────────── ●C#のコードをVB.NETへ変換する(及びその逆) C#からVB.NETへのコード変換(及びその逆)のために役立ちそうなツー ルを探してみました。まずはC#からVB.NETへの変換から。 多分一番有名なツールは「Convert C# to VB .NET」でしょう。 ・Convert C# to VB .NET http://www.kamalpatel.net/ConvertCSharp2VB.aspx このページのテキストボックスにC#のコードを入力し、ボタンをクリ ックすると、VB.NETのコードに変換されます。簡単なコードであれば 大体うまく行くようですが、usingステートメントなどのように、うま く変換されないケースも多いです。 さらに残念なことに、日本語を含むコードを変換しようとすると、エ ラーになることがあります。 同ページから「Convert C# TO VB .NET OFFLINE」という実行ファイル 形式のツールや、WebServiceを使用する時のサンプルもあります。 「Convert C# TO VB .NET OFFLINE」はソースが付いているため、改造 も出来ます。日本語を正しく表示できるようにするためには、多少の 修正が必要になります。 (Form1のtxtCSharpとtxtVBのFontを日本語フォントに変更し、 FileToStrメソッド内の StreamReader oReader = System.IO.File.OpenText(cFileName); を StreamReader oReader = new StreamReader(cFileName, System.Text.Encoding.GetEncoding(932)); と変更すれば、大丈夫そうです。) またこれとは別に「C# to VB.NET Translator」というのがあります。 ・C# to VB.NET Translator http://www.aspalliance.com/aldotnet/examples/translate.aspx 先に紹介した「Convert C# to VB .NET」とは別のエンジンであり、さ らに「Convert C# to VB .NET」よりこちらのほうが勝っているという ようなことが書かれています。実際にそうであるかは分かりませんが、 「Convert C# to VB .NET」でエラーが出る日本語を含むコードも、こ ちらではエラーが出ずに成功します。 逆に、VB.NETからC#へコードを変換するツールは今のところ私の知る 限り「Convert Visual Basic .NET to C#」しかありません。 ・Convert Visual Basic .NET to C# http://www.ellkay.com/ConvertVB2CSharp.htm しかし残念なことに、現在はC#へ変換されたコードは画像データとし て表示されるため、コピーして使うことが出来ません。また、「 Convert C# to VB .NET」と同様に、日本語を含むコードの変換でエラー が出ることがあります。 最後にVB.NETからC#へコードを変換する奥の手を紹介しましょう。そ れは、MSILのDisassembler(逆アセンブラ)を使う方法です。 Disassemblerは.NET Framework SDKにも「MSIL Disassembler」 (Ildasm.exe)というのが付いておりそこそこ使えますが、C#のコード を得ることが目的であれば、「Anakrino」がお勧めです。 ・Anakrino Download http://www.saurik.com/net/exemplar/ 使い方としては、VB.NETで書いたコードをビルドし、できたファイル (exeやdll)をAnakrinoで開くだけです。同梱されているExemplar. exeを使うと、いっぺんにC#のコードへ変換されますので、さらに便利 です。ただし残念なことに、日本語が表示されません(Exemplar.exe は途中で終わってしまう)。 この方法であれば、VB.NETからだけでなく、他の言語からでもC#へコー ドの変更が出来るといえなくもないでしょう。 ─────────────────────────────── ●.NETの命名規則2 - "m_"復活(?!)の巻 「.NETプログラミング研究 第3号」で「.NETの命名規則」について説 明しました。その中でヘルプ内の不可解な説明に関していろいろ書か せていただきました。Visual Studio .NETもバージョンアップしたと いうことで、ヘルプも修正されたかと思い調べてみたところ、ちょっ と面白いことになっていたのでここで紹介します。 私が「.NETプログラミング研究 第3号」で具体的に指摘したヘルプに おける不可解な点は3箇所ありました。 まず、ヘルプの「静的フィールドの名前付けのガイドライン」で「静 的フィールド名には、ハンガリー表記法を使用したプリフィックスを 付けます。」と書かれている点について、間違いではないかと指摘し ました。新しいヘルプを見てみるとどうやらそうであったらしく、「静 的フィールド名には、ハンガリー表記法を使用したプリフィックスは 付けません。」と全く逆に修正されています。 以前紹介した 「VB.NET コーディング標準」 http://objectclub.esm.co.jp/eXtremeProgramming/CodingStdVB.pdf 「C#コーディング標準」 http://www.kawabata.com/dotnet/CodingStdCS.pdf では、しつこい位に「ハンガリアン表記法を使用しない」と書かれて いるのですが、なぜか共有変数の名前のつけ方に関してはそう書かれ ていません。どうもこのヘルプの間違いに惑わされたのではないかと 思われますが、このようなヘルプの間違いはこのような間接的な影響 も大きく、本当に困りものです。 ・静的フィールドの名前付けのガイドライン http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/cpconstaticfieldnamingguidelines.asp 2つ目の疑問点は、「フィールドの使用方法のガイドライン」において 次のような実行不可能なコードが例として載っていることでした。(フ ィールド名handleとプロパティ名Handleが同じため、VBでは不可とな ります。) [Visual Basic] Public Class Control Inherits Component Private handle As Integer Protected ReadOnly Property Handle() As Integer Get Return handle End Get End Property End Class このコードについては、残念ながら新しいヘルプでも修正されていま せんでした。 ・フィールドの使用方法のガイドライン http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/cpconfieldusageguidelines.asp 最後に指摘した不可解な点は、「プロパティの使用方法のガイドライ ン」に上と同じく次のような実行不可能なコードが例として載ってい ることでした。 [Visual Basic] Public Class TextBox Private dataSource As String Private dataField As String Private active As Boolean Public Property DataSource() As String Get Return dataSource End Get Set '(省略) End Set End Property Public Property DataField() As String Get Return dataField End Get Set '(省略) End Set End Property '(省略) End Class これは新しいヘルプで修正されていたのですが、面白いことに次のよ うに"m_"プリフィックスを付けるという、旧VBでは推奨されながら、 .NETでは否定された、古き良き(?)方法が復活していました。 Public Class TextBox Private m_dataSource As String Private m_dataField As String Private m_active As Boolean Public Property DataSource() As String Get Return m_dataSource End Get Set '(省略) End If End Set End Property Public Property DataField() As String Get Return m_dataField End Get Set '(省略) End If End Set End Property '(省略) End Class しかしこれが正しい方法として認定されたとも判断出来ないようです。 まず、「フィールドの使用方法のガイドライン」では、「フィールド 名または静的フィールド名にプリフィックスは適用しません。」と明 記されており、これに反しています。 さらに、C#のサンプルコードでは今まで通り、フィールド名とプロパ ティ名を先頭の文字が小文字と大文字かで区別していることを考える と、.NETの命名法に統一感がないことが分かります。 このような点からして、以前私の指摘した「プライベートなフィール ドにアクセスするためのプロパティにはどのような名前をつけるべき なのか?」という問題はいまだに解決していないというのが実際のと ころのようで、これからもプログラマーを悩ませ続けることでしょう。 ・プロパティの使用方法のガイドライン http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/cpconpropertyusageguidelines.asp ─────────────────────────────── ■ピンポイントリンク ─────────────────────────────── ●DataGrid内の特定のセルの色を変える 前回まではDataGridコントロール(System.Windows.Forms)での列スタ イルの使い方について説明しましたが、今回はさらに発展させ、 DataGridColumnStyleの派生クラスを使うことにより、より複雑な処理 を行う方法を紹介します。 DataGrid内の特定のセルの色を変えるには、DataGridColumnStyle. PaintメソッドをオーバーライドしたDataGridColumnStyleの派生クラ スを作成し、これを使うようにします。 まずは次のような派生クラスを作成し、Paintメソッド内でどのような セルにどのような色をつけるか指定します。この例では DataGridTextBoxColumnから派生したMyDataGridTextBoxColumnクラス を作成し、値が"0"のセルを前景色が白、背景色が黒で表示するように しています。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'DataGridTextBoxColumnを継承してクラスを作成 Public Class MyDataGridTextBoxColumn Inherits DataGridTextBoxColumn 'Paintメソッドをオーバーライドする Protected Overloads Overrides Sub Paint( _ ByVal g As Graphics, _ ByVal bounds As Rectangle, _ ByVal source As CurrencyManager, _ ByVal rowNum As Integer, _ ByVal backBrush As Brush, _ ByVal foreBrush As Brush, _ ByVal alignToRight As Boolean _ ) 'セルの値を取得する Dim cellValue As Object = _ Me.GetColumnValueAtRow(source, rowNum) If Not cellValue Is Nothing Then '値が"0"のセルの前景色と背景色を変える If CType(cellValue, String) = "0" Then foreBrush = New SolidBrush(Color.White) backBrush = New SolidBrush(Color.Black) End If End If '基本クラスのPaintメソッドを呼び出す MyBase.Paint(g, bounds, source, rowNum, _ backBrush, foreBrush, alignToRight) End Sub End Class '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //DataGridTextBoxColumnを継承してクラスを作成 public class MyDataGridTextBoxColumn : DataGridTextBoxColumn { //Paintメソッドをオーバーライドする protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight) { //セルの値を取得する object cellValue = this.GetColumnValueAtRow(source, rowNum); if (cellValue != null) { //値が"0"のセルの前景色と背景色を変える if ((string) cellValue == "0") { foreBrush = new SolidBrush(Color.White); backBrush = new SolidBrush(Color.Black); } } //基本クラスのPaintメソッドを呼び出す base.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight); } } //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 次にセルの色を変えたい列にこの列スタイルを使うようにします。(列 スタイルの説明は省かれています。)この例では、データソースが "Column1"という名前のDataColumnがある"DataTable1"という名前の DataTableであることを前提にしています。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ '新しいDataGridTableStyleの作成 Dim ts As New DataGridTableStyle() 'マップ名を指定する ts.MappingName = "DataTable1" '列スタイルにMyDataGridTextBoxColumnを使う Dim cs As MyDataGridTextBoxColumn cs = New MyDataGridTextBoxColumn() 'マップ名を指定する cs.MappingName = "Column1" 'DataGridTableStyleに追加する ts.GridColumnStyles.Add(cs) 'テーブルスタイルをDataGridに追加する DataGrid1.TableStyles.Add(ts) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //新しいDataGridTableStyleの作成 DataGridTableStyle ts = new DataGridTableStyle(); //マップ名を指定する ts.MappingName = "DataTable1"; //列スタイルにMyDataGridTextBoxColumnを使う MyDataGridTextBoxColumn cs; cs = new MyDataGridTextBoxColumn(); //マップ名を指定する cs.MappingName = "Column3"; //DataGridTableStyleに追加する ts.GridColumnStyles.Add(cs); //テーブルスタイルをDataGridに追加する DataGrid1.TableStyles.Add(ts); //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ・DataGrid内の特定のセルの色を変える http://dobon.net/vb/dotnet/datagrid/coloredcell.html =============================== ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  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. ===============================