2007年10月30日火曜日

[他]AnkhSVNのちょっとした裏技

プロジェクトによっては、log4netなど外部アセンブリの参照をすることがあります。
しかしこのファイルを管理しないと、開発者個々に適当バージョンを使ったりしがちで、ちょっと面倒です。そこで、SVNに登録しておけばよいのですが、登録しようとした場合、プロジェクトに登録すればSVN上で管理が可能ですが、編集するものでもないので、プロジェクトに追加するのもちょっと。と感じます。
そんなときに、以下のような手順で意識することなく管理することが出来ます。

  • TortoiseSVNで該当のファイルをSVNにコミットする(プロジェクトフォルダと同じレベルのフォルダにしておくと良いかも)
  • AnkhSVNの機能で、ソリューションをアップデートする

するとプロジェクトに入っていないファイルであるにもかかわらず、勝手にチェックアウトされます。
結果、アセンブリの参照関係がそのままほかの人たちにもコピーされます。

2007年10月29日月曜日

[.NET]コントロールやコンポーネントのデフォルト値

自分でカスタマイズしたコントロールやコンポーネントは、VS.NETのデザイナで利用することができます。ツールボックスに表示され、Formにドロップすることで利用することが可能で、その際、そのクラスのプロパティは、デザイナのプロパティとして表示・設定することが出来ます。

で、設定するとその値は、該当のFormのxxx.Designer.csなどに含まれるInitializeComponent()メソッドに設定されます。コードが自動生成されるイメージです。で、プロパティに[DefaultValue("")]のようなアトリビュートを付けると、その値は初期値となるため、設定したのが初期値の場合、プロパティ設定のコードが省略されます。

それの何がよいかというと、コントロールの初期値を変更するだけで、値を設定していないプロパティが一気に切り替わるところです。しかし設定できる値の条件があり、Cololr型などの場合、[DefaultValue(Cololr.Red)]のような書き方をすることが出来ません。
で調べてみると、DefaultValueには引数が2つ渡せるようで、[DefaultValue(typeof(Color),"Red")]のような書き方が出ることがわかりました。ちょっと感動です。

2007年10月27日土曜日

[他]Blogの使い方?

最近Blogをはじめたばかりのせいか、なかなかいい議題やネタが出てきません。
というか出てもBlog書くまでに忘れてしまうのです。
で、今日思いついたんですが、一気に公開まで持っていくのではなく、昼や夕方の休憩時間や通勤中にキーワードだけ入力しておく。で、時間がある夜や休日に執筆し、公開する。そんな使い方もありだなぁと思いました。

2007年10月25日木曜日

[他]SVN+VS.NET その3

AnkhSVNでのSVN操作機能ですが、ファイル名の変更する場合、SVNではリネームが可能なんですが、削除+新規ってことがわかりました。
とりあえず今日はそのままコミットしましたが、TortoiseSVN を使えばリネームが出来るので、今後はそれで。でもAnkhSVNのほで不整合が出ちゃうかも。。。

2007年10月24日水曜日

[.NET]自作コントロールのプロパティのシリアライズ(その2)

先日バイナリフォーマットでのプロパティ保存についてを記載しましたが、
バイナリフォーマットにするほどでもない場合、xxx.Designer.csにデザイナから直接値を設定する方法があります。というかむしろこちらのほうが簡単。

修正内容は、先日の「■とあるコンポーネントに集約されているクラス」から[Serializable]をはずすだけです。
VS.NET2005は、以下のようなコードを出力します。

・・・特に理由が無ければ[Serializable]は付けないほうがいいかも。。。

    //
    // dataGridValidator1
    //
    this.dataGridValidator1.DataGridView = null;
    requiredData1.Message = "こらー";
    requiredData1.Required = true;
    requiredData2.Message = "";
    requiredData2.Required = false;
    requiredData3.Message = "";
    requiredData3.Required = false;
    requiredData4.Message = "おいおい";
    requiredData4.Required = true;
    this.dataGridValidator1.Items = new DustCS004.RequiredData[] {
requiredData1,
requiredData2,
requiredData3,
requiredData4};

