Panasonic Let'sNote CF-Y7 ハイスペックモデル買いました。
今届いたのですが
軽い!! めちゃ軽い!!
今のノートは重くてとてもじゃないけど持ち運べない。
客先に持って行く時は何度も捨てて帰ろうかと思ってたので
うれしいぃ~!!!!
.NET DateTimePicker Focus時に反転表示されない。
FormにDateTimePicker1つとボタンを1つ配置します。
ボタンのClickイベントにMe.DateTimePicker1.Focusを書きます。
Formを起動しDateTimePicker1のドロップダウンカレンダーから任意の日付を選択した後、ボタンをクリックしDateTimePickerにFocusすると反転表示ません。
これではDateTimePickerにFocusが当たっているのか見た目ではわかりません。
回避方法はいろいろあります。
1.DateTimePickerのShowCheckBoxプロパティを切り替える
2.DateTimePickerのShowNumericUpDownプロパティを切り替える
3.SendKeys.Send("{RIGHT}")
1と2はコントロールがちらつきます。
3が一番よさそうですが、VistaではSendKeys.Sendがエラーになると聞きます。
他に何かよい方法はないのでしょうか?
ボタンのClickイベントにMe.DateTimePicker1.Focusを書きます。
Formを起動しDateTimePicker1のドロップダウンカレンダーから任意の日付を選択した後、ボタンをクリックしDateTimePickerにFocusすると反転表示ません。
これではDateTimePickerにFocusが当たっているのか見た目ではわかりません。
回避方法はいろいろあります。
1.DateTimePickerのShowCheckBoxプロパティを切り替える
2.DateTimePickerのShowNumericUpDownプロパティを切り替える
3.SendKeys.Send("{RIGHT}")
1と2はコントロールがちらつきます。
3が一番よさそうですが、VistaではSendKeys.Sendがエラーになると聞きます。
他に何かよい方法はないのでしょうか?
.NET 静的コンストラクタ
静的コンストラクタの存在を完全に忘れていました。
Public Class Sample '自分自身のインスタンスです。 Private _Instance As Sample '静的コンストラクタです。 Shared Sub New _Instance = New Sample End Sub End Class
.NET SubMainからスプラッシュウインドウを表示する。
過去記事ログイン画面を表示するを、アプリケーション起動時に、スプラッシュ画面を表示してログイン画面を表示し、メインメニュー画面を表示するように変更します。
Public Class Main
'アプリケーション スレッドに関するコンテキスト情報です。
Private Shared _MainApplicationContext As ApplicationContext
'アプリケーションエントリーポイント
Public Shared Sub Main()
'アプリケーションコンテキストオブジェクトを作成します。
_MainApplicationContext = New ApplicationContext
'XPスタイルに設定します。
Application.EnableVisualStyles()
'スプラッシュウィンドウを表示します。
Dim frmSplash As New SplashForm
AddHandler frmSplash.FormClosed, AddressOf frmSplash_FormClosed
_MainApplicationContext.MainForm = frmSplash
Application.Run(_MainApplicationContext)
End Sub
'スプラッシュウインドウを閉じた時の処理です。
Private Shared Sub frmSplash_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
'ログイン画面を表示します。
Dim frmLogin As New Login
AddHandler frmLogin.FormClosed, AddressOf frmLogin_FormClosed
_MainApplicationContext.MainForm = frmLogin
frmLogin.Show()
End Sub
'ログイン画面を閉じた時の処理です。
Private Shared Sub frmLogin_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
'メインメニューを表示します。
If CType(sender, Form).DialogResult = DialogResult.OK Then
Dim frmMainMenu As New MainMenu
p_MainApplicationContext.MainForm = frmMainMenu
frmMainMenu.Show()
End If
End Sub
End Class
スプラッシュウインドウは3秒間表示するよう設定しました。
Public Class SplashForm
''' <summary>
''' コンストラクタ
''' </summary>
Public Sub New()
' この呼び出しは、Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
Call Init()
End Sub
''' <summary>
''' Loadイベントです。
''' </summary>
Private Sub SplashForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
'タイマーを開始します。
Dim timer As New Timer
AddHandler timer.Tick, AddressOf Timer_Tick
timer.Interval = 3000
timer.Start()
End Sub
''' <summary>
''' タイマー終了時のイベントです。
''' </summary>
Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
'画面を閉じます。
Me.Close()
End Sub
''' <summary>
''' 初期化処理です
''' </summary>
Private Sub Init()
'画面中央に表示します。
Me.StartPosition = FormStartPosition.CenterScreen
'タイトルバーなどを表示しません。
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
'タスクバーに表示しません。
Me.ShowInTaskbar = False
End Sub
End Class
Public Class Main
'アプリケーション スレッドに関するコンテキスト情報です。
Private Shared _MainApplicationContext As ApplicationContext
'アプリケーションエントリーポイント
Public Shared Sub Main()
'アプリケーションコンテキストオブジェクトを作成します。
_MainApplicationContext = New ApplicationContext
'XPスタイルに設定します。
Application.EnableVisualStyles()
'スプラッシュウィンドウを表示します。
Dim frmSplash As New SplashForm
AddHandler frmSplash.FormClosed, AddressOf frmSplash_FormClosed
_MainApplicationContext.MainForm = frmSplash
Application.Run(_MainApplicationContext)
End Sub
'スプラッシュウインドウを閉じた時の処理です。
Private Shared Sub frmSplash_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
'ログイン画面を表示します。
Dim frmLogin As New Login
AddHandler frmLogin.FormClosed, AddressOf frmLogin_FormClosed
_MainApplicationContext.MainForm = frmLogin
frmLogin.Show()
End Sub
'ログイン画面を閉じた時の処理です。
Private Shared Sub frmLogin_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
'メインメニューを表示します。
If CType(sender, Form).DialogResult = DialogResult.OK Then
Dim frmMainMenu As New MainMenu
p_MainApplicationContext.MainForm = frmMainMenu
frmMainMenu.Show()
End If
End Sub
End Class
スプラッシュウインドウは3秒間表示するよう設定しました。
Public Class SplashForm
''' <summary>
''' コンストラクタ
''' </summary>
Public Sub New()
' この呼び出しは、Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
Call Init()
End Sub
''' <summary>
''' Loadイベントです。
''' </summary>
Private Sub SplashForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
'タイマーを開始します。
Dim timer As New Timer
AddHandler timer.Tick, AddressOf Timer_Tick
timer.Interval = 3000
timer.Start()
End Sub
''' <summary>
''' タイマー終了時のイベントです。
''' </summary>
Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
'画面を閉じます。
Me.Close()
End Sub
''' <summary>
''' 初期化処理です
''' </summary>
Private Sub Init()
'画面中央に表示します。
Me.StartPosition = FormStartPosition.CenterScreen
'タイトルバーなどを表示しません。
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
'タスクバーに表示しません。
Me.ShowInTaskbar = False
End Sub
End Class
.NET SubMainからログイン画面を表示する。
Application.Runメソッドのパラメータに指定されたフォームが閉じられると、アプリケーションは終了します。同様に、Application.RunメソッドのパラメータにApplicationContextを指定すると、そのMainFormプロパティに指定されたフォームが閉じられた時に、アプリケーションが終了します。よって、ApplicationContext.MainFormに指定されているフォームが閉じられる時に、つぎに開くフォームをApplicationContext.MainFormに指定すれば、メインフォームを次々と入れ替えて表示することができます。
Public Class Main
Private Shared _MainApplicationContext As ApplicationContext
'アプリケーションエントリーポイント
Public Shared Sub Main()
'アプリケーションコンテキストオブジェクトを作成します。
_MainApplicationContext = New ApplicationContext
'XPスタイルに設定します。
Application.EnableVisualStyles()
'ログイン画面をを表示します。
Dim frmLogin As New LoginForm
AddHandler frmLogin.FormClosed, AddressOf frmLogin_FormClosed
p_MainApplicationContext.MainForm = frmLogin
Application.Run(_MainApplicationContext)
End Sub
'ログイン画面を閉じた時の処理です。
Private Shared Sub frmLogin_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
'メインメニューを表示します。
If CType(sender, Form).DialogResult = DialogResult.OK Then
Dim frmMainMenu As New MainMenu
_MainApplicationContext.MainForm = frmMainMenu
frmMainMenu.Show()
End If
End Sub
End Class
Public Class Main
Private Shared _MainApplicationContext As ApplicationContext
'アプリケーションエントリーポイント
Public Shared Sub Main()
'アプリケーションコンテキストオブジェクトを作成します。
_MainApplicationContext = New ApplicationContext
'XPスタイルに設定します。
Application.EnableVisualStyles()
'ログイン画面をを表示します。
Dim frmLogin As New LoginForm
AddHandler frmLogin.FormClosed, AddressOf frmLogin_FormClosed
p_MainApplicationContext.MainForm = frmLogin
Application.Run(_MainApplicationContext)
End Sub
'ログイン画面を閉じた時の処理です。
Private Shared Sub frmLogin_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
'メインメニューを表示します。
If CType(sender, Form).DialogResult = DialogResult.OK Then
Dim frmMainMenu As New MainMenu
_MainApplicationContext.MainForm = frmMainMenu
frmMainMenu.Show()
End If
End Sub
End Class
.NET 画像表示いろいろ
画像系はあまり使うことがないので、すぐに忘れてしまいます。
ファイルからバイト配列を取得する。
ファイルからImageオブジェクトを取得する。
バイト配列からImageオブジェクトを取得する。
ピクチャーボックスに表示された画像のバイト配列を取得する。
上記の「ファイルからImageオブジェクトを取得する」や「バイト配列からImageオブジェクトを取得する」で取得したImageオブジェクトをPictureBoxのImageプロパティにそのまま設定すると、「ピクチャーボックスに表示された画像のバイト配列を取得する」のImage.SaveでGDI+汎用エラーになってしまいます。
この問題を回避するには、取得したImageオブジェクトからBitmapオブジェクトを作成してPictureBoxのImageプロパティに設定します。
Me.PictureBox1.Image = New System.Drawing.Bitmap(取得したImageオブジェクト)
ファイルからバイト配列を取得する。
Dim bytes() As Byte Using fs As New System.IO.FileStream("パス", IO.FileMode.Open, IO.FileAccess.Read) Using br As New System.IO.BinaryReader(fs) bytes = br.ReadBytes(CInt(fs.Length)) br.Close() End Using fs.Close() End Using
ファイルからImageオブジェクトを取得する。
Dim image As System.Drawing.Image Using fs As New System.IO.FileStream("パス", System.IO.FileMode.Open) image = System.Drawing.Image.FromStream(fs) fs.Close() End Using
バイト配列からImageオブジェクトを取得する。
Dim bytes() as Byte = 画像のバイト配列 Dim image As System.Drawing.Image Usind ms As New System.IO.MemoryStream(bytes) image = System.Drawing.Image.FromStream(ms) ms.Close() End Using
ピクチャーボックスに表示された画像のバイト配列を取得する。
Using ms As New System.IO.MemoryStream() Me.PictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp) Dim bytes(Cint(ms.Length)) As Byte ms.Position = 0 ms.Read(bytes, 0, Convert.ToInt32(ms.Length)) ms.Close() End Using
上記の「ファイルからImageオブジェクトを取得する」や「バイト配列からImageオブジェクトを取得する」で取得したImageオブジェクトをPictureBoxのImageプロパティにそのまま設定すると、「ピクチャーボックスに表示された画像のバイト配列を取得する」のImage.SaveでGDI+汎用エラーになってしまいます。
この問題を回避するには、取得したImageオブジェクトからBitmapオブジェクトを作成してPictureBoxのImageプロパティに設定します。
Me.PictureBox1.Image = New System.Drawing.Bitmap(取得したImageオブジェクト)
.NET XPスタイルにする
過去記事スタートアップオブジェクトをSub MainにするでアプリケーションのエントリーポイントをSub Mainにしました。
Windowsアプリケーションプロジェクトのプロパティよりアプリケーションタブを表示し、「アプリケーションフレームワークを有効にする」チェックボックスをOFFにすることで、アプリケーションのエントリーポイントをSub Mainできるわけですが、同時に「アプリケーションフレームワークを有効にする」チェックボックスがONの場合にWindowsアプリケーションフレームワークのプロパティで設定できるXPスタイルの設定やスプラッシュウインドウの表示などを、自分で定義しないといけません。
XPスタイルにするにはSub MainにApplication.EnableVisualStylesの一文を追加します。
Windowsアプリケーションプロジェクトのプロパティよりアプリケーションタブを表示し、「アプリケーションフレームワークを有効にする」チェックボックスをOFFにすることで、アプリケーションのエントリーポイントをSub Mainできるわけですが、同時に「アプリケーションフレームワークを有効にする」チェックボックスがONの場合にWindowsアプリケーションフレームワークのプロパティで設定できるXPスタイルの設定やスプラッシュウインドウの表示などを、自分で定義しないといけません。
XPスタイルにするにはSub MainにApplication.EnableVisualStylesの一文を追加します。
Public Class Main Public Shared Sub Main() 'XPスタイルにする。 Application.EnableVisualStyles() 'Form1を起動します。 Application.Run(New Form1()) End Sub End Class
雑記 Windowsの自動更新でCPUが100%になる問題
家のPCの起動が遅くなりました。
タスクバーを見るとCPUの使用率が100%になっておりsvchost.exeがCPUを占有しているようです。
Windowsの自動更新でこのような現象が出るようです。
この問題は「マイクロソフト」からKB927891という修正プログラムとWindows Update Agent 3.0 をインストールすることで解決します。
タスクバーを見るとCPUの使用率が100%になっておりsvchost.exeがCPUを占有しているようです。
Windowsの自動更新でこのような現象が出るようです。
この問題は「マイクロソフト」からKB927891という修正プログラムとWindows Update Agent 3.0 をインストールすることで解決します。
.NET アプリケーション設定ファイル ~プロジェクト間で共有 その2~
それではアプリケーション設定ファイル ~プロジェクト間で共有 その1~で作成したクラスを利用して、ユーザー設定の編集画面、アプリケーション設定の表示画面を作成してみましょう。
ソリューション
|
|-StartUpプロジェクト(Windowsアプリケーション)
| |-参照設定:Aプロジェクト、共通プロジェクト
| |--app.config
| |--Main.vb(Sub Main)
|
|-共通プロジェクト(クラスライブラリ)
| |-SettingReader.vb
|
|-Aプロジェクト(クラスライブラリ)
| |-参照設定:共通プロジェクト
| |-ユーザー設定変更Form
| |-アプリケーション設定表示Form
Aプロジェクトにユーザー設定変更Formとアプリケーション設定表示Formを追加します。
ユーザ設定変更Formにはフォーム背景色変更ボタン、保存ボタン、終了ボタンを用意します。
アプリケーション設定表示フォームにはProviderName表示用テキストボックス、ConnectionString表示用テキストボックス、終了ボタンを用意します。
ユーザー設定変更Formのコード
Public Class UserSettingSample
'FormLoadイベント
Private Sub UserSetting_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
'ユーザ設定ファイルよりフォーム背景色を設定します。
Me.BackColor = 共通プロジェクト.SettingReader.FormBackColor
End Sub
'背景色選択ボタンクリックイベント
Private Sub cmdColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cmdColor.Click
Using cd As New System.Windows.Forms.ColorDialog
cd.Color = Me.BackColor
If cd.ShowDialog = Windows.Forms.DialogResult.OK Then
'フォームの背景色を選択色に変更します。
Me.BackColor = cd.Color
End If
End Using
End Sub
'保存ボタンクリックイベント
Private Sub cmdEntry_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cmdEntry.Click
'ユーザ設定ファイルにフォームの背景色を設定します。
共通プロジェクト.SettingReader.FormBackColor = Me.BackColor
'設定ファイルの変更を保存します。
共通プロジェクト.SettingReader.SettingInstance.Save()
End Sub
'終了ボタンクリックイベント
Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExit.Click
Me.Close()
End Sub
End Class
アプリケーション設定表示Formのコード
Public Class AppSettingSample
'Loadイベントです。
Private Sub AppSettingSample_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
'アプリケーション設定ファイルよりProviderNameを表示します。
Me.txtProviderName.Text = 共通プロジェクト.SettingReader.ProviderName
'アプリケーション設定ファイルよりConnectionStringを表示します。
Me.txtConnectionString.Text = 共通プロジェクト.SettingReader.ConnectionString
End Sub
'終了ボタンクリックイベントです。
Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cmdExit.Click
Me.Close()
End Sub
End Class
ユーザ設定画面を起動し、フォームの背景色を変更し保存します。アプリケーションを終了し再度実行すると、先ほど保存した背景色でフォームが表示されます。別ユーザでログインした場合は、先ほど保存した背景色ではなく設定ファイルのデフォルト値で表示されます。
ソリューション
|
|-StartUpプロジェクト(Windowsアプリケーション)
| |-参照設定:Aプロジェクト、共通プロジェクト
| |--app.config
| |--Main.vb(Sub Main)
|
|-共通プロジェクト(クラスライブラリ)
| |-SettingReader.vb
|
|-Aプロジェクト(クラスライブラリ)
| |-参照設定:共通プロジェクト
| |-ユーザー設定変更Form
| |-アプリケーション設定表示Form
Aプロジェクトにユーザー設定変更Formとアプリケーション設定表示Formを追加します。
ユーザ設定変更Formにはフォーム背景色変更ボタン、保存ボタン、終了ボタンを用意します。
アプリケーション設定表示フォームにはProviderName表示用テキストボックス、ConnectionString表示用テキストボックス、終了ボタンを用意します。
ユーザー設定変更Formのコード
Public Class UserSettingSample
'FormLoadイベント
Private Sub UserSetting_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
'ユーザ設定ファイルよりフォーム背景色を設定します。
Me.BackColor = 共通プロジェクト.SettingReader.FormBackColor
End Sub
'背景色選択ボタンクリックイベント
Private Sub cmdColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cmdColor.Click
Using cd As New System.Windows.Forms.ColorDialog
cd.Color = Me.BackColor
If cd.ShowDialog = Windows.Forms.DialogResult.OK Then
'フォームの背景色を選択色に変更します。
Me.BackColor = cd.Color
End If
End Using
End Sub
'保存ボタンクリックイベント
Private Sub cmdEntry_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cmdEntry.Click
'ユーザ設定ファイルにフォームの背景色を設定します。
共通プロジェクト.SettingReader.FormBackColor = Me.BackColor
'設定ファイルの変更を保存します。
共通プロジェクト.SettingReader.SettingInstance.Save()
End Sub
'終了ボタンクリックイベント
Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExit.Click
Me.Close()
End Sub
End Class
アプリケーション設定表示Formのコード
Public Class AppSettingSample
'Loadイベントです。
Private Sub AppSettingSample_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
'アプリケーション設定ファイルよりProviderNameを表示します。
Me.txtProviderName.Text = 共通プロジェクト.SettingReader.ProviderName
'アプリケーション設定ファイルよりConnectionStringを表示します。
Me.txtConnectionString.Text = 共通プロジェクト.SettingReader.ConnectionString
End Sub
'終了ボタンクリックイベントです。
Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cmdExit.Click
Me.Close()
End Sub
End Class
ユーザ設定画面を起動し、フォームの背景色を変更し保存します。アプリケーションを終了し再度実行すると、先ほど保存した背景色でフォームが表示されます。別ユーザでログインした場合は、先ほど保存した背景色ではなく設定ファイルのデフォルト値で表示されます。
.NET データベースアクセス
現在、データベースアクセスの汎用クラスを作成しています。
データベースアクセス部分をプログラミングする方法として、下記のように色々な方法があります。
・カスタムエンティティを使用する。
・DataSetを使用する。
・DataSetを内包するカスタムエンティティを使用する。
それぞれメリット、デメリットがあり、システムやチームメンバーの習熟度により、どの方法を使用するか選択します。
前回のシステムではカスタムエンティティ取り入れた方法を選択しました。
しかしチームメンバーのほとんどがJava等のオブジェクト指向言語が未経験かつ.NET開発も未経験という方たちで、それぞれのPGが独自の方法でデータベースからデータを取り出し、独自の方法で更新しているという収集のつかない状態に・・・。そして開発が一段落ついた頃、外注PGは自社に戻り、派遣PGであった私が全体の保守を行うことになりました。本当に厳しく辛い日々でした。
そしてPGである私は設計者に「設計ルールの必要性」を解くことから始まりました。設計ルールの必要性はすぐに理解していただけました。
そのとき設計者が言ったことは
「今回のシステムで思った事だけど、業務アプリの場合はよほど酷いルールでなければ、それなりに動くものができる。ルールを作って守らす事が、後々の保守のためにも必要だ。」
(えっ!?今頃気づいたのですか?)
まず命名規則を決めました。
(過去記事にも書きましたが、ハンガリアン表記法の半導入です!!)
我流の例外処理の記述を決め
(過去記事にも書きましたが、なんでもかんでも例外キャッチ!!)
そして最も重要なデータベースアクセス部分のルール決めに突入しました。
紆余曲折があり長い時間をかけ色々と話し合いました。
個人的には型付データセットを使用した更新を勧めたのですが、「ウィザードで作成する」部分で却下されました。(正直な所、私もウィザードは好きではありません。が、せっかくNetが用意してくれる便利な機能を使わないのは勿体無いなぁと思います。)結局、落とし所を探って我流データアクセスロジックが決定しました。
Formと1対1となるようなクラスを作成する。(以降FormManagerクラス)
DBテーブルごとにクラスを作成する。(以降DbTableクラス)
FormManagerクラスの役割は
・Formに表示するデータを取得する。(SQLを作成し実行。)
・Formから受け取ったデータを各DbTableクラス単位に分割し、各DbTableクラスの更新処理を呼び出す。
・トランザクションを管理する。
DbTableクラスの役割は
・DB更新処理。
クラス間のデータの受け渡しには、簡易型付データセットを使用します。
これはウイザードで作成せずに、自前で用意します。
そして現在、上記ルールで作成したデータアクセス部分のサンプルを作成しています。
サンプルを作成してて思ったことですが
Netの場合はFormに表示する内容はVIEWを作成し、更新はストアドが一番いい
もちろん設計者には管理が大変なので却下されました。
いつか決定権が持てたら
VIEWとストアドでシステムを組んでみたいです。
データベースアクセス部分をプログラミングする方法として、下記のように色々な方法があります。
・カスタムエンティティを使用する。
・DataSetを使用する。
・DataSetを内包するカスタムエンティティを使用する。
それぞれメリット、デメリットがあり、システムやチームメンバーの習熟度により、どの方法を使用するか選択します。
前回のシステムではカスタムエンティティ取り入れた方法を選択しました。
しかしチームメンバーのほとんどがJava等のオブジェクト指向言語が未経験かつ.NET開発も未経験という方たちで、それぞれのPGが独自の方法でデータベースからデータを取り出し、独自の方法で更新しているという収集のつかない状態に・・・。そして開発が一段落ついた頃、外注PGは自社に戻り、派遣PGであった私が全体の保守を行うことになりました。本当に厳しく辛い日々でした。
そしてPGである私は設計者に「設計ルールの必要性」を解くことから始まりました。設計ルールの必要性はすぐに理解していただけました。
そのとき設計者が言ったことは
「今回のシステムで思った事だけど、業務アプリの場合はよほど酷いルールでなければ、それなりに動くものができる。ルールを作って守らす事が、後々の保守のためにも必要だ。」
(えっ!?今頃気づいたのですか?)
まず命名規則を決めました。
(過去記事にも書きましたが、ハンガリアン表記法の半導入です!!)
我流の例外処理の記述を決め
(過去記事にも書きましたが、なんでもかんでも例外キャッチ!!)
そして最も重要なデータベースアクセス部分のルール決めに突入しました。
紆余曲折があり長い時間をかけ色々と話し合いました。
個人的には型付データセットを使用した更新を勧めたのですが、「ウィザードで作成する」部分で却下されました。(正直な所、私もウィザードは好きではありません。が、せっかくNetが用意してくれる便利な機能を使わないのは勿体無いなぁと思います。)結局、落とし所を探って我流データアクセスロジックが決定しました。
Formと1対1となるようなクラスを作成する。(以降FormManagerクラス)
DBテーブルごとにクラスを作成する。(以降DbTableクラス)
FormManagerクラスの役割は
・Formに表示するデータを取得する。(SQLを作成し実行。)
・Formから受け取ったデータを各DbTableクラス単位に分割し、各DbTableクラスの更新処理を呼び出す。
・トランザクションを管理する。
DbTableクラスの役割は
・DB更新処理。
クラス間のデータの受け渡しには、簡易型付データセットを使用します。
これはウイザードで作成せずに、自前で用意します。
そして現在、上記ルールで作成したデータアクセス部分のサンプルを作成しています。
サンプルを作成してて思ったことですが
Netの場合はFormに表示する内容はVIEWを作成し、更新はストアドが一番いい
もちろん設計者には管理が大変なので却下されました。
いつか決定権が持てたら
VIEWとストアドでシステムを組んでみたいです。
.NET アプリケーション設定ファイル ~プロジェクト間で共有 その1~
プロジェクトのプロパティの設定タブでアプリケーションの設定を行うことができます。
アプリケーションの設定にはアプリケーションスコープとユーザースコープの2種類があります。
アプリケーションスコープはアプリケーション全体の設定で読み取り専用です。
ユーザースコープはログインユーザごとの設定で読み書き可能です。
プロジェクトの設定プロパティで設定を行うと、同プロジェクトの「My Project」フォルダ内に「Settings.settings」ファイルが自動で作成されます。全てのファイルを表示を選択しないと見れません。また同プロジェクト内にapp.configがなければapp.configファイルが作成されます。
Settings.settingsファイルのSettings.Desiner.vbを見てもらうとわかりますが、このファイルはSystem.Configuration.ApplicationSettingsBaseから派生したMySettingsクラス定義ファイルでMy.MySettings.Default.設定名で設定内容にアクセスするためのクラスです。実際の設定内容はapp.configに保存されます。System.Configuration.ApplicationSettingsBaseクラスはapp.configに簡単にアクセスするために用意されたクラスです。詳しくは「アプリケーション設定ファイル」でググってくださいね。
実際に使用するといくつか問題がありました。
My.MySettings.Default.設定名でアクセスできるのは設定を行ったプロジェクト内のクラスでのみです。以下のようなソリューション構成の場合、共通プロジェクトで行った設定内容は共通プロジェクト内のクラスからはMy.MySettings.Default.設定名でアクセスできますが、AプロジェクトやBプロジェクトからはアクセスできません。
またWindowsアプリケーション(以下のStartUpプロジェクト)にアプリケーション設定を行った場合、インストール時にapp.configはexeファイルと同じフォルダにアプリケーション名.exe.configという名前で保存されます。しかしクラスライブラリ(以下の共通、A、Bプロジェクト)にアプリケーション設定を行った場合、インストール時にapp.configはdll内に取り込まれてexeファイルと同じフォルダにconfigファイルは作成されません。これではインストール後に設定ファイルの内容を変更するためには再度dllを作成し配布しなければなりません。
ソリューション
|
|-StartUpプロジェクト(Windowsアプリケーション)
|
| 参照設定:共通プロジェクト、Aプロジェクト、Bプロジェクト
|
|-共通プロジェクト(クラスライブラリ)
|
|-Aプロジェクト(クラスライブラリ
| 参照設定:共通プロジェクト
|
|-Bプロジェクト(クラスライブラリ)
| 参照設定:共通プロジェクト
どうすればいいのか、かなり悩みました。
まず最初に試した方法ですが、
StartUpプロジェクトにアプリケーション設定を行います。
するとStartUpプロジェクトにapp.configとSettings.settingが作成されます。
Settings.Desiner.vb(MySettingsクラス)を見るとスコープがFriendです。単純にこれをPublicにすれば外部公開できますね。でもこの方法では設定を変更する度にFriendクラスに戻ってしまいます。その上、AプロジェクトからStartUpプロジェクトのMySettingsクラスにアクセスするためには、Aプロジェクトの参照設定にMainプロジェクトを追加しなければなりません。う~ん循環参照ですね。
次に試した方法ですが、この方法で外部プロジェクトからも参照設定可能です。
StartUpプロジェクトにアプリケーション設定を行います。
するとStartUpプロジェクトにapp.configとSettings.settingが作成されます。
それから共通プロジェクトにSettingsReaderクラスを作成します。
このクラスにSystem.Configuration.ApplicationSettingsBaseの受け渡しをする静的プロパティを用意します。そしてStartUpプロジェクトのスタートアップオブジェクトであるSub MainからSettingReaderのプロパティにMy.MySetting.Defaultを渡してあげます。
StartUpプロジェクトのプロパティより設定タブを選択し以下のような設定を追加します。
【設定1】
名前:ProviderName
型:String
スコープ:アプリケーション
値:System.Data.OracleClient
【設定2】
名前:ConnectionString
型:(接続文字列)
スコープ:アプリケーション
値:Data Source=xxx;User ID=xxx;Password=xxx;
【設定3】
名前:FormBackColor
型:System.Drawing.Color
スコープ:ユーザー
値:255, 255, 192
共通プロジェクト.SettingReader.vb
Public Class SettingReader
Private Shared p_SettingInstance As _
Global.System.Configuration.ApplicationSettingsBase
Public Shared Property SettingInstance() As _
Global.System.Configuration.ApplicationSettingsBase
Get
Return p_SettingInstance
End Get
Set(ByVal value As Global.System.Configuration.ApplicationSettingsBase)
p_SettingInstance = value
End Set
End Property
'--Application Scope--
'--Application Scopeは Getterのみ記述--
Public Shared ReadOnly Property ProviderName() As String
Get
Return CType(p_SettingInstance.Item("ProviderName"), String)
End Get
End Property
Public Shared ReadOnly Property ConnectionString() As String
Get
Return CType(p_SettingInstance.Item("ConnectionString"), String)
End Get
End Property
'--UserScope--
'--UserScopeは Getter Setterを記述--
Public Shared Property FormBackColor() As System.Drawing.Color
Get
Return CType(p_SettingInstance.Item("FormBackColor"), System.Drawing.Color)
End Get
Set(ByVal value As System.Drawing.Color)
p_SettingInstance.Item("FormBackColor") = value
End Set
End Property
End Class
StartUpプロジェクト.Main.vb
Public Class Main
Public Shared Sub Main()
Common.SettingReader.SettingInstance = My.MySettings.Default
Application.Run(New Form1())
End Sub
End Class
アプリケーションの設定にはアプリケーションスコープとユーザースコープの2種類があります。
アプリケーションスコープはアプリケーション全体の設定で読み取り専用です。
ユーザースコープはログインユーザごとの設定で読み書き可能です。
プロジェクトの設定プロパティで設定を行うと、同プロジェクトの「My Project」フォルダ内に「Settings.settings」ファイルが自動で作成されます。全てのファイルを表示を選択しないと見れません。また同プロジェクト内にapp.configがなければapp.configファイルが作成されます。
Settings.settingsファイルのSettings.Desiner.vbを見てもらうとわかりますが、このファイルはSystem.Configuration.ApplicationSettingsBaseから派生したMySettingsクラス定義ファイルでMy.MySettings.Default.設定名で設定内容にアクセスするためのクラスです。実際の設定内容はapp.configに保存されます。System.Configuration.ApplicationSettingsBaseクラスはapp.configに簡単にアクセスするために用意されたクラスです。詳しくは「アプリケーション設定ファイル」でググってくださいね。
実際に使用するといくつか問題がありました。
My.MySettings.Default.設定名でアクセスできるのは設定を行ったプロジェクト内のクラスでのみです。以下のようなソリューション構成の場合、共通プロジェクトで行った設定内容は共通プロジェクト内のクラスからはMy.MySettings.Default.設定名でアクセスできますが、AプロジェクトやBプロジェクトからはアクセスできません。
またWindowsアプリケーション(以下のStartUpプロジェクト)にアプリケーション設定を行った場合、インストール時にapp.configはexeファイルと同じフォルダにアプリケーション名.exe.configという名前で保存されます。しかしクラスライブラリ(以下の共通、A、Bプロジェクト)にアプリケーション設定を行った場合、インストール時にapp.configはdll内に取り込まれてexeファイルと同じフォルダにconfigファイルは作成されません。これではインストール後に設定ファイルの内容を変更するためには再度dllを作成し配布しなければなりません。
ソリューション
|
|-StartUpプロジェクト(Windowsアプリケーション)
|
| 参照設定:共通プロジェクト、Aプロジェクト、Bプロジェクト
|
|-共通プロジェクト(クラスライブラリ)
|
|-Aプロジェクト(クラスライブラリ
| 参照設定:共通プロジェクト
|
|-Bプロジェクト(クラスライブラリ)
| 参照設定:共通プロジェクト
どうすればいいのか、かなり悩みました。
まず最初に試した方法ですが、
StartUpプロジェクトにアプリケーション設定を行います。
するとStartUpプロジェクトにapp.configとSettings.settingが作成されます。
Settings.Desiner.vb(MySettingsクラス)を見るとスコープがFriendです。単純にこれをPublicにすれば外部公開できますね。でもこの方法では設定を変更する度にFriendクラスに戻ってしまいます。その上、AプロジェクトからStartUpプロジェクトのMySettingsクラスにアクセスするためには、Aプロジェクトの参照設定にMainプロジェクトを追加しなければなりません。う~ん循環参照ですね。
次に試した方法ですが、この方法で外部プロジェクトからも参照設定可能です。
StartUpプロジェクトにアプリケーション設定を行います。
するとStartUpプロジェクトにapp.configとSettings.settingが作成されます。
それから共通プロジェクトにSettingsReaderクラスを作成します。
このクラスにSystem.Configuration.ApplicationSettingsBaseの受け渡しをする静的プロパティを用意します。そしてStartUpプロジェクトのスタートアップオブジェクトであるSub MainからSettingReaderのプロパティにMy.MySetting.Defaultを渡してあげます。
StartUpプロジェクトのプロパティより設定タブを選択し以下のような設定を追加します。
【設定1】
名前:ProviderName
型:String
スコープ:アプリケーション
値:System.Data.OracleClient
【設定2】
名前:ConnectionString
型:(接続文字列)
スコープ:アプリケーション
値:Data Source=xxx;User ID=xxx;Password=xxx;
【設定3】
名前:FormBackColor
型:System.Drawing.Color
スコープ:ユーザー
値:255, 255, 192
共通プロジェクト.SettingReader.vb
Public Class SettingReader
Private Shared p_SettingInstance As _
Global.System.Configuration.ApplicationSettingsBase
Public Shared Property SettingInstance() As _
Global.System.Configuration.ApplicationSettingsBase
Get
Return p_SettingInstance
End Get
Set(ByVal value As Global.System.Configuration.ApplicationSettingsBase)
p_SettingInstance = value
End Set
End Property
'--Application Scope--
'--Application Scopeは Getterのみ記述--
Public Shared ReadOnly Property ProviderName() As String
Get
Return CType(p_SettingInstance.Item("ProviderName"), String)
End Get
End Property
Public Shared ReadOnly Property ConnectionString() As String
Get
Return CType(p_SettingInstance.Item("ConnectionString"), String)
End Get
End Property
'--UserScope--
'--UserScopeは Getter Setterを記述--
Public Shared Property FormBackColor() As System.Drawing.Color
Get
Return CType(p_SettingInstance.Item("FormBackColor"), System.Drawing.Color)
End Get
Set(ByVal value As System.Drawing.Color)
p_SettingInstance.Item("FormBackColor") = value
End Set
End Property
End Class
StartUpプロジェクト.Main.vb
Public Class Main
Public Shared Sub Main()
Common.SettingReader.SettingInstance = My.MySettings.Default
Application.Run(New Form1())
End Sub
End Class
Blogger ブログのソースコードをハイライト表示してみる
リンク先を参考にgoogle-code-prettifyでハイライト表示を試してみたのですが、うまくいきませんでした。丁寧に説明してくださっているのに・・・なんで出来ないんだろう?
結局SourceConverter+CSSでなんとか表示できました。
ですが<pre>~</pre>タグないでソースコードの連続する空白行が無視されるんです。
仕方ないので<br>+全角スペースで対応してます。
ちなみに連続する空白行を無視しないよう設定で変更できるのですが、これまた意図する表示ではないです。
雑記 ダイアグラム別UML徹底活用
ダイアグラム別UML徹底活用
posted with 簡単リンクくん at 2007. 5.12
井上 樹著
翔泳社 (2005.6)
通常1-3週間以内に発送します。
翔泳社 (2005.6)
通常1-3週間以内に発送します。
【感想】
じつはまだ読みきっていません。
ゆっくり読みたいと思います。
雑記 NETエンタープライズWebアプリケーション開発技術大全
.NETエンタープライズWebアプリケーション開発技術大全 Vol.2
posted with 簡単リンクくん at 2007. 5.12
赤間 信幸著
日経BPソフトプレス (2004.6)
通常2-3日以内に発送します。
日経BPソフトプレス (2004.6)
通常2-3日以内に発送します。
.NETエンタープライズWebアプリケーション開発技術大全 Vol.3
posted with 簡単リンクくん at 2007. 5.12
赤間 信幸著
日経BPソフトプレス (2004.6)
通常2-3日以内に発送します。
日経BPソフトプレス (2004.6)
通常2-3日以内に発送します。
.NETエンタープライズWebアプリケーション開発技術大全 Vol.4
posted with 簡単リンクくん at 2007. 5.12
赤間 信幸著
日経BPソフトプレス (2004.10)
通常2-3日以内に発送します。
日経BPソフトプレス (2004.10)
通常2-3日以内に発送します。
.NETエンタープライズWebアプリケーション開発技術大全 Vol.5
posted with 簡単リンクくん at 2007. 5.12
赤間 信幸著
日経BPソフトプレス (2005.3)
通常2-3日以内に発送します。
日経BPソフトプレス (2005.3)
通常2-3日以内に発送します。
【感想】
某掲示板でWindowsアプリケーションにも役立つと紹介され、Vol.2~Vol.5まで購入しましたが
正直な所、Windowsアプリケーション開発には役立つことはありませんでした。
ASP.NETの開発に備えて勉強します。
雑記 プログラミングMicrosoft ADO.NET
プログラミングMicrosoft ADO.NET (CD-ROM付)
posted with 簡単リンクくん at 2007. 5.12
David Sceppa著 / 日本ユニテック訳
日経BPソフトプレス (2002.11)
通常1-3週間以内に発送します。
日経BPソフトプレス (2002.11)
通常1-3週間以内に発送します。
【感想】
良書です!
ADO.NETについて詳しく解説されています。
ボリュームはありますが、決して難しくありません。
翻訳書にありがちな読みにくさもなく、ADO.NETについてはこの1冊で十分理解できます。
.NET OracleのフィールドにDbNull.Valueを登録する際の注意
今日は不思議な事象にはまりました。
自力理解ができないので?@ITに投稿してみました^^;
現象
パラメータを使用して複数件のデータをOracleデータベースに更新する際、パラメータのDbTypeを設定せずに更新クエリーを実行するとOracleExceptionがThrowされる場合があります。
例えば、OracleテーブルのDate型フィールドに2件のデータを登録するとします。
1件目のデータがNowであれば更新クエリーは成功します。
1件目:Now
2件目:DbNull.Value
1件目のデータがDbNull.Valueであれば更新クエリーは2件目のデータを更新する際にOracleExceptionをThrowします。
1件目:DbNull.Value
2件目:Now
ThrowするException
ORA-01861: リテラルが書式文字列と一致しません。
パラメータのDbTypeを設定すれば例外はThrowされません。
SQLServerでは発生しないようです。
サンプルコード
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'データテーブルオブジェクトを作成します。
Dim table As New DataTable
table.Columns.Add(New DataColumn("TESTDATE", GetType(Date)))
Dim row As DataRow
'データテーブルに1件目のデータを追加します。
row = table.NewRow
row("TESTDATE") = DBNull.Value
table.Rows.Add(row)
'データテーブルに2件目のデータを追加します。
row = table.NewRow
row("TESTDATE") = Now
table.Rows.Add(row)
'コネクションオブジェクトを作成します。
Dim cnn As New OracleClient.OracleConnection
cnn.ConnectionString = "接続文字列"
'コマンドオブジェクトを作成します。
Dim cmdInsert As New OracleClient.OracleCommand
cmdInsert.Connection = cnn
cmdInsert.CommandText = "INSERT INTO TESTTABLE (TESTDATE) VALUES (:TESTDATE)"
'パラメータを作成します。
Dim prm As New OracleClient.OracleParameter
prm = cmdInsert.CreateParameter
'--DbTypeを指定しないとExceptionが発生します。--
prm.DbType = DbType.Date
prm.ParameterName = "TESTDATE"
prm.SourceColumn = "TESTDATE"
cmdInsert.Parameters.Add(prm)
'データテーブルの変更をデータベースへ反映します。
Dim adp As New OracleClient.OracleDataAdapter
adp.InsertCommand = cmdInsert
adp.Update(tbl)
End Sub
MSDNでOracleParameter.DbType プロパティを確認すると
パラメータの DbType プロパティ、OracleType プロパティ、および.Data.OracleClient.OracleParameter.Size プロパティは、.Data.OracleClient.OracleParameter.Value を設定することによって推論できます。したがって、これらを指定する必要はありません。とありました。
パラメータはValue値からDbTypeを推論します。
Oracle® Data Provider for .NET開発者ガイド の「ValueからのDbTypeおよびOracleDbType」の推論によると.Netデータ型がDateTimeのときOracleDbTypeはTimeStampを推論するようです。
つまり1件目のデータのパラメータValue値がDbNull.Valueの場合、OracleDbTypeをTimeStampと推論し2件目のデータでOracleDbTypeがDate型のデータをInsertしようとして例外がスローされるようです。
1件目のデータのパラメータValue値がDbNull.Value以外であればOracleDbTypeはDate型を推論するため、1件目のデータがNowであれば例外はスローされないということのようです。
自力理解ができないので?@ITに投稿してみました^^;
現象
パラメータを使用して複数件のデータをOracleデータベースに更新する際、パラメータのDbTypeを設定せずに更新クエリーを実行するとOracleExceptionがThrowされる場合があります。
例えば、OracleテーブルのDate型フィールドに2件のデータを登録するとします。
1件目のデータがNowであれば更新クエリーは成功します。
1件目:Now
2件目:DbNull.Value
1件目のデータがDbNull.Valueであれば更新クエリーは2件目のデータを更新する際にOracleExceptionをThrowします。
1件目:DbNull.Value
2件目:Now
ThrowするException
ORA-01861: リテラルが書式文字列と一致しません。
パラメータのDbTypeを設定すれば例外はThrowされません。
SQLServerでは発生しないようです。
サンプルコード
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'データテーブルオブジェクトを作成します。
Dim table As New DataTable
table.Columns.Add(New DataColumn("TESTDATE", GetType(Date)))
Dim row As DataRow
'データテーブルに1件目のデータを追加します。
row = table.NewRow
row("TESTDATE") = DBNull.Value
table.Rows.Add(row)
'データテーブルに2件目のデータを追加します。
row = table.NewRow
row("TESTDATE") = Now
table.Rows.Add(row)
'コネクションオブジェクトを作成します。
Dim cnn As New OracleClient.OracleConnection
cnn.ConnectionString = "接続文字列"
'コマンドオブジェクトを作成します。
Dim cmdInsert As New OracleClient.OracleCommand
cmdInsert.Connection = cnn
cmdInsert.CommandText = "INSERT INTO TESTTABLE (TESTDATE) VALUES (:TESTDATE)"
'パラメータを作成します。
Dim prm As New OracleClient.OracleParameter
prm = cmdInsert.CreateParameter
'--DbTypeを指定しないとExceptionが発生します。--
prm.DbType = DbType.Date
prm.ParameterName = "TESTDATE"
prm.SourceColumn = "TESTDATE"
cmdInsert.Parameters.Add(prm)
'データテーブルの変更をデータベースへ反映します。
Dim adp As New OracleClient.OracleDataAdapter
adp.InsertCommand = cmdInsert
adp.Update(tbl)
End Sub
MSDNでOracleParameter.DbType プロパティを確認すると
パラメータの DbType プロパティ、OracleType プロパティ、および.Data.OracleClient.OracleParameter.Size プロパティは、.Data.OracleClient.OracleParameter.Value を設定することによって推論できます。したがって、これらを指定する必要はありません。とありました。
パラメータはValue値からDbTypeを推論します。
Oracle® Data Provider for .NET開発者ガイド の「ValueからのDbTypeおよびOracleDbType」の推論によると.Netデータ型がDateTimeのときOracleDbTypeはTimeStampを推論するようです。
つまり1件目のデータのパラメータValue値がDbNull.Valueの場合、OracleDbTypeをTimeStampと推論し2件目のデータでOracleDbTypeがDate型のデータをInsertしようとして例外がスローされるようです。
1件目のデータのパラメータValue値がDbNull.Value以外であればOracleDbTypeはDate型を推論するため、1件目のデータがNowであれば例外はスローされないということのようです。
.NET FrameWork3.0
.Net Framework3.0についてもう少し詳しく調べてみました。
.Net Framework3.0で追加されたコンポーネント
・Windows Presentation Foundation
・Windows Communication Foudation
・Windows Workflow Foundation
・Windws CardSpace
Windows Presentation Foundation(WPF)について
WPF(コードネーム:Avalon)は.NET FrameworkのGUI部分を司るコンポーネント。
・3Dを用いたGUIを実現できる。
・WPFの特徴の1つは、XAML(Extensible Application Markup Language:ザメル/ザムル)と呼ばれる言語を用いてアプリケーションのUIを記述できる。XAMLはXMLベースの言語で、ボタンや2D/3D描画のためのコンポーネントを、XMLのタグを用いて表現する。これによりデザインとロジックが分離されWebアプリケーション開発では一般的だが、スタンドアロンアプリケーションではあまり重視されてこなかった、デザイナと開発者の分業開発が可能となる。
参考サイト
http://codezine.jp/a/article/aid/910.aspx
Windows Communication Foudation(WCF)について
WCF(コードネーム:Indigo)は、.NET Framework 3.0の通信部分を司るコンポーネント。
分散アプリケーション技術におけるアプリケーション間の連携を行うための技術。1マシン上でのプロセス間通信、Windowsマシン間のネットワークをまたがった通信、Webサービスを使用した他のプラットフォーム間との通信などにおいて、従来であれば各アプリケーションが採用した技術ごとに異なるコーディングを行う必要があったが、WPFでは設定ファイルに通信方式を定義し、設定ファイルの変更だけで基本的な実行コードは同じという統一されたコーディングが可能となる。
参考サイト
http://codezine.jp/a/article/aid/910.aspx
http://www.atmarkit.co.jp/fdotnet/wcf/index/index.html
Windows Workflow Foundation(WF)について
Windowsでワークフローを作成するための技術基盤。
システムワークフロー、ヒューマンワークフローの両方に対応したワークフローを作成できる。
デザイン画面で作成したワークフローはコードファイルとして保存されコンパイルして処理が実行される。
コードはワークフローデザイナでダブルクリックすることで記述し、ワークフローとコードの分離が可能となる。
参考サイト
http://www.atmarkit.co.jp/fdotnet/special/winworkflow/winworkflow_01.html
Windws CardSpace(WCS)について
WCSは(コードネーム:InfoCard)、インターネット上でのIDの管理、制御、交換のためのシステム。
ユーザー名とパスワードを使用した従来の認証方法ではフィッシングなどの攻撃があるためパスワードを盗まれる可能性がある。WSCを使用することで現実世界同様に第三者機関(自分も含む)が発行したオンライン上のIDカードにより認証を行う仕組み。
Internet Explorer 7でWindows CardSpaceはサポートされる。
Vistaのみならず、Windows XP SP2、Windows Server 2003 SP1にも提供される予定。
参考サイト
http://blog.japan.zdnet.com/tokuda/a/2007/02/window_vistams_2.html
http://www.microsoft.com/japan/msdn/net/general/IntroInfoCard.aspx
.NET Framework 3.0新技術の使い分け指針
http://www.atmarkit.co.jp/fdotnet/special/dotnetfx3002/dotnetfx3002_03.html
Windows Vista時代のユーザー・インタフェースの作り方
http://itpro.nikkeibp.co.jp/article/COLUMN/20061117/254083/?ST=win&P=1
.Net Framework3.0で追加されたコンポーネント
・Windows Presentation Foundation
・Windows Communication Foudation
・Windows Workflow Foundation
・Windws CardSpace
Windows Presentation Foundation(WPF)について
WPF(コードネーム:Avalon)は.NET FrameworkのGUI部分を司るコンポーネント。
・3Dを用いたGUIを実現できる。
・WPFの特徴の1つは、XAML(Extensible Application Markup Language:ザメル/ザムル)と呼ばれる言語を用いてアプリケーションのUIを記述できる。XAMLはXMLベースの言語で、ボタンや2D/3D描画のためのコンポーネントを、XMLのタグを用いて表現する。これによりデザインとロジックが分離されWebアプリケーション開発では一般的だが、スタンドアロンアプリケーションではあまり重視されてこなかった、デザイナと開発者の分業開発が可能となる。
参考サイト
http://codezine.jp/a/article/aid/910.aspx
Windows Communication Foudation(WCF)について
WCF(コードネーム:Indigo)は、.NET Framework 3.0の通信部分を司るコンポーネント。
分散アプリケーション技術におけるアプリケーション間の連携を行うための技術。1マシン上でのプロセス間通信、Windowsマシン間のネットワークをまたがった通信、Webサービスを使用した他のプラットフォーム間との通信などにおいて、従来であれば各アプリケーションが採用した技術ごとに異なるコーディングを行う必要があったが、WPFでは設定ファイルに通信方式を定義し、設定ファイルの変更だけで基本的な実行コードは同じという統一されたコーディングが可能となる。
参考サイト
http://codezine.jp/a/article/aid/910.aspx
http://www.atmarkit.co.jp/fdotnet/wcf/index/index.html
Windows Workflow Foundation(WF)について
Windowsでワークフローを作成するための技術基盤。
システムワークフロー、ヒューマンワークフローの両方に対応したワークフローを作成できる。
デザイン画面で作成したワークフローはコードファイルとして保存されコンパイルして処理が実行される。
コードはワークフローデザイナでダブルクリックすることで記述し、ワークフローとコードの分離が可能となる。
参考サイト
http://www.atmarkit.co.jp/fdotnet/special/winworkflow/winworkflow_01.html
Windws CardSpace(WCS)について
WCSは(コードネーム:InfoCard)、インターネット上でのIDの管理、制御、交換のためのシステム。
ユーザー名とパスワードを使用した従来の認証方法ではフィッシングなどの攻撃があるためパスワードを盗まれる可能性がある。WSCを使用することで現実世界同様に第三者機関(自分も含む)が発行したオンライン上のIDカードにより認証を行う仕組み。
Internet Explorer 7でWindows CardSpaceはサポートされる。
Vistaのみならず、Windows XP SP2、Windows Server 2003 SP1にも提供される予定。
参考サイト
http://blog.japan.zdnet.com/tokuda/a/2007/02/window_vistams_2.html
http://www.microsoft.com/japan/msdn/net/general/IntroInfoCard.aspx
.NET Framework 3.0新技術の使い分け指針
http://www.atmarkit.co.jp/fdotnet/special/dotnetfx3002/dotnetfx3002_03.html
Windows Vista時代のユーザー・インタフェースの作り方
http://itpro.nikkeibp.co.jp/article/COLUMN/20061117/254083/?ST=win&P=1
GrapeCityTool ElTanelle 4.0J
GrapeCity製のWorkSheet4.0の拡張コンボボックスエディタについてのメモです。
拡張コンボボックスをValueAsIndex=Falseにしていた場合、ValueMemberの「型」とDataFieldに設定するMappingの「型」を合わせないとエラーになります。
具体的に説明すると
拡張コンボボックスのValueMemberにはListItemクラスのCd(Object)が設定されています。
拡張コンボボックスを設定した1列目にはDataTableの「FIELD1」DataColumnが表示されます。
拡張コンボボックスのValueAsIndex=Falseを設定しないと拡張コンボボックスの選択値はIndexで選択されてしまいます。例えばFIELD1の値が「3」のとき、拡張コンボボックスのドロップダウンアイテムからインデックス3(=4つ目のアイテム)を選択しようとします。CD=3に該当するアイテムを選択したい場合はValueAsIndex=Falseを設定します。
拡張コンボボックスをValueAsIndex=Falseにしていた場合、ValueMemberの「型」とDataFieldに設定するMappingの「型」を合わせないとエラーになります。
具体的に説明すると
拡張コンボボックスのValueMemberにはListItemクラスのCd(Object)が設定されています。
拡張コンボボックスを設定した1列目にはDataTableの「FIELD1」DataColumnが表示されます。
拡張コンボボックスのValueAsIndex=Falseを設定しないと拡張コンボボックスの選択値はIndexで選択されてしまいます。例えばFIELD1の値が「3」のとき、拡張コンボボックスのドロップダウンアイテムからインデックス3(=4つ目のアイテム)を選択しようとします。CD=3に該当するアイテムを選択したい場合はValueAsIndex=Falseを設定します。
'Form1クラスです。 Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load '拡張コンボボックスのデータを作成します。 Dim list As New List(Of ListItem) For idx As Integer = 1 To 10 list.Add(New ListItem(i,"List_" & i.ToString) Next '拡張コンボボックスエディタを作成します。 Dim cbo As New GrapeCity.Win.ElTabelle.Editors.SuperiorComboEditor With cbo .DataSource = list .DisplayMember = "Name" .ValueMember = "Cd" .ValueAsIndex = False End With '拡張コンボボックスエディタをシートの1列目に設定します。 Me.Sheet1.Columns(0).Editor = cbo 'シートに表示するデータを作成します。 Dim sql As String = "SELECT FIELD1 FROM TABLE1" Dim connection As New System.Data.OleDb.OleDbConnection("接続文字列") Dim adapter As New System.Data.OleDb.OleDbDataAdapter(sql, connection) Dim table As New DataTable 'このコードを入れないとエラーになります。 table.Columns.Add(New DataColumn("FIELD1",GetType(Integer))) adapter.Fill(table) 'シートにデータを設定します。 Me.Sheet1.DataSource = table Me.Sheet1.Columns(0).DataField = "FIELD1" End Sub End Class
'コードとコードに対応する名前を保持するクラスです。 Public Class ListItem Private _Cd As Object private _Name As String Public Sub New(cd As Object,name As String) Me._Cd = cd Me._Name = name End Sub Public Property Cd() As Object Get Return Me._Cd End Get Set(ByVal value As Object) Me._Cd = value End Set End Property Public Property Name() As String Get Return Me._Name End Get Set(ByVal value As String) Me._Name = value End Set End Property End Class
.NET TypedDataSetの削除された行にアクセスする
私は型指定されたDataSetの一番の利点はインテリセンス機能だと思っています。
型指定されていないDataSetで各フィールド値にアクセスする場合は以下のように書きます。
dataRow("hogehoge")
型指定されているDataSetで各フィールド値にアクセスする場合は以下のように書きます。
dataRow.hogehoge
datarowと書いて「.」をポチッとするとフィールド一覧が出てきてコードを書くのに大変助かります。
今日は型指定されたDataSetで削除された行にアクセスする必要がありました。
私は削除された行にアクセスするには、きっと
datarow.hogehoge(DataRowVersion)
みたいなコードがあると思っていました。
絶対にあるはずだと勝手に思い込んでいました。
デザイナが作成するコードを見ても、そんなものはまったくありません。
それでも自分が信じられなくてググッてみました。
削除された行へのアクセスは型指定されていないDataSetと同じ方法になるのですね・・・。
datarow("hogehoge",DataRowVersion.Original)
なんだかなぁ。
型指定されていないDataSetで各フィールド値にアクセスする場合は以下のように書きます。
dataRow("hogehoge")
型指定されているDataSetで各フィールド値にアクセスする場合は以下のように書きます。
dataRow.hogehoge
datarowと書いて「.」をポチッとするとフィールド一覧が出てきてコードを書くのに大変助かります。
今日は型指定されたDataSetで削除された行にアクセスする必要がありました。
私は削除された行にアクセスするには、きっと
datarow.hogehoge(DataRowVersion)
みたいなコードがあると思っていました。
絶対にあるはずだと勝手に思い込んでいました。
デザイナが作成するコードを見ても、そんなものはまったくありません。
それでも自分が信じられなくてググッてみました。
削除された行へのアクセスは型指定されていないDataSetと同じ方法になるのですね・・・。
datarow("hogehoge",DataRowVersion.Original)
なんだかなぁ。
登録:
投稿 (Atom)
-
DataTableから重複を除くには と DataTableの集約計算を行う(Compute) を利用して、DataTableをグループ化し集計を行います。 以下のようなデータが入ったDataTableから、Field1とField2で重複を取り除き集計をおこないます。...
-
前回「 PLSQL SELECTの結果を取得する ~取得結果が1行の場合~ 」に続き 今回はSELECTの結果が複数行の場合です。 SELECTの結果が複数行の場合はカーソルを使用します。 カーソルとは SELECTの結果セットに対して、1行ずつデータを取り出し、順次...
-
datatableの集約計算を行うにはDataTable.Compute メソッドを使用します。 Dim As Object '最大値を求める value = datatable.Compute("Max(集計列名)", Nothing) ...