明けましておめでとうございます。今年も「.NETプログラミング研究」をよろしくお願いいたします。注意この記事の最新版は「J#のライブラリを使ってZIP圧縮、展開(解凍)、リスト表示を行う」で公開しています。ここでは、C#またはVB.NETでZip書庫を扱う(作成、閲覧、展開)方法を紹介します。C#、VB.NETには標準ではZipを扱う方法が用意されていませんが、J#にはvjslib.dllというものがあり、この中のjava.util.zip名前空間にあるクラスを使うことにより、Zipを扱うことが出来ます。この方法は、次のURL先で詳しく紹介されています。C#この方法によりZip書庫を扱う具体的なコードを以下に示します。vjslib.dllを参照に加えてください。(後ほど述べますが、現在この方法には多くの問題がありますので、ご注意ください。)まずはZip書庫内のファイル(エントリ)の情報を列挙するコードです。//閉じるzis.close();fis.close();次はZip書庫内のファイルを展開するコードです。ここでは書庫内のすべてのファイルを展開しています。}}zis.close();fis.close();最後は指定したファイルを圧縮してZip書庫を作成するコードです。1.1)では、このやり方は非常に多くの問題があることが分かっています(2.0では修正されるようです)。上記の方法でパス名に日本語を含むファイルを圧縮するとZip書庫は正常に作成されません。ZipEntry.setTimeで日時を指定できません。ZipFileでエラーが発生しますが、上記のコードではこれを使用していません)。これらのバグについては、次のURL先が参考になります。runtimeさらに別の方法として、Zipを扱う有名なライブラリである#ziplibを使う方法があります。(現在のバージョンは0.81。)#ziplib#ziplibを使ってZipを扱うサンプルを以下に紹介します。Zip内のファイルを列挙するコードから。先ほどのjava.util.zipのサンプルと似ていますね。//閉じるzis.Close();fs.Close();次はZip書庫内のすべてのファイルを展開するコードです。これもjava.util.zipのサンプルと似ています。zis.Close();fs.Close();最後にファイルを圧縮してZip書庫を作成するサンプルです。ここではヘッダでエントリの情報を設定していますが、これを省略すると、フッタに書き込まれます。zos.Close();writer.Close();これ以外の方法では、アンマネージDLLを使う方法があります。これに関しては、次のURL先をご覧ください。「.NET質問箱」では、「どぼん!のプログラミング掲示板」に書き込まれた.NETプログラミングに関する投稿を基に、さらに考察を加え、Q&A形式にまとめて紹介します。注意この記事の最新版は「マルチTIFFやアニメーションGIFに含まれるすべてのイメージを表示する」で公開しています。【質問】マルチTIFFやアニメーションGIFのように複数のイメージを含んだ画像ファイルからすべてのイメージを取り出して表示したいのですが、どのようにすればよいですか?【回答】これには、Image.SelectActiveFrameメソッドでアクティブなフレームを変更し、すべてのフレームのイメージを表示するようにすればよいでしょう。複数のイメージを含んだ画像ファイルをImageオブジェクトに読み込みます。Image.FrameDimensionsListプロパティにより、フレームのディメンションGUIDを取得し、これからFrameDimensionオブジェクトを作成します。これを使用して、SelectActiveFrameメソッドを呼び出します。以下にアニメーションGIFファイル(C:\test.gif)内のすべてのイメージをPictureBox(PictureBox1)に表示するサンプルを示します。注意この記事の最新版は「TextBoxコントロールのEnabledプロパティをFalseにしても前景色と背景色を変えないようにする」で公開しています。【質問】System.Windows.Forms.TextBoxコントロールのEnabledプロパティをFalseにすると、文字の色と背景が灰色になりますが、EnabledプロパティをFalseにしても文字の色と背景色が変わらないようにできませんか?【回答】TextBoxの背景色だけであれば、EnabledプロパティをFalseにした後、BackColorプロパティを設定するだけで、色を変更できます。ForeColorはこの方法では変更できないようです。TextBox1.BackColor;TextBoxの前景色を変えないようにするには、EnabledプロパティをFalseにする代わりに、ReadOnlyプロパティをTrueにするという方法があります。ReadOnlyプロパティをTrueにしても背景色は灰色となりますが、上の例と同様にBackColorプロパティを設定すれば、背景色を変えなくすることもできます。ReadOnlyを使うのではなく、どうしてもEnabledプロパティをFalseにしても前景色と背景色が変わらないようにしたいということであれば、TextBoxクラスから派生したクラスを作成し、OnPaintメソッドをオーバーライドすることにより自分で文字列を描画するという方法があります。FAQ」で紹介されています。TextBox.しかし残念ながらここに紹介されている方法では、TextBoxのEnabledがTrueの時に別のフォント(システムフォント?)でTextが表示されてしまいます。これを防ぐには、TextBoxのEnabledがFalseの時だけ自分で描画するようにします。次の例ではOnEnabledChangedメソッドをオーバーライドすることにより、EnabledがTrueの時のみ独自に描画するようにしています。このクラスはTextAlignやRightToLeftなどのプロパティを一切無視していますので、あくまで参考としてご覧ください。}}このような方法を無理して使うよりも、できることならReadOnlyプロパティを使うか、別の持った簡単な方法を考える方がよいと思います(下記URL参照)。Tom'sコントロールをロックしたい。