Hatena::ブログ(Diary)

当面C#と.NETな記録 このページをアンテナに追加 RSSフィード

2006/11/20 (月)

[][][] surround-with コードスニペット  surround-with コードスニペット - 当面C#と.NETな記録 を含むブックマーク  surround-with コードスニペット - 当面C#と.NETな記録 のブックマークコメント

VisualStudioの機能はどこまでもどこまでも豊富なんですが、今日はじめて「surround-withコードスニペット」に気付いた!

こういう機能って知ってる人は当然と思っているから話題にならないけど、人の作業を見てて「あれ?今何やったの?」ってきっかけで知ることって、ありますね。surround-withコードスニペットは、たぶんそういう機能。

cwみたいなショートカットで打ち込むスニペットと違って、もう書いてしまったコードを選択して、それを#regionで囲う、みたいなことができます。

操作は、コードを選択してCtrl-k, sの順で打ち込むと選択肢が出てきて選べばOK。forみたいなショートカットのスニペットより操作感がいまいちだけど、なかなか便利!

ほかにもいくつか操作方法があるので、お好きなものをどうぞ。

http://msdn2.microsoft.com/ja-jp/library/6hf704tz(VS.80).aspx

ついでに、はじめて作った自作コードスニペットを一つ。ショートカット「dw」で「System.Diagnostics.Debug.WriteLine( );」を挿入します。

