2008年10月31日金曜日

[他]VS2005/2008のトレースポイント機能

今日、@itの記事を読んでいると、ブレークポイントならぬ、トレースポイントについて紹介されていました。機能的には、そのポイントを通過するとDebug.WriteLineのようにアウトプットに好きな文字列を出力することができます。で調べてみると、MSDNにも記事がありました。例により備忘録としてメモ。


トレースポイントを設定すると、●ではなく◆が表示されます。また、通常のブレイクポイントの設定を変更することにより、同様の機能を実現できるみたいですね。

コンパイルが不要なので、結構便利かもしれません。コード的には100%修正ミスが無いことが保障できますし。

しかし、残念ながら、ExpressEditionではサポートされていません・・・。

また、この機能はコンテキストメニューからのみ利用できるようで、ツールボタンやメニューからは利用できません。何でなんでしょう?

2008年10月28日火曜日

[.NET]WindowsFormでリサイズ時の最小値を制御する

ちょっと前にかかわったWindowsFormを使ったシステムの案件で、リサイズ時に特定のサイズより小さくできないようしてほしいとの依頼がありました。
でとりあえず、サイズ変更系のイベント(Resize,ReseBegin,ResizEnd)あたりで実現できるかなぁ。と思い、ソレらしく実装しようと考えました。
「どうせイベントの引数でキャンセルする」みたいなパターンだろうと思い、インプリメントしようとすると、それらしいプロパティが無いのです。

で調べてみると、FormにMinmumSizeというプロパティがあり、ここに値を設定するだけでした。最大値の場合はMaximumSizeというプロパティがあります。

いやー簡単に実現できたので、テストが楽にできて助かりました。

2008年10月25日土曜日

[.NET]アクティブなWindowにキー入力?

先日MSDNを斜め読みしていると、アクティブなWindowにキーストロークを送信するクラスとして、System.Windows.Forms.SendKeysというのが存在することを知りました。

用途としては、たとえばWindowsFormのテストの自動化っぽい事が可能ですね。また、何らかの都合でボタン押下相当の処理では問題場ある場合、本当にキー入力っぽく処理することも可能ですね。

Googleさんで検索してみると、VBスクリプトでも同様の機能が提供されているようですね。知りませんでした。

2008年10月22日水曜日

[.NET]カラーデータを保存する

先日、XMLに表示色(RGB)を保存するという処理を実装しました。
とりえあえず、Color.ToArgb()とColor.FromArgb()で実装したものの、人が見やすい形式であるXMLにふさわしくないなぁと思っていました。で、考えたのがHTMLの#RRGGBBの形式です。
アノ形式に簡単に落とせないかなぁと思って調べてみると、ColorTranslatorというクラスがあることがわかりました。

  • #RRGGBBからColorに変換 → ColorTranslator.FromHtml ()
  • Colorから#RRGGBBに変換 → ColorTranslator.ToHtml()

いやー便利なクラスがあるものですねぇ。

2008年10月20日月曜日

[.NET]ダブルクリックとクリックのイベントをインプリメントすると、ダブルクリック時にクリックが先に発生する

ちょっと長いタイトルですが、.NET WindowsFormアプリでマウスクリック系のイベントで困ったことが発生しました。というのは、ダブルクリックとクリックをインプリメントすると、ダブルクリック時にクリックも発生してしますのです。

処理の特性上、通常のクリック・ダブルクリックでは問題は発生しないのですが、 キーボードとの組み合わせで、


  • Ctrl+クリック:選択状態を排他的に変更

  • Ctrl+ダブルクリック:編集状態に遷移

という処理をします。この場合ダブルクリックの処理が「選択状態にを排他的に変更+編集状態に遷移」に*見えて*しまうのです。

とりあえず、クリックが排他的な処理であったため、ダブルクリックのときにクリック相当の処理を実行するようにしちゃいました。一瞬ちらつきますが、処理的にはそれらしく動作しているように*見えます*。

もうひとつの対応方法としては、


  1. クリック時にタイマー起動。タイムアウトの設定は、SystemInformation.DoubleClickTimeより取得

  2. ダブルクリックイベントが発生した場合、タイマーを停止する

  3. タイマーのイベントが発生したらクリックの処理をする