2007年10月23日火曜日

[.NET]自作コントロールのプロパティのシリアライズ(前提)

先日書きました、「[.NET]自作コントロールのプロパティのシリアライズ 」ですが、前提条件を何も書いていなかったので、簡単に記載します。

用途としては、DataGridView のように列単位で処理や属性を新たに追加したい場合を想定しています。
こういった場合、バイナリフォーマットでリソースに情報を保存したい場合、以下のように実装します。
  • クラスに[Serializable]アトリビュートの付与
  • バイナリフォーマットでシリアライズ可能
  • シリアライズオブジェクトから復元可能なコンストラクタの実装

以下、コード例です。


//-------------------------------------------------
//■とあるコンポーネント
//-------------------------------------------------
public class DataGridValidator : Component
{
    private RequiredData[] items = new RequiredData[0];
    public RequiredData[] Items
    {
        get { return items; }
        set { items = value; }
    }

    private DataGridView dataGridView = null;
    public DataGridView DataGridView
    {
        set { dataGridView = value; }
        get { return dataGridView; }
    }

    public DataGridValidator()
        : base()
    {
    }
}

//-------------------------------------------------
//■とあるコンポーネントに集約されているクラス
//-------------------------------------------------
[Serializable]
public class RequiredData : ISerializable
{
    private bool required = false;
    public bool Required
    {
        get { return required; }
        set { required = value; }
    }

    private string message = String.Empty;
    public string Message
    {
        get { return message; }
        set { message = value; }
    }

    public RequiredData()
    {
    }

    // シリアライズ用コンストラクタ
    public RequiredData(SerializationInfo infoStreamingContext context)
    {
        Required = info.GetBoolean("Required");
        Message = info.GetString("Message");
    }

    #region ISerializable メンバ

    void ISerializable.GetObjectData(SerializationInfo infoStreamingContext context)
    {
        info.AddValue("Required"Required);
        info.AddValue("Message"Message);
    }
    #endregion
}

2007年10月22日月曜日

[他]SVN+VS.NET その2

まだファイル共有でやっていますが、複数人でSVNの運用をはじめました。
やっているうちにちょっと使いづらい点が出てきたのでメモ。
  1. 表示が英語。(誰か日本語版のパッチつくてくれなかなぁ)
  2. file://の場合、漢字入りのディレクトがあるとエラーが発生する
  3. チェックアウトフォルダに漢字入りディレクトリを指定するとエラーが発生する
  4. ロック・アンロックの自動化が出来なさそう(やり方が不明なだけ?)
  5. ロック・アンロックのメニューが遠い

1,5は仕方がないとして、2,3は回避可能。しかし4に関しては。。。楽観的ロックと考えれば良いのですが、VSS慣れしている人には苦痛を感じるようです。たとえば編集を始めると勝手にロックをかけるみたいな機能があればいうことなしなんですが。。。ちなみに私は、ロック・コミット・アンロック運用より、コミット・ダメならマージ運用の方があっています。運用次第ですが、ソースのバッティングってそんなには発生しませんし、ロック運用の場合、ソースにぎられたまま休まれたりするとテンション下がっちゃいますからねぇ。。。

2007年10月19日金曜日

[.NET]自作コントロールのプロパティのシリアライズ

配列で且つとあるクラスの配列をコントロールのプロパティにする場合、そのクラスは、ISerializableをインプリメントする必要があります。そうすることにより、デザイナで設定したプロパティは、リソースのプロパティになります。VS.NET2005はこんなコードをはきます。

this.hoge1.Items = new xxx.yyy.HogeItem[] {
((xxx.yyy.HogeItem)(resources.GetObject("hoge1.Items"))),
((xxx.yyy.HogeItem)(resources.GetObject("hoge1.Items1"))),
((xxx.yyy.HogeItem)(resources.GetObject("hoge1.Items2")))};