以下のファイルを「dw.snippet」の名前で My Documents の下の「Visual Studio 2005\Code Snippets\Visual C#\My Code Snippets」フォルダに置くだけ。VisualStudioの再起動も要りません。このフォルダはデフォルト位置ですが、変更してなければすでにフォルダはあります。

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>DebugWrite</Title>
      <Shortcut>dw</Shortcut>
      <Description>Debug.WriteLine コードスニペット</Description>
      <Author>SioKoshou</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Code Language="CSharp" Kind="method body">
        <![CDATA[System.Diagnostics.Debug.WriteLine( $selected$$end$ );]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Ctrl-k,Ctrl-s でも Ctrl-k, s でもどちらでもいけるあたりがんばってるね。でも、すぐ忘れそう(・ω・) 忘れたら右クリックで…

2006/3/17 (金)

[][] FirefoxのMSDN2検索プラグイン  FirefoxのMSDN2検索プラグイン - 当面C#と.NETな記録 を含むブックマーク  FirefoxのMSDN2検索プラグイン - 当面C#と.NETな記録 のブックマークコメント

Firefoxの検索バーからMSDN2を検索するプラグインを作ってみました。

Document Explorerで検索できますが、Firefoxにもあると便利かなと思って作ってみました。

# MSDN2 search plug-in by siokoshou

<search 
   name="MSDN2"
   description="www.google.co.jp"
   method="GET"
   action="http://www.google.co.jp/search"
   queryCharset="UTF-8"
   queryEncoding="utf-8">

<input name="q" value="site:msdn2.microsoft.com/ja-jp/library/">
<input name="q" user>

</search>

これを MSDN2.src というファイル名で保存して、「C:\Documents and Settings\[ユーザー名]\Application Data\Mozilla\Firefox\Profiles\[ほにゃらら].default\searchplugins (デフォルトの場合)」におきます。

さらに MSDN2.gif という画像(サイズ16x16)もテキトーに用意して一緒においてください。

Firefoxを再起動すれば使えるようになります。

詳しくは Firefoxまとめサイト など。まとめサイトは重たいので、リンクはGoogleキャッシュです。

参考にしたサイト: http://hirohirotest.hp.infoseek.co.jp/Plugin/

誰かこれをサーバーに置いて、ワンクリックでインストールできるようにしてくれるとうれしいです。

2006/2/14 (火)

[][] C#によるWindowsのバージョン判定方法  C#によるWindowsのバージョン判定方法 - 当面C#と.NETな記録 を含むブックマーク  C#によるWindowsのバージョン判定方法 - 当面C#と.NETな記録 のブックマークコメント

http://support.microsoft.com/kb/304283/

メモ

mariccimaricci 2006/02/15 00:59 2003とか、XP(x64)とかは判定に困ったような・・

siokoshousiokoshou 2006/02/15 01:30 ホントだ、書いてないですね(^^; 2003は5.2なのかな?R2は???

mariccimaricci 2006/02/16 08:16 http://www.uchukamen.com/Programming/WindowsVersion/index.htm
ここの参考書のリンクが答えになってますね。

かなり面倒です・・

siokoshousiokoshou 2006/02/16 23:19 なるほど!XP(x64)は…w
KBのご意見入力欄に2003やx64の判定コードもお願いしますって投稿しておきました。そのうちいつかきっと…。

2006/1/29 (日)

[][][] アプリケーション設定 その3  アプリケーション設定 その3 - 当面C#と.NETな記録 を含むブックマーク  アプリケーション設定 その3 - 当面C#と.NETな記録 のブックマークコメント

id:siokoshou:20060122 でアプリケーション設定を VisualStudio と手書きで混在させる方法が分からないって書いてた件、解決できたのでメモしときます。以下は前回に引き続きユーザー設定の話題を扱ってます。

プロジェクトのプロパティを開くと出てくる画面(プロジェクトデザイナっていうみたい)の「設定」ページ(以下、設定ページ)で、アプリケーション設定とユーザー設定(各ユーザーごとの設定)が簡単に設定できるってとこは前回書いたとおり。設定ページで追加した設定は app.config に反映されて、コンパイルすると最終的には「ほげほげ.exe.config」になります。

設定ページは楽なんだけどできることがかなり限定されてて、アプリケーション設定で用意されてる機能のごく一部しか使えません。かといってせっかく用意されてるツールを捨てて、app.config と ApplicationSettingsBase を継承したクラスを全部手書きするのはもったいない。そこで設定ページでできることは設定ページを使いつつ、できない部分だけ手書きするという共存の道を探ってみました(どこかに情報が載ってそうだけどまだ見つけてない…)。

どうやら app.config に VisualStudio が書き込んだのとは別の section を用意してやれば、共存可能なようです。そうするとユーザー設定セクションが複数あることになりますが、別セクションには何を書いても VisualStudio は干渉してきません。設定値を読み書きする処理は Settings.cs に追加でOKでした。

app.config の VisualStudio が書き込んだ section に手書きで追加してしまうと、VisualStudio が設定ページに自動的に取り込み、さらに Settings.Designer.cs に読み書きするコードも自動で生成してしまいます。こうなると設定ページで app.config が壊れているって警告がでたり、Settings.cs に手書きしたコードと同じプロパティを読み書きするコードが Settings.Designer.cs に重複してできてしまいコンパイルが通らなくなります。

ちょっと整理。

ファイル書き換えOK?
app.config書き換えOKだけど、VisualStudioも読み書きするので、書き換えてもよいところとマズイところがある。
Settings.cs設定ページの「コードの表示ボタン」を押すと生成される。書き換えOK。
Settings.Designer.csVisualStudioが自動生成する。書き換えちゃダメ!

例がないとややっこしくて何言ってんだかわかんねー、ってわけで以下サンプルで順を追って説明します。


id:siokoshou:20060122#p1 に、Form の Size を手書きで追加します。このくらいのことは設定ページでもできるけど、サンプルってことで。

前回までの時点の app.config は以下のとおり。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="userSettings" (中略) >
      <section name="WindowsApplication1.Properties.Settings" (中略) />
    </sectionGroup>
  </configSections>
  <userSettings>
    <WindowsApplication1.Properties.Settings>
      <setting name="FormLocation" serializeAs="String">
        <value>0, 0</value>
      </setting>
    </WindowsApplication1.Properties.Settings>
  </userSettings>
</configuration>

sectionGroup として userSettings が定義されていて、今ここに一つだけある section の WindowsApplication1.Properties.Settings が VisualStudio が自動生成したセクションです。これとは別のセクションを追加すると、追加した section には VisualStudio が干渉してきません。そこに Size を追加してやります。

先に進む前に、問題点が何のことだか分からないって方は「</setting>」の後ろに「<setting name="NG" serializeAs="String"><value></value></setting>」なんて追加して設定ページを開くと、自動的に取り込むところを見れます。Settings.Designer.cs を開いてみるとコードまで追加されてます。設定ページ→コードの一方向の生成ツールではなく、両者で同期を取る賢いツールだってのが分かります。こいつはどうやら別セクションは無視してくれるようだよってのが今回の話題。

で、話を戻して、まずは sectionGroup 内に section の定義を追加します。WindowsApplication1.Properties.Settings の定義をコピペして、ManualSettings とでも名付けてしまえばOK。name 以外の type やら何やらはそのまま。

次に後ろのほうの userSettings にこのセクションを追加し、FormSize の名前(何でもいいけど)で Size の定義を追加します。

追加後の app.config はこうなります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="userSettings" (中略) >
      <section name="WindowsApplication1.Properties.Settings" (中略) />
      <section name="ManualSettings" (中略) />
    </sectionGroup>
  </configSections>
  <userSettings>
    <WindowsApplication1.Properties.Settings>
      <setting name="FormLocation" serializeAs="String">
        <value>0, 0</value>
      </setting>
    </WindowsApplication1.Properties.Settings>
    <ManualSettings>
      <setting name="FormSize" serializeAs="String">
        <value>300, 300</value>
      </setting>
    </ManualSettings>
  </userSettings>
</configuration>

app.config の詳しいことは「.NET Framework の構成ファイル スキーマ」のあたり。

Settings.cs に読み書きする処理を追加します。この例は設定ページでも設定できる程度のことなので Settings.Designer.cs からコピペしてちょっと直しただけ。検証コードはサンプルなので省略。

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute( "300, 300" )]
public global::System.Drawing.Size FormSize
{
	get
	{
		return ( ( global::System.Drawing.Size ) ( this[ "FormSize" ] ) );
	}
	set
	{
		this[ "FormSize" ] = value;
	}
}

Form1.cs に読み書き処理を追加。

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Configuration;

namespace WindowsApplication1
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();

			this.Size = Properties.Settings.Default.FormSize;
		}

		protected override void OnClosing( CancelEventArgs e )
		{
			try
			{
				Properties.Settings.Default.FormSize = this.Size;
				Properties.Settings.Default.Save();
			}
			catch ( ConfigurationErrorsException ce )
			{
				MessageBox.Show( ce.BareMessage, "Error!" );
			}
			finally
			{
				base.OnClosing( e );
			}
		}
	}
}