です。

しかし、コレを実装するとクリックの処理のパフォーマンスが悪く*見えて*しまいます。対処方法としてはどっちもどっち。しかし、仕組み上どうしようもないことに気がつきました。クリック時にダブルクリックかどうかは予測できませんからねぇ。

もっとよい方法はないものか考えてみたものの、よい解決案は見つかりませんでした。ということで、こんな設計するなよ!って事にしておこう。

2008年10月14日火曜日

[.NET]Excelの印刷ページ数の算出

先日COM Interopを使ったExcelを使う機会がありました。テンプレートから値をはめ込んだ後、印刷ページ数を算出し、目次を作るという処理を組んだのですが、どうもページ数が合わない。
で、いろいろ調べてみると非推奨ながらマクロを使った方法があるようなので紹介します。

//本当はコレで算出できるはずなんですが。。。
//    int hCount = getHPageBreaks(sheet) + 1;
//    int vCount = getVPageBreaks(sheet) + 1;
//
//    return hCount * vCount;


//代替の方法
    return Convert.ToInt32(sheet.Application.ExecuteExcel4Macro"Get.Document(50,\"" + sheet.Name + "\")" ));

2008年10月8日水曜日

[他]インテリセンスが英語に?

先日、C#.NET 2008 Express Edition SP1に入れ替えました。
簡単なサンプルを作っていると違和感が。。。そうなんです。インテリセンスの説明が英語になっているではないですか。なんだそりゃ。

ディベロッパー製品開発統括部 Blogによると、「また、Visual Studio の開発環境中に表示される Intellisense ですが、現在一部英語で表示される箇所があります」だそうです。っていうかほとんど英語のように感じました。

また、同じマシンにインストールしてあるC#.NET 2005 Express Editionを何気に開いてみると、なんとこっちのインテリセンスも英語になっちゃってます。2008に巻きこまれたようです。いつ直ることやら。。。

2008年10月7日火曜日

[他]ソケットのエラー コード

Socketで発生するエラーコードについてまとめられているURLが紹介されていました。備忘録としてメモ。
Windows ソケットのエラー コード、値、および意味

2008年10月5日日曜日

[他]定義に移動(G)(VS2005,2008)

先日@itの掲示板を見ていると、「ctrl + shift + F2 で戻れない」という話題がありました。

コレは、コンテキストメニューの「定義に移動(G)」など、ジャンプ系の機能を実行した後、呼び出し元に戻るという昨日をショートカットで呼び出すというものなのですが、私この「定義に移動(G)」を結構使います。そのため「ウホ、ソレ便利かも」と思って実際にやってみました。が、動作しませんでした。

で、キーボードの反応が悪かったのか?と思い、偶然F2を押してみると、なんと「リファクタリング」の「名前の変更(G)」が動くではないですか!!コレは、エクスプローラやExcelの選択したオブジェクトの名前(データ)変更と同じのなで、一発で記憶することができました。

私、結構メソッド名変更するタイプなので、いいショートカットを覚えられました。

該当のスレッドを追っていくとヒントがありますが、「ctrl + shift + F2 」はVB系のキーバインドらしく、VS標準はCTRL+[-]ということでした。ちなみに「定義に移動(G)」はF12です。この組み合わせも結構便利かも。

2008年10月1日水曜日

[他]SQLで最小値の一覧を取得する

先日@itを見ていると、「キー値が同一のとき、キー以外の値が最小のデータを効率よく取得するには」という話題が挙がりました。

で、私が思いつく方法といえば、サブクエリで最小値の一覧を取得しその値の一覧を連結するという方法です。コードはこんなかんじ(手打ち未検証)。

SELECT 
     key
    ,code
    ,value1
    ,value2 
FROM table1
WHERE
(key,codeIN (SELECT key ,MIN(codeFROM table1 GROUP BY key,code)


このほかにINNER JOINする方法を思いつきました。
しかし、このスレッドでは私が思いついた方法以外の方法が紹介されていました。おそらく私の思いついた方法はコストが高いと思います。集計関数を使わずにできるとは。。。いやー勉強になりますねぇ。