リソースから取得した値をデシリアライズし、キャストしています。

ところがこのHogeItemに属性追加やアトリビュート変更をすると、この処理が失敗するらしく、デザイナの画面にエラーが表示時されてしまいます。(xxx.yyy.HogeItem[]をxxx.yyy.HogeItem[]にキャストできません。みたいなメッセージです。)
で、毎回プロパティを入力しなおしていたのですが、以下の手順で回避することが出来ます。

  1. VS.NETを再起動する。
  2. リビルドする
  3. VS.NETをもう一度再起動する。

同じような目にあっている人は試してみてください。なお、この現象は、プロジェクトをいくつかに分離していないと発生しないようです。

2007年10月18日木曜日

[他]SVN+VS.NET

今かかわっているプロジェクトも調査工程が終わりに近づき、メンバーも増えてきました。
ソース管理をしなきゃと。で管理方法なんですが、

  • VSSはVS.NETの上位エディションにしか入っていない
  • CVSはVS.NETのプラグインがあるが、あまり使い勝手がよくない(だいぶ古い情報)
そこで、SVNのプラグインを試してみました。AnkhSVNというツールなんですが、操作性がよく、今後ソース管理はこれで十分だと感じました。

ただDIFFツールをが文字化けが発生してしまうのが少々残念。内臓のDiffツールはエンコードさえ指定すればそれらしく動作するみたいなんですが、使い慣れたツールWinMergeとTortoiseMergeの両方を試してみました。TortoiseMergeに関しては起動すらしませんでした。

何かいい方法は無いだろうか。。。

2007年10月17日水曜日

[.NET]Windows Formコントロールの拡張

WindowsFormの場合、標準でついている共通系コントロールは、デザイナーでプロパティを設定することにより動作や挙動をかえることが出来ます。
しかし、入力チェックをする場合にコントロール1つひとつに対して、コントロールからフォーカスが消えるタイミングでエラーと表示したい場合、ぱっと思いつく方法は、全部のコントロールのサブクラスを作成することです。
しかし、コレは手間がかかり且つ面倒な作業になります、そこで、IExtenderProvider をインプリメントしたコントロールを作成すると、なんと、画面に配備したコントロールにプロパティを追加したりすることが出来ます。
ちょっとしたアスペクト的な動作になります。

私の場合、ErrorProviderのサブクラスを作成し、それにIExtenderProvider をインプリメントし、自動的に入力必須をチェックするコントロールを作成しました。システム共通でコレを使いまわすと意外と開発効率に貢献できそう。

ここにIExtenderProvider を実装したサンプルがあります。
http://msdn.microsoft.com/library/ja/cpguide/html/cpconwinformsextenderprovidersample.asp?frame=true

ここでは、コントロールに制御が移るタイミングで、そのコントロールに紐付けられたメッセージを表示するというものです。コードの例が載っていますが、実装は意外とローテクなんです。。。

まだほかにも応用可能なテクニックになります。たとえばコントロール間の依存関係の自動検証など。
しばらくこの話題に関する情報をつづっていこうと思います。

2007年10月16日火曜日

[他]Gネタ

技術ネタではありませんが、先々週からTVで放送されはじめました、起動戦士ガンダムOOですが、思いっきり見逃してしまいました。で、調べてみるとなんとGYAOでいつでも見れるではないですが!!

先々週・先週を見逃した方、GYAOに行けば見ることが出来ます。ちなみに第一話は今週末までなら見ることが出来ます。

[他]日誌を付けてみます

私は、ソフト開発の仕事をしています。ソフト開発は新しい技術が日進月歩で出てきます。
そんな技術的な話題を中心に、日々の仕事中でわかったことを、Blogにメモっていこうと思います。
あまりたいした情報は出せないかもしれませんが、このメモが世間の誰かしらの役に立てば幸いです。