ついでに AssemblyInfo.cs の Company に test とでも書いて、保存された user.config を見てみてネ。ちょっと驚きます。

コンパイル実行すると、Form の Size を保存/読み取りするようになります。サイズを変更して終了、もう一度実行するとサイズが終了前と同じになってるハズ。

このように VisualStudio が作ったセクションとは別のセクションであれば設定ページは無視してくれるようです。これで設定ページを使いつつも、serializeAs="Binary" なんてのは手書きするってことができます。

正しい方法なのかどうかよく分かってないけど、まぁ多分OK。違うこうやるんだって情報や、ここ見ると書いてあるヨって情報があったら教えてくださいませ。

2006/1/22 (日)

[][][] Formの位置を記録する(アプリケーション設定 その1)  Formの位置を記録する(アプリケーション設定 その1) - 当面C#と.NETな記録 を含むブックマーク  Formの位置を記録する(アプリケーション設定 その1) - 当面C#と.NETな記録 のブックマークコメント

Formの位置をユーザーごとに記録しておいて、次回起動時に同じ位置に表示する、みたいなことが.NET2.0から簡単にできるようになった。位置の記録と読み出し程度なら、ちょちょっとマウス操作して数行のお決まりのコードを貼り付けるだけでできてしまう。VisualStudioってすんごいねぇ。

利用する機能は、アプリケーション設定の中の「ユーザー設定」というもの。名前通り、ユーザーごとに設定を保存してくれる。アプリケーション設定はアプリごとに一つあるけど、ユーザー設定はユーザーごとに別のファイルになるのでウィンドウ位置やオプション設定なんかのユーザーお好みの設定を記録しておくのに使える。記録するにはSave()、旧バージョンからの設定引継ぎはUpgrade()なんて書くだけ。楽だ。

