SQLiteを使う
個人や小規模のデータベースで使用するSQLiteの勉強
作成されるデータベースファイルは一個なので手軽に管理できる。
入手先
以下のサイトのDownloadから入手する。現時点のバージョンは3.25.3。
Windows環境でプログラムからDLLを使用する場合は、sqlite-dll-win64-x64-3250300.zip または、sqlite-dll-win32-x86-3250300.zip
コマンドプロンプトやPowerShellのコンソールから使用する場合は、sqlite-tools-win32-x86-3250300.zip内のsqlite3.exeを使用する。
あと以下のアプリでGUIを使ってデータベースファイルへアクセスできるのでインストールしておくと便利
EXCEL VBAメモ - ユーザーフォーム上のTextBoxにEnter押下で連続入力する
目的
ListBoxとTextBoxがあるユーザーフォームで、TextBoxに入力したデータをListBoxに追加していきたい。
その時Enter押下だけで連続に入力していく様にしたい。
試行錯誤
通常はTextBoxにデータを入力したあとにEnterを押すとフォーカスが別のコントロールに移動してしまう為、追加用のButtonコントロール等を用意しなければならない。
Enterのみで連続入力ができないか、TextBox_KeypressイベントやTextBox_Keydownイベント等試したけれども、やはりEnterでフォーカスが移動してしまい、上手くいかない。
結論
TextBox_BeforeUpdateというイベントを利用すると良い。このイベントはTextBoxの入力値に変更があった場合、フォーカスが移動する前に発生し、引数にCancelがありフォーカス移動を止めることができる。
従って、このイベント内でListBoxに追加する処理を記述してから、最後にCancel に True を代入することでTextBoxにフォーカスを残したままListBoxにデータを追加することが可能になる。
(フォーカス移動後に発生するTextBox_AfterUpdateイベントもある。こちらはCancelが無い)
問題点
無条件にCancel = Trueにすると、以下の問題が生じるので、TextBoxに値が存在する場合のみ行うなど条件分けが必要になる。
- TABによるフォーカス移動が利かなくなる
- 他のButton等が使用できなくなる
C# - 引数 - 値渡しと参照渡し
メソッドの引数を参照渡しで行う場合は、仮引数だけでなく、実引数側にも ref をつける。これはメソッドの引数にしたことで、メソッド側から書き換えが発生する可能性のあることを明示する為である。
メソッドの結果を引数経由で呼び出し側に渡す用途の場合は、ref の代わりに out を使用する。このため呼び出し側で out を付けて渡す実引数は必ず変数でなければならない。またメソッド側から代入が行われるので値が未定の(代入していない)変数も使用できる。代わりにメソッド内では、outを付けた仮引数を読み出すことはできない。
参照型変数を参照渡しでメソッドに渡して、メソッド内において新規オブジェクトを代入(参照)した場合、呼び出し側の変数においても新規オブジェクトが参照され、元々参照していたオブジェクトを参照しなくなるので注意。
C# - 引数 - 規定値/名前付き引数/可変長引数
メソッド定義の仮引数に規定値を付けると、メソッド呼び出し時にその引数を省略することができる。ただし仮引数の並びで、規定値有りの引数の後ろに規定値無しの引数を置くことはできない。
また、メソッド呼び出し時に
仮引数名 : 値
とすることで仮引数の順番に関係なく値を渡すことができる。
更に、仮引数にparamsし配列を置くことで可変長の値を受け取ることができる。可変長引数に渡す値がなくてもエラーにならない。ただし可変長引数は、仮引数リストの最後に置かなければならない。
params 型[] 可変長仮引数名
続きを読む
C# - foreach文とyield
IEnumerable<T>型のメソッドを定義して、その処理中に yield return 値; を記述することで、IEnumerable<T>オブジェクトを生成することができる。
IEnumerable<int> MyEnumerable() { 処理; yield return 値; 処理; }
この方法を利用したほうが、IEnumerable<T>型やIEnumerator<T>型のクラスを定義するよりも簡単にEnumeratorが作成できる。
試しにforech文を使用せずに、GetEnumerator()メソッドでIEnumerator<T>型オブジェクトを取得したところ、GetNext()メソッドおよびCurrentプロパティで値を順番に取得することができた。
yield returnを使用した場合の動作は、IEnumerable<T>型のメソッド中でyield return文に出くわすと、foreach側に制御が移ってforeachブロックの処理を実行する。その処理が終了すると再びIEnumerable<T>型のメソッドに制御が移りyield return文の次から処理が行われるという形になる。これがIEnumerable<T>型のメソッドの処理が終了するまで継続する。
C# - foreach文とIEnumerableインターフェース(ジェネリック)
ジェネリックに対応させるには、昨日に対してIEnumerable<T>、IEnumerator<T>とIDisposableインターフェースを追加して継承する。
interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); } interface IEnumerator<T> { T Current { get; } }
GetEnumeratorメソッドはIEnumerator<T>型オブジェクトを、CurrentプロパティはT型を戻り値とするため、追加の定義を行う。IEnumerator内でファイルオープン等を行う場合は、IDisposable.Disposeメソッドで破棄の処理を記述する。