掲示板お問い合わせランダムジャンプ



この広告は30日以上更新がないブログに表示されております。 新しい記事を書くことで広告を消すことができます。

Top Index

2011年06月19日
Action(Of T) デリゲート実例サンプル|DB接続処理を汎用的にしよう
[.NET 4][VS2010][VB] ※.NET4以前のバージョンでは記述できない可能性があります。注意してください。

デリゲートとは、関数を変数のように扱うことです。
宣言は以下のように行い、

'処理を1行で記述する場合
Dim x As Action = Sub() Debug.Print("Sample")
'処理を複数行で記述する場合
Dim y As Action = Sub()
Debug.Print("Sample")
End Sub
'引数を利用する場合
Dim z As Action(Of String) = Sub(args As String) Debug.Print(args)

呼び出すときには以下のようにします。

x.Invoke()
y.Invoke()
z.Invoke("Sample")

で、何に利用できるのか?というと以下のようなことができます。
関数を変数のように扱うことができる。
他の関数に渡すことで、部分的なロジックを差し替えることができる。

まだピンとこないと思いますので、DB接続処理をサンプルに実例を挙げてみます。


・ボタン1をクリックすると、DBサーバーのシステム日付をデバッグウインドウに表示する。
・ボタン2をクリックすると、Employeesテーブルの行数をデバッグウインドウに表示する。
 ※処理内容に特に意味はないです。
  脳内で主キー検索、名前検索などの実用的なものに置き換えてください。

これを単純にコード化すると以下のようになります。

Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
Using cn As New SqlClient.SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;Pooling=False")
cn.Open()
Dim cmd As IDbCommand = cn.CreateCommand
cmd.CommandText = "SELECT CURRENT_TIMESTAMP"
Debug.Print(cmd.ExecuteScalar)
End Using
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button2.Click
Using cn As New SqlClient.SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;Pooling=False")
cn.Open()
Dim cmd As IDbCommand = cn.CreateCommand
cmd.CommandText = "SELECT COUNT(*) FROM EMPLOYEES"
Debug.Print(cmd.ExecuteScalar)
End Using
End Sub

ボタン1とボタン2で全く同じDB接続処理を書いてますが、中身(発行するクエリ)が違うのでサブルーチン化(関数化)できません。
「SqlConnectionのインスタンスからコネクションの接続まで」をサブルーチン化することも可能ですが、
Using構文が使えなくなるので手動でDisposeする必要が出てきてしまい、記述漏れのことを考えるとベストと言いがたいです。

※接続文字列を定数化して記述ミスを防ぐというのはアリですが、それは一旦置いときます。

メインルーチンでIDbCommandクラスを生成し、それを関数(コネクション処理と引数のコマンドを実行する)に投げるという方法も考えられます。
が、複数のコマンドを1回の接続のうちに実行したい事例がでてきたら破綻してしまいます。

※そもそも戻り値の型を何にするかで揉めそうですが。

そこで、デリゲート(関数の変数化、ロジックの差し替え、委譲)の出番です。

続きを読む ...
 
[ 投稿者:mk3008 at 11:53 | VS.NET Tips | コメント(0) | トラックバック(0) ]

2011年06月11日
ExcelファイルをCSVに変換するVBScript
Excelファイルって.NETから操作すると結構めんどくさいので、いったんCSVに変換してしたらどんなもんかね?
と思って変換ツールをVBScriptで作ってみました。



仕様
・Excelがインストールされてないと動きません。
・ExcelファイルをVBSファイルにドロップして使用してください。
・一度に複数ファイルをドロップしても可。
・エクセルファイル内に複数シートがあっても可。
・出力されるパスはExcelファイルと同じパスです。
・出力されるファイルは
 エクセルファイル名.[シート名].csv
・スクリプト実行中にエラーがあると面倒なので、Excel画面はあえて表示しています。
・気に入らない箇所があったら勝手に変更しちゃってください。

以下、ソース。

続きを読む ...
 
[ 投稿者:mk3008 at 12:13 | Excel マクロ | コメント(3) | トラックバック(0) ]

2011年06月04日
アイコンのグレーアウト方法(メモ)
アイコンのグレーアウト方法について、参考になるサイトがあったのでメモ。

以下メモ書き。

Image(画像、イメージ、アイコン)がDisabled(IsEnabled=False)のとき、グレースケール(モノクロ、グレーアウト)化する方法のリンク。

[WPF] How to gray the icon of a MenuItem ?
http://weblogs.asp.net/thomaslebrun/archive/2009/03/03/wpf-how-to-gray-the-icon-of-a-menuitem.aspx


Imageクラスを継承して、AutoGreyableImageクラスを作成。
AutoGreyableImageクラス内でIsEnabledプロパティをオーバーライド?
・・・動作確認してないので、よくわかりませんが使い方がImageクラスと変わらないのでよさげ。

できれば自作せずに標準でそうなって欲しいところですが。
[ 投稿者:mk3008 at 12:17 | WPF | コメント(0) | トラックバック(0) ]

「WPFで透明なボタン」にWin7風のアニメーションを付けてみる
元ネタはこちら
WPFで透明なボタン
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/a901b7ed-d829-414c-a9a1-a7392629e81f/


私も投稿者と同じようなことをしたかったので、こちらの記事は大変参考になりました。
ただ、こちらの記事は「透明なボタン」のサンプルなので、アニメーションはなく、フォーカス感やクリック感などはありません。
というわけで、Windows7の配色を元に、マウスオーバー時、プレス時のアニメーションを追加してみました。

※トグルボタンのスタイルもおまけで作成

続きを読む ...
 
[ 投稿者:mk3008 at 11:55 | WPF | コメント(0) | トラックバック(0) ]