以下、Visual C# 2005 Expressで実際にWindow位置を記録してみる手順。かかる時間は3〜5分程度(!?)なので、ユーザー設定って何?って人は実際に試してみてほしい。


1.「ファイル→新しいプロジェクト」で新規Windowsアプリケーションを作成。

2.Form1.csのデザイン画面で、Formのプロパティの「(ApplicationSettings)」を見つける。カテゴリ順ならデータの下にある。こいつが今回いじってみるアプリケーション設定君。この下にいろいろあるので、左の「+」をクリックして展開する。

3.すぐ下に出てきた「(PropertyBinding)」を選んで「...」をクリック。すると、「Form1のアプリケーション設定」というポップアップ画面が出てきて、簡単記録できる項目がずら〜っと並んでいる。

4.今回は位置の記録を試してみるので、「Location」を選び、右のコンボボックスを開き、下に出てきた「(新規...)」をクリック。

5.すると「新しいアプリケーション設定」画面が出てくる。Nameだけ空欄なので、適当に「FormLocation」とでもつける。DefaultValueはすでに(0,0)になってて、ScopeはUserになっている。このScopeがUserかApplicationかってところが、ユーザー設定かアプリケーション設定かっていう違い。

6.「OK」をクリックすると、先ほどの「Form1のアプリケーション設定」画面に「FormLocation」の名前が反映されるので、こちらも「OK」をクリック。

7.あとはFormを閉じたときにセーブする機能をつけるだけ。なぜかセーブだけ自動でやってくれない(VBはセーブも自動らしい)。ソリューションエクスプローラの参照設定に「System.Configuration」を追加。同じくソリューションエクスプローラからForm1.csのコードを開いて、先頭に「using System.Configuration;」を追加する。

8.最後にForm1クラスに以下のコードを追加する。

protected override void OnClosing( CancelEventArgs e )
{
	try
	{
		Properties.Settings.Default.Save();
	}
	catch ( ConfigurationErrorsException ce )
	{
		MessageBox.Show( ce.BareMessage, "Error!" );
	}
	finally
	{
		base.OnClosing( e );
	}
}

9.これで完成!コンパイル&実行すると左上(0,0)座標にFormが表示される。右下にでも移動してFormを閉じ、もう一回起動してみると、今度は右下に出てくる!


なんとも便利な機能だ。詳しい機能の解説はWindows フォームのアプリケーション設定あたり。VBでの解説も参考になる。この解説に「何らか理由で、Size プロパティはバインド可能なプロパティとして表示されません。 これはこのバージョンでの設計上の判断ですが、最終版ではすべてのプロパティがバインドできるようになります。」ってあるけど、結局Sizeは表示されていない。ClientSizeがあるけど...。

当然デザイナ画面だけからではなく、コードで書くこともできる。が、デザイナと手書きを混ぜるとものすごく使いづらい機能だったりもする。このへんはまた後ほど。

(追記)コンパイル通らなかったのを修正しました。すみません。


[][][] ユーザー設定カラクリ編とヒント(アプリケーション設定 その2)  ユーザー設定カラクリ編とヒント(アプリケーション設定 その2) - 当面C#と.NETな記録 を含むブックマーク  ユーザー設定カラクリ編とヒント(アプリケーション設定 その2) - 当面C#と.NETな記録 のブックマークコメント

あんまり深くないカラクリ解説編。

まずはFormから値がどこにどう設定されているのかってあたり。Form1.Designer.csを開いてみてみると、Properties.Settings.Defaultにデータがバインドされてるのが分かる。

データバインディングでLocationが変わるたびに何かコードがごそごそ動くのは無駄すぎて嫌って場合は、デザイナ画面の(PropertyBinding)での設定を行わず、プロジェクトのプロパティの設定画面でデータの定義だけを行い、データの設定と読み取りだけをコードで実現することもできる。FormのOnLoadで

try
{
	this.Location = Properties.Settings.Default.FormLocation;
}
catch ( ConfigurationErrorsException )
{
}

として読み取り、OnClosingで

Properties.Settings settings = Properties.Settings.Default;
settings.FormLocation = this.Location;
try
{
	settings.Save();
}
catch ( ConfigurationErrorsException ce )
{
	MessageBox.Show( ce.BareMessage, "Error!" );
}
finally
{
	base.OnClosing( e );
}

