2008年9月24日水曜日

[他]VSで#region(折りたたまれた部分)も含んで検索する

VS.NET2003/VS2005・2008では、エディタ上の#region~#endregionを折りたたんで表示することができます。
自動生成や修正が少なく目に入れたくない部分を折りたたんでおくことにより、必要な部分のみに集中してコードを見ることができます。しかし、ソースを検索するときはヒットしてほしいのですが折りたたんでいると該当部分がヒットせずイラっとくる時があります。
そのため、折りたたまれたソースをあえて展開してから修正をする。という面倒なことをしていました。

私の場合、検索はインクリメンタル検索またはF3系の機能を使うため、ほとんど検索ダイアログを出しません。ところがある日、たまたま検索ダイアログを出して検索しようとすると、

  • 非表示のテキストを検索する(VS.NET2003)
  • 検索オプション→非表示のテキストを検索(VS2005,2008)

というオプションがあるではないですか!

・・・これまでの苦労は。。。なんだったんだろう。

2008年9月19日金曜日

[.NET]プロパティ変数の直接参照(DeepCopy的な処理)

強引なやり方としてはリフレクションがありますが、通常privateフィールドは、該当のクラスからしかアクセスできません。ということから、同一クラスでも別インスタンスからはアクセスできないと信じきっていました。しかし、コピーコンストラクタを書いていると、そんなことはないってことがわかりました。
たとえば、とあるフィールドを変更するとフラグが立つといった処理系ではこういったやり方もあるというのに今日気づきました。いやー頭が固くなってますねぇ。コード例はこんなかんじ

public class DataClass
{
    private bool udate = false;
    /// <summary>
    /// 更新フラグ
    /// </summary>
    public bool IsUpdate
    {
        get { return udate; }
    }

    private int intData = 0;
    /// <summary>
    /// 数値のプロパティ
    /// </summary>
    public int IntData
    {
        get { return intData; }
        set { intData = value; udate = true; }
    }

    private String strData = String.Empty;
    /// <summary>
    /// 文字列のプロパティ
    /// </summary>
    public String StrData
    {
        get { return strData; }
        set { strData = value; udate = true; }
    }

    /// <summary>
    /// コンストラクタ
    /// </summary>
    public DataClass()
    {
    }

    /// <summary>
    /// コピーコンストラクタ
    /// </summary>
    /// <param name="src">コピー元</param>
    public DataClass(DataClass src)
    {
        intData = src.intData;
        strData = src.strData;
        udate = src.udate;
    }
}

2008年9月13日土曜日

[.NET] システム情報の取得(SystemInformation)

.NETアプリケーションを組む際に、システム的な情報を取得したい場合があります。そういった情報を集めたクラスがSystemInformationです。たとえば以下のような情報が取得できます。
  • HorizontalScrollBarHeight 水平スクロールバーの既定の高さ
  • VerticalScrollBarWidth 垂直スクロール バーの既定の幅
  • MonitorCount モニタの数
  • MouseWheelPresent マウスホイールの有無
  • PowerStatus 電源ステータス
  • TerminalServerSession リモートデスクトップ接続かどうか(未確認)

ほかにもたくさんシステム情報が取得できます。
P/Invokeを使わなくてもここまで取得できるとは。。。

2008年9月11日木曜日

[他]いまさらVB5

とある見積もりをするために、VB5のソースを解析する必要がありました。
とりあえず、エディタ(秀丸)でソース見てたのですが、画面の雰囲気などよくわからず、「んーどうした物だろう」と考えていました。会社にVB5のライセンスはあると思いますが、ライセンス借りたりするのが異常にメンドクサイ。そこで、昔フリーで使えたVB5のエディションがあった事を思い出しました。

しかし検索してもダウンロードできるサイトにたどり着かない。で、直リンクでダウンロードできるURLを発見したので備忘録としてメモ。

Visual Basic 5.0 Control Creation Edition

しかし、いつリンク切れするかわかりませんので、その際はご容赦を。

2008年9月9日火曜日

[.NET]SqlParameter にIsNull?

先日、@itの掲示板を見ていると、Where句にSqlParameterを使用しているものの条件としてNullを指定したくて困っているとのスレがありました。私のわかる範囲では、パラメータを使用せず

 Where xxx is null;

という方式しか思いつきませんでしたが、その解決案として

 Where (xxx = @param OR (xxx IS NULL AND @param IS NULL));

というのが紹介されていました。
Orになっちゃうのでパフォーマンスが気になるところですが、すばらしい発想ですね。

2008年9月3日水曜日

[.NET]ファイル属性の取得

先日、とあるコードを見ていると、なぜかファイルを追加モードでオープンすることで、ファイルの存在チェックおよび、出力可能かを検査しているコードが書かれていました。
そしてファイルを実際に出力しているのは別のメソッドで実施。っていうかチェックすることでファイルのタイムスタンプ変わっちゃうし。。。

見ただけでイラっときてしまいましたので、Fileクラスのメソッドで置き換えました。コードはこんな感じ

if (!File.Exists(dlg.FileName))
{
    //ファイルがないときの処理
}else if ((File.GetAttributes(dlg.FileName) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
    //ファイルが読み取り専用のとき
}

2008年9月1日月曜日

[.NET]コントロールのフォーカス枠描画

ちょっと前に携わったプロジェクトでWindowsFormの仕事をしました。標準のコントロールではニーズに合わなかったため、なくなく独自のコントロールをいくつか作成しました。
描画は独自なのですが、フォーカス枠はボタンなどの通常のコントロールと同じ表示でよいということで、それらしく描画していたのですが、調べてみると、ControlPaintというクラスで簡単に書けることがわかりました。コードはこんな感じ。


Rectangle rect = new Rectangle(2, 2, Width - 4, Height - 4);
ControlPaint.DrawFocusRectangle(e.Graphics, rect);


ちなみにこの処理は、OnPaintの中で実施しています。