C#

C# フォームの継承

フォームの継承を使うことは希だとは思うが、
デバイス毎に、ライブラリがあり、その違いを吸収するために、
継承を使おうと思ったのだが、

たとえば、Delphiだと、
親のフォーム(配下のコンポネント含む)にイベント記述したら、
継承した子のフォームで、同じイベントに記述した場合、

親のイベントは、無視される。

親のイベントを処理したい場合は、イベントコード中の好きな箇所で、

inherited;

と書くことで、親のイベントを処理してくれる。


かし、C# (今更、VS2005だが・・・)の場合、
継承した子で、新たにForm1.OnLoadに、新しいイベントを書くと、
親のイベントを実行した後、子のイベントが実行される。

デザイナーのコードを見れば、

Load += Form1_Load()

と書かれている。
子のデザイナーのコードにも、同じように書かれている。
-= なんて、記述も出来るらしい。

つまり、親を処理した後、子のイベントを処理する仕様・・・

これって、他言語だと、普通なのか?
全然、文献が出てこなかったが、

[Effective C#] 項目35 イベントハンドらよりもオーバーライドを優先する

を読んで、何となく推測し、書き直してみた。

イベントは、一番上の親に記述し、
その中で別の継承可能な関数を呼び出す。

private void Form1_Load(object sender, EventArgs e)
{
 //
 OnLoad(sender, e);
}
public virtual void OnLoad(object sender, EventArgs e)
{
  // 実行したい処理@親
  a * 1+1
}

子にフォームでは、OnLoadにイベントを追加することなく、

public override void OnLoad(object sender, EventArgs e)
{
  // 実行したい処理@子
  a = 1 + 2;
}

こうやって、Overrideするのが、正解みたい。

手間のかかることを・・・

PS.
2年前に書いたコードだが、無理矢理なコードを書いていたものだ。
一番ひどいのは、form1 から form2 にDataSourceの受け渡しがわからず、
form2のデザイナーのコード上で、form1.DataSourceを渡していた。
コンポーネントにアクセス出来なかったんだが、
private を public を変えるプロパティーを見つけ、解決。

ずいぶん、普通なコードが書けるようになったわな。

-

dotnetzip @.net2 CF C#

これまでの端末は、SDカードを抜き差しして、データをやりとりしていたが、
新しいの端末 Casio DT-5200(中古)は、
Windows Mobile デバイス センター経由でしか、ファイル更新出来ない仕様になる。
Wifiでも積んでいれば、FTPという手があったが、今回のは未対応の端末なので、

今回は、グレードルに差すと、
「My Documentのファイル同期が行われる機能を利用」することにした。

まず、設計の問題なのだが、
1つのXMLファイルにすると非力な端末故、動作が極端に遅いため、
苦肉の策として、XMLファイルを処理単位(ヘッダーとボディー)に分割。

端末側の問題は、軽減できたが、

次の課題は、SDにコピーするのに時間がかかる・・・

このグレードルに差したときも、コピーに2分近く要す。
30台のコピーに1時間。

SDへのコピーは同時に何枚コピー出来たのに、
新端末は、グレードルは1台ずつ。
これじゃ使えない・・・

ってことで、ZIP圧縮して、1つにしてみたら、早かったので、
これを端末側で解凍して、利用するしかなく、
今回は、表題の通り、「DotNetZip」を使う。
※Compact Frameworkに対応していることが、重要。

***

使い方は、おおよそこのサイトで理解できるので、

?DotNetZip(Ionic Zip Library)を使ってZIP書庫のリスト表示などを行う – DoboWiki

今回は、指定エンコードでの読み込みについて。

Read Method (fileName, options)

のサンプルにもあるように、
指定コードは、optionsで指定するみたいだが、

var options = new ReadOptions
{
  Encoding = System.Text.Encoding.GetEncoding("utf-8");
};

.net 2.0では、エラーになる。

3.5にしたら良いわけだが、

ReadOptions options = new ReadOptions();
 options.Encoding = System.Text.Encoding.GetEncoding("utf-8");

こう書けば通った。

3時間ほどかけてわかったことなので、後輩のためにココに残す。

-