として書き込めばOK。

デザイナでの設定は楽だけど使いづらい面もあって、ちょっとしたアプリ程度なら使えるが、こった事をしたい場合は使えないと思ったほうがよい。例えば、永続化する設定値に、アプリケーション設定の属性を独自に定義することができないようだ。こういうときはデザイナ画面での設定をあきらめ、手でコードを書くしかないようだ(それでもSave()なんて書けるのでユーザー設定を使うメリットは大きい)。

次にユーザー設定ファイルの場所。ClickOnceかWinFormかどうか、ローミングプロファイルを使ってるかどうか、デバッグ時はvshost有効かどうか、などによって変わってくる。AssemblyInfo.csのCompany名、バージョン設定もファイル位置にかかわる。詳しくはこのへん。WinFormで特に設定もしないと「Documents and Settings\username\Local Settings\Application Data」の下にできた(ローミングなし)。ファイル名はuser.config。

user.configファイルはバージョンごとにフォルダが作られ、ファイルが変わる。AssemblyInfo.csでバージョンが時間で変わるようにしていると(最後の桁が*とか)、開発時にはなんともうっとうしい。

プロジェクトのプロパティを開いて「設定」を見るとアプリケーション設定が見れる。その1の例ならFormLocationだけが表示される。この画面の左上にある「同期」を押すと、古い設定ファイルをいっぺんに削除できる。でも、AssemblyInfo.csでCompanyが入っていないと見つけれないっぽい。

さらに、同期の右にある「コードの表示」を押すと、Settings.csというファイルが生成される!Settings.csは「設定の検証」にある、設定値の検証用コードの雛形になっている。設定値の検証を行うことができるタイミングは4つ。ロード時、セーブ時、値変更前、値変更後。最低でもロード時は必ず検証が必要だ。user.configはXMLなので、エディタなどで簡単に値を変更できる。範囲外の値に書き換えられてたら、デフォルト値に変更するなどのコードがどうしても必要になる。SettingChangingで検証するなら、すべての変更時に呼ばれるようなので、その他のタイミングでの検証は不要になる。

Settings.csはSettings.Designer.csのpartialになっている。Settings.Designer.csは「アプリケーション設定のアーキテクチャ」にある、設定の定義相当。プロジェクトのプロパティの設定画面で値を追加すると、このファイルとapp.configファイルに追加分が書き込まれる。

逆にapp.configに設定を手書きで追加すると、プロジェクトのプロパティの設定とSettings.Designer.csに自動的に取り込まれる!なので、デザイナでユーザー設定を追加した場合、手書きで値を追加するのがものすごく困難になる。というか、どうやったら両方で共存できるのか分からない...。一つでも手書きによる追加が必要になったら、すべて手書きするしかないのかも...。(こっちにやり方を書いた)

手書きするにも、デザイナで生成されたコードが参考になるので、一度デザイナに生成させたコードを見てみると早い。MSDNの「方法 : アプリケーション設定を作成する」は、突然SettingsやappSettingsなんてのが出てきて混乱する。単純ミスだろうけど。このドキュメントの前にデザイナのコードを読んだほうがいい。

ユーザー設定を記録するようにすると、バージョンが変わった際の設定値の取り扱いが問題になってくる。旧バージョンの設定はばっさり切り捨てるってのもありだけど(^^;、できるものだけでも引き継ぎたいところ。Upgrade()として古い設定を読み取る仕組みは用意されている。Upgrade()に関するヒントは「LocalFileSettingsProvider.Upgrade」や「ApplicationSettingsBase.Upgrade」あたりが参考になる。

とりあえずこのあたりまで調べたので記録。

(追記)ちょっとはしょってたところを追加。

(さらに追記)OnClosingのコード修正。前のでも問題ない。

(さらにさらに追記)例外捕捉処理を追加。

2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 06 | 09 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 12 |
2009 | 01 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 07 |
2011 | 04 | 07 | 10 |
2012 | 04 | 12 |
2013 | 08 |
2014 | 03 | 08 |
2017 | 09 |