2011年11月12日土曜日
2011年9月16日金曜日
→→→抽象クラスより難しい「インタフェース」
インタフェースは、抽象クラスと同じように、機能の大枠を定めるもの
Module Module
Sub Main()
Dim c As New Class1()
c.Output()
End Sub
End Module
Interface Interface1
Sub Output()
End Interface
Class Class1
Implements Interface1
Public Sub Output()
Implements Interface1.Output
Dim s As String = "こんにちは"
Console.WriteLine(S)
End Sub
End Class
Interface1インタフェースを実装したClass1
Implementsキーワードを使い、Interface1の実装であることを示す
インタフェースは、抽象クラスよりも厳しい制約を課すものと言える。
抽象クラスClass1の中に記述していた文字列変数sの宣言はInterface1に書くことはできない。
インタフェースはメンバー変数を持てない。
Class1のメンバー変数として文字列sを記述することもできない。
インタフェースを実装するクラスは、メンバー変数を勝手に追加することができない
Module Module
Sub Main()
Dim c As New Class1()
c.Output()
End Sub
End Module
Interface Interface1
Sub Output()
End Interface
Class Class1
Implements Interface1
Public Sub Output()
Implements Interface1.Output
Dim s As String = "こんにちは"
Console.WriteLine(S)
End Sub
End Class
Interface1インタフェースを実装したClass1
Implementsキーワードを使い、Interface1の実装であることを示す
インタフェースは、抽象クラスよりも厳しい制約を課すものと言える。
抽象クラスClass1の中に記述していた文字列変数sの宣言はInterface1に書くことはできない。
インタフェースはメンバー変数を持てない。
Class1のメンバー変数として文字列sを記述することもできない。
インタフェースを実装するクラスは、メンバー変数を勝手に追加することができない
→→→そのまま使えない「抽象クラス」
そのまま使えない、必ず子クラスを作って追加実装をしなければいけない「抽象クラス(abstract class)」というものがある。
Module Module1
Sub Main()
Dim c As New Class2()
c.Output()
End Sub
End Module
MustInherit Class Class1
Protected S As String = "こんにちは"
Public MustOverride Sub Output()
End Class
Class Class2
Inherits Class1
Public Overrides Sub Output()
Console.WriteLine(S)
End Sub
End Class
Class1クラスは抽象クラス。MustInherit(継承しなければいけない)と記述しているし、OutputメソッドはMustOverride(オーバーライドしなければいけない)と書かれた抽象メソッドで、中身の記述がない。
Class2クラスではOutputメソッドをオーバーライドして処理を記述している。Class1ではOutputメソッドの外側を記述し、Class2で内側を記述しているようなもの。
Class2の段階まで持っていけばインスタンス化して利用できる。
Class1は直接はインスタンス化して利用できない。Class2をClass1に書き換えるとエラー。
抽象クラスは「何をするか」の大枠だけを決めておいて「どのようにするか」を子クラスにまかせる仕組み
Module Module1
Sub Main()
Dim c As New Class2()
c.Output()
End Sub
End Module
MustInherit Class Class1
Protected S As String = "こんにちは"
Public MustOverride Sub Output()
End Class
Class Class2
Inherits Class1
Public Overrides Sub Output()
Console.WriteLine(S)
End Sub
End Class
Class1クラスは抽象クラス。MustInherit(継承しなければいけない)と記述しているし、OutputメソッドはMustOverride(オーバーライドしなければいけない)と書かれた抽象メソッドで、中身の記述がない。
Class2クラスではOutputメソッドをオーバーライドして処理を記述している。Class1ではOutputメソッドの外側を記述し、Class2で内側を記述しているようなもの。
Class2の段階まで持っていけばインスタンス化して利用できる。
Class1は直接はインスタンス化して利用できない。Class2をClass1に書き換えるとエラー。
抽象クラスは「何をするか」の大枠だけを決めておいて「どのようにするか」を子クラスにまかせる仕組み
→→→メソッドのオーバーライド
メソッドのオーバーライド(override)という機能。簡単に言えば子クラスで親クラスのメソッドを「上書き」する機能。
Module Module1
Sub Main()
Dim c As New Class2()
c.Output()
End Sub
End Module
Class Class1
Protected S As String = "こんにちは"
Public Overridable Sub Output()
Console.WriteLine(S)
End Sub
End Class
Class Class2
Inherits Class1
Public Overrides Sub Output()
Console.Write(S)
Console.WriteLine(S)
End Sub
End Class
Class2のインスタンスcを作り、そのOutputメソッドを呼び出す。Class2クラスのOutputメソッドが呼び出される。ここでは「こんにちは こんにちは」と表示される
Class2の親であるClass1にもOutputメソッドがあるがOverridableと書いてオーバーライドを許可している。Class2クラスではOverridesと書いてオーバーライドすることを示している。
Class2の外部からClass1のOutputを呼び出すことはできない。
でも、Class2の内部からであれば、
MyBase.Output()
と記述することによって、親クラスのOutputメソッドを呼び出せる。
Module Module1
Sub Main()
Dim c As New Class2()
c.Output()
End Sub
End Module
Class Class1
Protected S As String = "こんにちは"
Public Overridable Sub Output()
Console.WriteLine(S)
End Sub
End Class
Class Class2
Inherits Class1
Public Overrides Sub Output()
Console.Write(S)
Console.WriteLine(S)
End Sub
End Class
Class2のインスタンスcを作り、そのOutputメソッドを呼び出す。Class2クラスのOutputメソッドが呼び出される。ここでは「こんにちは こんにちは」と表示される
Class2の親であるClass1にもOutputメソッドがあるがOverridableと書いてオーバーライドを許可している。Class2クラスではOverridesと書いてオーバーライドすることを示している。
Class2の外部からClass1のOutputを呼び出すことはできない。
でも、Class2の内部からであれば、
MyBase.Output()
と記述することによって、親クラスのOutputメソッドを呼び出せる。
2011年9月15日木曜日
→→→継承
クラスには「継承(inheritance)」という機能がある。
Module Module1
Sub Main()
Dim c As New Class2()
c.Output()
c.Output2()
End Sub
End Module
Class Class1
Protected S As String = "こんにちは"
Public Overridable Sub Output()
Console.WriteLine(S)
End Sub
End Class
Class Class2
Inherits Class1
Public Sub Output2()
Console.Write(S)
Console.WriteLine(S)
End Sub
End Class
Class2クラスのインスタンスcを作り、そのOutputメソッド、Output2メソッドを呼ぶ。
でも、Class2クラスを見ると、Outputメソッドはない。
また、Output2メソッドの中で参照しているSもない。
それらはClass1から継承されている。
継承を行う場合には、Inheritsキーワードを使って継承元を指定する
Module Module1
Sub Main()
Dim c As New Class2()
c.Output()
c.Output2()
End Sub
End Module
Class Class1
Protected S As String = "こんにちは"
Public Overridable Sub Output()
Console.WriteLine(S)
End Sub
End Class
Class Class2
Inherits Class1
Public Sub Output2()
Console.Write(S)
Console.WriteLine(S)
End Sub
End Class
Class2クラスのインスタンスcを作り、そのOutputメソッド、Output2メソッドを呼ぶ。
でも、Class2クラスを見ると、Outputメソッドはない。
また、Output2メソッドの中で参照しているSもない。
それらはClass1から継承されている。
継承を行う場合には、Inheritsキーワードを使って継承元を指定する
→→→メソッドのオーバーロード
現在のVisula Basic や C# では同じ名前を持つメソッドを複数作れる。
それをオーバーロード(overload)という。
Module Module1
Sub Main()
Dim c As New Class1()
c.Output()
c.Output("こんばんは")
End Sub
End Module
Class Class1
Private S As String = "こんにちは"
Public Sub Output()
Console.WriteLine(S)
End Sub
Public Sub Output( s As String )
Console.WriteLine(s)
End Sub
End Class
パラメータなしのOutput
文字列のパラメータを一つ持つOutput
が記述されている
呼び出し元の形で使い分ける
別のオーバーロードとするためには、パラメータの個数と型が一致しないようにする。
Newコンストラクタも、オーバーロードを利用できる。
例えば、「Sub New()」と「Sub New(s as String)」を並存させることが可能。
それをオーバーロード(overload)という。
Module Module1
Sub Main()
Dim c As New Class1()
c.Output()
c.Output("こんばんは")
End Sub
End Module
Class Class1
Private S As String = "こんにちは"
Public Sub Output()
Console.WriteLine(S)
End Sub
Public Sub Output( s As String )
Console.WriteLine(s)
End Sub
End Class
パラメータなしのOutput
文字列のパラメータを一つ持つOutput
が記述されている
呼び出し元の形で使い分ける
別のオーバーロードとするためには、パラメータの個数と型が一致しないようにする。
Newコンストラクタも、オーバーロードを利用できる。
例えば、「Sub New()」と「Sub New(s as String)」を並存させることが可能。
→→→インスタンス生成時に呼び出される「コンストラクタ」
インスタンス生成時に呼び出されるコンストラクタは、インスタンスの初期化を行うのに便利。
●Newコンストラクタの利用例
Module Module1
Sub Main()
Dim c As New Class1()
c.S = "こんにちは"
c.Output()
End Sub
End Module
Class Class1
Public S As String
Public Sub New()
Console.WriteLine("コンストラクタが呼ばれた")
End Sub
Public Sub Output()
Console.WriteLine(S)
End Sub
End Class
●Newコンストラクタにパラメータを持たせた利用例
Module Module1
Sub Main()
Dim c As New Class1("こんにちは")
c.Output()
End Sub
End Module
Class Class1
Public S As String
Public Sub New(s As String)
Me.S = s
End Sub
Public Sub Output()
Console.WriteLine(S)
End Sub
End Class
●Newコンストラクタの利用例
Module Module1
Sub Main()
Dim c As New Class1()
c.S = "こんにちは"
c.Output()
End Sub
End Module
Class Class1
Public S As String
Public Sub New()
Console.WriteLine("コンストラクタが呼ばれた")
End Sub
Public Sub Output()
Console.WriteLine(S)
End Sub
End Class
●Newコンストラクタにパラメータを持たせた利用例
Module Module1
Sub Main()
Dim c As New Class1("こんにちは")
c.Output()
End Sub
End Module
Class Class1
Public S As String
Public Sub New(s As String)
Me.S = s
End Sub
Public Sub Output()
Console.WriteLine(S)
End Sub
End Class
→→→静的メンバー(共有メンバー)
インスタンス化なしでクラスの機能を使うためには、Sharedを追加して、共有メンバーする。
Module Module1
Sub Main()
Class1.S = "こんにちは"
Class1.Output()
End Sub
End Module
Class Class1
Public Shared S As String
Public Shared Sub Output()
Console.WriteLine(S)
End Sub
End Class
Module Module1
Sub Main()
Class1.S = "こんにちは"
Class1.Output()
End Sub
End Module
Class Class1
Public Shared S As String
Public Shared Sub Output()
Console.WriteLine(S)
End Sub
End Class
→→→クラス
クラス(Class)はオブジェクト指向プログラミングの中心となる要素である。クラスにはメンバー変数とメソッドを格納できる。
メンバー変数にはデータを入れることができ、メソッドは処理を記述したものを入れる
データと処理が一つになっているのがポイント。
Module Module1
Sub Main()
Dim c As New Class1()
c.S = "こんにちは"
c.output()
End Sub
End Module
Class Class1
Public S As String
Public Sub Output()
console.WriteLine(S)
End Sub
End Class
Class1がClass1クラスで、文字列型のメソッド変数S、Outputメソッドである。
起動時に呼び出されるMainプロシジャでは
Dim c As New Class1()
でClass1クラスのインスタンスを作り、それを「c」という名前で参照できるようにしている。
ここは、
Dim c As Class1 = New Class1()
と書くこともできる。
c.sでcのsに「こんにちは」を代入している。cのOutputメソッドを呼び出すと「こんにちは」が出力される。
クラスは「インスタンス化」してから使うのが基本である。インスタンスは日本語では「実体」。インスタンスを「オブジェクト」と呼ぶこともある。
クラスのメンバーには、アクセス修飾子を用いることができる。赤文字のPublicが、Publicはクラスの外部からこのメンバーへのアクセスを許可する。「Private」と指定すると、外部からアクセスできなくなる。
一つのクラスから複数のインスタンスを生成できる。
Sub Main()
Dim c As New Class1()
c.S = "こんにちは"
c.Output()
Dim d As New Class1()
d.S = "こんばんは"
d.Output()
End Sub
Class1クラスのインスタンスを二つ生成し、それぞれを「c」「d」という名前で参照している。
メンバー変数にはデータを入れることができ、メソッドは処理を記述したものを入れる
データと処理が一つになっているのがポイント。
Module Module1
Sub Main()
Dim c As New Class1()
c.S = "こんにちは"
c.output()
End Sub
End Module
Class Class1
Public S As String
Public Sub Output()
console.WriteLine(S)
End Sub
End Class
Class1がClass1クラスで、文字列型のメソッド変数S、Outputメソッドである。
起動時に呼び出されるMainプロシジャでは
Dim c As New Class1()
でClass1クラスのインスタンスを作り、それを「c」という名前で参照できるようにしている。
ここは、
Dim c As Class1 = New Class1()
と書くこともできる。
c.sでcのsに「こんにちは」を代入している。cのOutputメソッドを呼び出すと「こんにちは」が出力される。
クラスは「インスタンス化」してから使うのが基本である。インスタンスは日本語では「実体」。インスタンスを「オブジェクト」と呼ぶこともある。
クラスのメンバーには、アクセス修飾子を用いることができる。赤文字のPublicが、Publicはクラスの外部からこのメンバーへのアクセスを許可する。「Private」と指定すると、外部からアクセスできなくなる。
一つのクラスから複数のインスタンスを生成できる。
Sub Main()
Dim c As New Class1()
c.S = "こんにちは"
c.Output()
Dim d As New Class1()
d.S = "こんばんは"
d.Output()
End Sub
Class1クラスのインスタンスを二つ生成し、それぞれを「c」「d」という名前で参照している。
→→→値の読み書きが処理につながる「プロパティ」
Propertyの例
Module Module1
Dim MessageValue As String
Property Message As String
Get
console.WriteLine("MessageがGetされました")
Return MessageValue
End Get
Set(value As String)
MessageValue = value
Console.WriteLine("MessageがSetされました。値は「" & value &"」です")
End Set
End Property
Sub Main()
Message = "こんにちは!"
Console.WriteLine(Message)
End Sub
End Module
Messageという名前の文字列型プロパティがあり、その裏側で値を保持するMessageValue変数を用意している。
MessageValue変数をMessageプロパティを通じて利用する。
コード⇔Messageプロパティ⇔MessageValue変数
MessageプロパティはGetプロシジャとSetプロシジヤを持っている。Message値が読み出されたときにはGetプロシジャが呼び出され、書き込まれた時にはSetプロシジャが、呼び出される。
利用する側からは、プロパティは変数と同様に見える。
Module Module1
Dim MessageValue As String
Property Message As String
Get
console.WriteLine("MessageがGetされました")
Return MessageValue
End Get
Set(value As String)
MessageValue = value
Console.WriteLine("MessageがSetされました。値は「" & value &"」です")
End Set
End Property
Sub Main()
Message = "こんにちは!"
Console.WriteLine(Message)
End Sub
End Module
Messageという名前の文字列型プロパティがあり、その裏側で値を保持するMessageValue変数を用意している。
MessageValue変数をMessageプロパティを通じて利用する。
コード⇔Messageプロパティ⇔MessageValue変数
MessageプロパティはGetプロシジャとSetプロシジヤを持っている。Message値が読み出されたときにはGetプロシジャが呼び出され、書き込まれた時にはSetプロシジャが、呼び出される。
利用する側からは、プロパティは変数と同様に見える。
トランザクション ログの肥大化
SQL Server 2008 R2ではデフォルトでは、トランザクションログは、ハードディスクの空き領域がなくなるまで、またはファイルサイズが最大になるまで、どんどん肥大化していく。
ログの肥大化を防止するには、ログを定期的にバックアップするしかない。
バックアップを実行すると、トランザクションログの使用済み領域を切り捨てることができる。
ログのバックアップにより使用済み領域を解放して、空き領域へ変換してくれるので、その領域が再利用できるようになる。
しかし、ログの切り捨ては、再利用可能な領域を作るだけで、ファイルサイズを縮小するわけではない。
しかし、大きく肥大化したファイルの場合は縮小したい場合がある。
この場合は DBCC SHRINKFILE コマンドを実行する
DBCC SHRINKFILE(論理名, 縮小後のサイズ)
1.まずログの使用量を確認。
DBCC SQLPERF(LOGSPACE) コマンドを使用してLog Size/Log Space Usedを見てみる。
2.FORMATオプションでバックアップを実行。
BACKUP DATABASE ***DB
TO DISK = 'C:\***DB.bak'
WITH FORMAT
3.ログ バックアップの実行
BACKUP LOG ***DB
TO DISK = C:\log1.bak'
4.DBCC SHRINKFILE(log1) を実行
でログファイルは縮小される。
ログの肥大化を防止するには、ログを定期的にバックアップするしかない。
バックアップを実行すると、トランザクションログの使用済み領域を切り捨てることができる。
ログのバックアップにより使用済み領域を解放して、空き領域へ変換してくれるので、その領域が再利用できるようになる。
しかし、ログの切り捨ては、再利用可能な領域を作るだけで、ファイルサイズを縮小するわけではない。
しかし、大きく肥大化したファイルの場合は縮小したい場合がある。
この場合は DBCC SHRINKFILE コマンドを実行する
DBCC SHRINKFILE(論理名, 縮小後のサイズ)
1.まずログの使用量を確認。
DBCC SQLPERF(LOGSPACE) コマンドを使用してLog Size/Log Space Usedを見てみる。
2.FORMATオプションでバックアップを実行。
BACKUP DATABASE ***DB
TO DISK = 'C:\***DB.bak'
WITH FORMAT
3.ログ バックアップの実行
BACKUP LOG ***DB
TO DISK = C:\log1.bak'
4.DBCC SHRINKFILE(log1) を実行
でログファイルは縮小される。
2011年9月14日水曜日
→→→整数には下限と上限がある
整数型の変数には、値の上限と下限がある。どんな数字をいれてもよいわけではない。
Dim i As Integer = Integer.MaxValue
MsgBox(i)
MsgBox(i + 1)
整数型変数iに整数型の上限値を入れて初期化。出力は21億4748万3647が整数の上限値である。
このiに1を加えたものを出力はできない。OverflowExceptinが生じる
整数値は、マイナス21億4748万3648~21億4748万3647の値を格納できる。それ以外の値を格納しようとするとオーバーフローとなる。
この範囲が狭い場合は、正の数だけでよいから上限を大きくしたい場合は符号なし整数型であるUIntegerを使えばゼロ~42億9496万7295の値まで格納できる。長整数型(Long)を使うのもいい。
Integerが4バイトであるのに対してLongは8バイトでマイナス922京3372兆368億5477万5808~922京3372兆368億5477万5807までを格納できる。符号なしの長整数型であるULongはゼロ~1844京6744兆737億955万1615を格納できる
2011年9月12日月曜日
→→→ToStringメソッド/Parseメソッド
数値から文字列に変換する処理は、自動的に行われることも少なくはないが、ただ、自動ではうまくいかないときもある。その一つの例は
Dim i As Integer = 1
MsgBox("iは" + i )
「iは1」というダイアログを出してくれそうに思えるが実際はエラーメッセージが出て停止してしまう。
文字列「iは」をDouble型に変換しようとして、InvalidCastExceptionが生じてしまう。
解決策は
MsgBox("iは" + i.ToString())
とすることである。数値を文字列に変換する方法はいくつかあるが、ここではInt32構造体のToStringメソッドを使って、iが格納する数値を文字列型な変換している。現在のVisualBasicとC#では、基本的なデータ型であっても、色々なメソッドを呼び出せるようになっている。文字列に変換するToStringメソッドは、多くの構造体クラスが持っている。Visual Basicの場合、+演算子を変更してエラーを回避することもできる。
MsgBox("iは" & i )
とすればよい。+演算子は加算と文字列連結の両方に用いられるので、文字列連結をはっきり示すには&演算子を使うほうがいい。
数値を文字列に変換するとは逆に、文字列を数値に変換する時に使えるのがParseメソッド
Dim s As String = "123"
Dim t As String = "456"
MsgBox( s + t )
MsgBox(Integer.Parse(s) + Integer.Parse(t))
最初のメッセージでは「123」「456」を連結して「123456」と出力するが、
次のメッセージでは123を数値にしたものと456を数値にしたものを足し合わせ「579」を出力する。
Int32のParseメソッドは4種類のオーバーロードを持っているので、他にも多くの構造体やクラスが文字列からデータを受け取るParseメソッドを備えている。
Dim i As Integer = 1
MsgBox("iは" + i )
「iは1」というダイアログを出してくれそうに思えるが実際はエラーメッセージが出て停止してしまう。
文字列「iは」をDouble型に変換しようとして、InvalidCastExceptionが生じてしまう。
解決策は
MsgBox("iは" + i.ToString())
とすることである。数値を文字列に変換する方法はいくつかあるが、ここではInt32構造体のToStringメソッドを使って、iが格納する数値を文字列型な変換している。現在のVisualBasicとC#では、基本的なデータ型であっても、色々なメソッドを呼び出せるようになっている。文字列に変換するToStringメソッドは、多くの構造体クラスが持っている。Visual Basicの場合、+演算子を変更してエラーを回避することもできる。
MsgBox("iは" & i )
とすればよい。+演算子は加算と文字列連結の両方に用いられるので、文字列連結をはっきり示すには&演算子を使うほうがいい。
数値を文字列に変換するとは逆に、文字列を数値に変換する時に使えるのがParseメソッド
Dim s As String = "123"
Dim t As String = "456"
MsgBox( s + t )
MsgBox(Integer.Parse(s) + Integer.Parse(t))
最初のメッセージでは「123」「456」を連結して「123456」と出力するが、
次のメッセージでは123を数値にしたものと456を数値にしたものを足し合わせ「579」を出力する。
Int32のParseメソッドは4種類のオーバーロードを持っているので、他にも多くの構造体やクラスが文字列からデータを受け取るParseメソッドを備えている。
→→→文字列を格納する文字列型
String型:Visual BasicやC#の文字列型は可変長で、最大で約20億(2の31乗)個のUnicode文字を格納できる。ただ実際に20億個の文字を格納すると約4Gバイトのメモリーを使ってしまうので、実用上の限度はもっと下にあると考える。
Visual Basic やC#の内部の文字コードセットはUnicodeである。ただファイルに保存したり通信をする際には文字コードセットとエンコーディングに注意する必要がある。
<シフトJISのsjis.txt、UTF-8のutf8.txt、UFT-16のutf19.txtを作るコード>
Dim path As String = "C:\test\"
Dim s As String = "ABC123ABC123あいう"
System.IO.File.WriteAllText(path & "sjis.txt", s , System.Text.Encoding.GetEncoding("Shift_JIS"))
System.IO.File.WriteAllText(path & "utf8.txt", s ,System.Text.Encoding.UTF8)
System.IO.File.WriteAllText(path & "utf16.txt", s ,System.Text.Encoding.Unicode)
文字列型変数の既定値は、何も入っていない文字列("")ではなく、Nothing(どこにも関連付けられていない) であることに注意が必要である。
Dim s As String = ""
と初期化して使うべき時もある。
Visual Basic やC#の内部の文字コードセットはUnicodeである。ただファイルに保存したり通信をする際には文字コードセットとエンコーディングに注意する必要がある。
<シフトJISのsjis.txt、UTF-8のutf8.txt、UFT-16のutf19.txtを作るコード>
Dim path As String = "C:\test\"
Dim s As String = "ABC123ABC123あいう"
System.IO.File.WriteAllText(path & "sjis.txt", s , System.Text.Encoding.GetEncoding("Shift_JIS"))
System.IO.File.WriteAllText(path & "utf8.txt", s ,System.Text.Encoding.UTF8)
System.IO.File.WriteAllText(path & "utf16.txt", s ,System.Text.Encoding.Unicode)
文字列型変数の既定値は、何も入っていない文字列("")ではなく、Nothing(どこにも関連付けられていない) であることに注意が必要である。
Dim s As String = ""
と初期化して使うべき時もある。
2011年8月5日金曜日
2011年8月3日水曜日
2011年8月2日火曜日
2011年7月29日金曜日
2011年7月28日木曜日
→→→正規検索
Dim r As New Regex("<p>(.*?),/p.")
Dim m As Match = r.Match( source )
while m.success
m = m.NextMatch()
End while
----------------------------------------------
Dim r As RegEx
Dim m As Match
r = New RegEx( パターン文字列 )
m = r.Match( 検索対象の文字列 )
while m.success
m = m.NextMatch() '見つかった文字列に対する処理
End while
Dim m As Match = r.Match( source )
while m.success
m = m.NextMatch()
End while
----------------------------------------------
Dim r As RegEx
Dim m As Match
r = New RegEx( パターン文字列 )
m = r.Match( 検索対象の文字列 )
while m.success
m = m.NextMatch() '見つかった文字列に対する処理
End while
123abc1456abc
↓
(23a) (456a)だけを抜く
Dim i As Integer
Dim r As New Regex(" 1(.*?)bc1(.*?)b" )
Dim m As Match( "123abc1456abc" )
While Not ( m.Group(i).Value = "" )
MsgBox( m.Group(i).Value, , i )
i += 1
End While
-----------------------------------------
Dim results(20) As String
Dim i As Integer
Dim j As New Regex( "<.*?""(.*?)"".*?>" )
Dim m As Match
m = r.Match( " <tr></tr><a href=""/news/****/.html""abcdwxyz</tr>\n<tr/>")
While not (m.Group(i).Value = "")
results(i) = m.Groups(i).Value
MsgBox(results(i), , i)
End While
-----------------------------------------
位置を見つける(発見位置が2番目なのに1番目となるから注意)
Dim text1 As String = "テ"
Dim text2 As String = "イクテス"
Dim r As New System.Text.RegularExpressions.Regex(text1)
Dim m As System.Text.RegularExpressions.Match = r.Match( text2 )
If m.Success Then
MsgBox("Found match at position "& m.Index.ToString())
End If
→→→OleDbCommandクラスについて
データソースに対して実行するSQLステートメント・ストアドプロシージャを表す
■OleDbCommandのインスタンスを作成すると
読み書き可能なプロパティが初期値に設定されます
実行するためのメソッド
1.ExecuteReader ------> 行を返すコマンド
2.ExecuteNonQuery ----> SqlのINSERT,DELETE,UPDATE,SETステートメントなどのコマンドを実行
3.ExecuteScalar -------> データベースから単一の値(集計値)を取得する
1.
例 OleDbCommandをOleDbDataAdapterおよびOleDbConnectionと共に使用して
Accessデータベースから行を選択する
Public Sub ReadMyData( ByVal ConnectionString As String)
Dim queryString As String = "SELECT OrderID,CustomID FROM orders"
Using connection As New OleDbConnection( ConnectionString )
Dim command As New OleDbCommand( queryString, connection )
connection.Open()
Dim reader As OleDbDataReader = command.ExexuteReader()
Whlie reader.Read()
..................................................
End While
reader.Close()
End Using
End Sub
2.
OleDbCommand.ExecuteNonQueryメソッド
Dim instance As OleDbCommand
Dim returnValue As Integer
returnValue = instance.ExecuteNonQuery()
ExecuteNonQueryではカタログ操作を実行できる。(データベース構造の照会、オブジェクトの作成)
また、DataSetを使用せずにUpdate,Insert,Deleteステートメントを実行してデータベース内の
データを変更することもできる
例
Private Sub CreateOleDbCommand(ByVal queryString As String,
ByVal connectionString As String)
Using connection As New OleDbConnection( ConnectionString )
connection.Open()
Dim command As New OleDbCommand(queryString, connection )
command.ExecuteNonQuery()
End Using
End Sub
■OleDbCommandのインスタンスを作成すると
読み書き可能なプロパティが初期値に設定されます
実行するためのメソッド
1.ExecuteReader ------> 行を返すコマンド
2.ExecuteNonQuery ----> SqlのINSERT,DELETE,UPDATE,SETステートメントなどのコマンドを実行
3.ExecuteScalar -------> データベースから単一の値(集計値)を取得する
1.
例 OleDbCommandをOleDbDataAdapterおよびOleDbConnectionと共に使用して
Accessデータベースから行を選択する
Public Sub ReadMyData( ByVal ConnectionString As String)
Dim queryString As String = "SELECT OrderID,CustomID FROM orders"
Using connection As New OleDbConnection( ConnectionString )
Dim command As New OleDbCommand( queryString, connection )
connection.Open()
Dim reader As OleDbDataReader = command.ExexuteReader()
Whlie reader.Read()
..................................................
End While
reader.Close()
End Using
End Sub
2.
OleDbCommand.ExecuteNonQueryメソッド
Dim instance As OleDbCommand
Dim returnValue As Integer
returnValue = instance.ExecuteNonQuery()
ExecuteNonQueryではカタログ操作を実行できる。(データベース構造の照会、オブジェクトの作成)
また、DataSetを使用せずにUpdate,Insert,Deleteステートメントを実行してデータベース内の
データを変更することもできる
例
Private Sub CreateOleDbCommand(ByVal queryString As String,
ByVal connectionString As String)
Using connection As New OleDbConnection( ConnectionString )
connection.Open()
Dim command As New OleDbCommand(queryString, connection )
command.ExecuteNonQuery()
End Using
End Sub
3.
OleDbCommand.ExecuteScalarメソッド
クエリを実行し、そのクエリが返す結果セットの最初の行にある
最初の列を返します。残りの列または行は無視されます
Public Sub CreateMyOleDbCommand(queryString As String,connection As OleDbconnection)
Dim command As New OleDbCommand ( queryString , connection )
command.connection.open()
command.ExecuteScalar()
connection.close
End Sub
→→→VBテキスト読み込み
Dim sCom As SqlCilent.SqlCommand
Dim sCn As SqlCilent.SqlConnection = New SqlCilent.SqlConnection()
scn.ConnectionString = "Data Source=.\SQLEXPRESS; AttachDbFileName = " &
& My.Application.Info.DirectoryPath &
"****.mdf; Integrated Security=True; Connect TimeOut=30;
User Instance = True"
Try
sCn.Open()
sCom = New SqlCilent.SqlCommand
("BULK INSERT 読込 FROM 'C:\テキスト.txt' WITH (Fieldterminator = ',' ,
rowterminator = '\n' )" , sCn)
sCom.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show( ex.Message )
End Try
sCn.Close()
Dim sCn As SqlCilent.SqlConnection = New SqlCilent.SqlConnection()
scn.ConnectionString = "Data Source=.\SQLEXPRESS; AttachDbFileName = " &
& My.Application.Info.DirectoryPath &
"****.mdf; Integrated Security=True; Connect TimeOut=30;
User Instance = True"
Try
sCn.Open()
sCom = New SqlCilent.SqlCommand
("BULK INSERT 読込 FROM 'C:\テキスト.txt' WITH (Fieldterminator = ',' ,
rowterminator = '\n' )" , sCn)
sCom.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show( ex.Message )
End Try
sCn.Close()
→→→VB2005Express SQLExpress 接続
Dim sCom As SqlClient.SqlCommandBuilder
Dim dSet As DataSet = New DataSet()
Dim dAdp As SqlClient.SqlDataAdapter
Dim scn As SqlClient.SqlConnection = New SqlClient.SqlConnection()
scn.ConnectionString = "Data Source=.\SQLEXPRESS;AttchDbFile name=" &
My.Application.Info.DirectoryPath &
"\***.mdf; Integrated Security = True; Connect TimeOut=30;
User Instance = True"
dAdp = New SqlClient.SqlDataAdapter("SELECT * FROM テーブル" , scn)
dAdp.Fill( dSet, "t_テーブル" )
sCom = New SqlClient.SqlCommandBuilder( dAdp )
For i As Integer = 0 To dSet.Tables("t_テーブル").Rows.Count - 1
dSet.Tables("t_テーブル").Rows(i)("項目") = "代入値"
Next
dAdp.Update( dSet, "t_テーブル")
scn.Close()
-----------------------------------------------------------------------
データセットに取得したレコードの更新をデータベースに反映するには
SqlCommandBuilderオブジェクトを生成してから
SqlDataAdapterオブジェクトのUpdateメソッドを実行する
SqlCommandBuilderオブジェクトの生成はNewキーワードを使い
引数にSqlDataAdapterオブジェクトを指定する
New SqlCilent.SqlCommandBuilder( SqlDataAdapter )
SqlCommandBuilderオブジェクトはデータセットの変更に対応するSQL文を自動的に作成します
データセットのレコード更新はDataRowオブジェクトに、フィールドのインデックスまたは名前を指定し
新たな値を代入します
DataTableオブジェクト.Rows( レコードのインデックス )( フィールドのインデックス/名前 ) = 値
更新後,SqlDataAdapterオブジェクトのUpdateメソッドを実行すると
データセットの変更がデータベースに反映される
Updateメソッドの引数には、DataSetオブジェクトとテーブル名を指定する
SqlDataAdapterオブジェクト.Update( DataSetオブジェクト, テーブル名 )
Dim dSet As DataSet = New DataSet()
Dim dAdp As SqlClient.SqlDataAdapter
Dim scn As SqlClient.SqlConnection = New SqlClient.SqlConnection()
scn.ConnectionString = "Data Source=.\SQLEXPRESS;AttchDbFile name=" &
My.Application.Info.DirectoryPath &
"\***.mdf; Integrated Security = True; Connect TimeOut=30;
User Instance = True"
dAdp = New SqlClient.SqlDataAdapter("SELECT * FROM テーブル" , scn)
dAdp.Fill( dSet, "t_テーブル" )
sCom = New SqlClient.SqlCommandBuilder( dAdp )
For i As Integer = 0 To dSet.Tables("t_テーブル").Rows.Count - 1
dSet.Tables("t_テーブル").Rows(i)("項目") = "代入値"
Next
dAdp.Update( dSet, "t_テーブル")
scn.Close()
-----------------------------------------------------------------------
データセットに取得したレコードの更新をデータベースに反映するには
SqlCommandBuilderオブジェクトを生成してから
SqlDataAdapterオブジェクトのUpdateメソッドを実行する
SqlCommandBuilderオブジェクトの生成はNewキーワードを使い
引数にSqlDataAdapterオブジェクトを指定する
New SqlCilent.SqlCommandBuilder( SqlDataAdapter )
SqlCommandBuilderオブジェクトはデータセットの変更に対応するSQL文を自動的に作成します
データセットのレコード更新はDataRowオブジェクトに、フィールドのインデックスまたは名前を指定し
新たな値を代入します
DataTableオブジェクト.Rows( レコードのインデックス )( フィールドのインデックス/名前 ) = 値
更新後,SqlDataAdapterオブジェクトのUpdateメソッドを実行すると
データセットの変更がデータベースに反映される
Updateメソッドの引数には、DataSetオブジェクトとテーブル名を指定する
SqlDataAdapterオブジェクト.Update( DataSetオブジェクト, テーブル名 )
2011年7月27日水曜日
→→→VB.NET ACCESS97との接続
Dim cCom As OleDbCommandBuilder
Dim dSet As DataSet = New DataSet()
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection()
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
DataSource=D:\***.mdb;Persist Security Info=False"
dAdp = New OleDbDataAdapter("SELECT * FROM テーブル", ocn)
dAdp.Fill( dSet , "t" )
Dim i As Integer
For i = 0 To 999
dSet.Tables("t").Rows(i)("列名") = dSet.Tables("t").Rows(i)("列名") & " 様"
Next
cCom = New OleDbCommandBuilder(dAdp)
dAdp.Update( dSet , "t" )
Dim dSet As DataSet = New DataSet()
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection()
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
DataSource=D:\***.mdb;Persist Security Info=False"
dAdp = New OleDbDataAdapter("SELECT * FROM テーブル", ocn)
dAdp.Fill( dSet , "t" )
Dim i As Integer
For i = 0 To 999
dSet.Tables("t").Rows(i)("列名") = dSet.Tables("t").Rows(i)("列名") & " 様"
Next
cCom = New OleDbCommandBuilder(dAdp)
dAdp.Update( dSet , "t" )
→→→SQL命令のサンプル
SELECT 住所, 住所 & ' 町' FROM テーブル
SELECT 住所, Right(住所, 2) FROM テーブル
SELECT 住所, Len(住所) FROM テーブル
SELECT TOP10 * FROM テーブル
SELECT TOP10 PERCENT * FROM テーブル
SELECT * FROM テーブル WHERE ID<= 50
SELECT * FROM テーブル WHERE 住所 = '北海道'
SELECT * FROM テーブル WHERE カナ住所 LIKE 'ホ%'
SELECT * FROM テーブル WHERE カナ住所 LIKE '[カ-コ]%'
SELECT * FROM テーブル WHERE LEN(住所) = 4
SELECT * FROM テーブル WHERE ID>=5 AND ID<=19
SELECT * FROM テーブル WHERE ID BETWEEN 5 AND 19
SELECT 住所, Right(住所, 2) FROM テーブル
SELECT 住所, Len(住所) FROM テーブル
SELECT TOP10 * FROM テーブル
SELECT TOP10 PERCENT * FROM テーブル
SELECT * FROM テーブル WHERE ID<= 50
SELECT * FROM テーブル WHERE 住所 = '北海道'
SELECT * FROM テーブル WHERE カナ住所 LIKE 'ホ%'
SELECT * FROM テーブル WHERE カナ住所 LIKE '[カ-コ]%'
SELECT * FROM テーブル WHERE LEN(住所) = 4
SELECT * FROM テーブル WHERE ID>=5 AND ID<=19
SELECT * FROM テーブル WHERE ID BETWEEN 5 AND 19
→→→VB2008 ACCESS2007との接続
Imports System.Data.OleDb
Dim cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\**.accdb)
Dim SQLcm As OleDbCommand = cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLcm)
Dim Table As New DataTable
'SQL命令
Adapter.Fill( Table )
'データグリッドに表示
DataGridView1.DataSource = Table
Table.Dispose()
Adapter.Dispose()
SQLcm.Dispose()
cn.Dispose()
Dim cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\**.accdb)
Dim SQLcm As OleDbCommand = cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLcm)
Dim Table As New DataTable
'SQL命令
Adapter.Fill( Table )
'データグリッドに表示
DataGridView1.DataSource = Table
Table.Dispose()
Adapter.Dispose()
SQLcm.Dispose()
cn.Dispose()
→→→VB2005 ACCESSとの接続
Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=D:\**.mdb")
Dim SQLcm As OleDbCommand = cn.CreateCommand
Dim Adapter As New OleDbAdapter(SQLcm)
Dim Table As New DataTable
SQLcm.CommandText = "SELECT * FROM テーブル"
Adapter.Fill(Table)
'データグリッドにデータを表示する
DataGridView1.DataSource = Table
Table.Dispose()
Adapter.Dispose()
SQLcm.Dispose()
cn.Dispose()
--------------------------------------------------------------
'Tableの内容をテキストにして書き出す
Dim Writer As New IO.StreamWriter("D:\Data.csv")
Dim LineText As String
For Each Row As DataRow In Table.Rows
LineText = ""
For i As Integer = 0 To Table.Columns.Count - 1
If Len(LineText) > 0 Then
LineText &= ","
End If
LineText &= Row(i)
Next
Writer.WriteLine(LineText)
Next
Writer.Close()
Writer.Dispose()
---------------------------
'S-JIS
Dim Writer As New IO.StreanWriter
("C:\*****.csv", False, System.Text.EncodingGetEncoding("Shift-Jis"))
-------------------------------------------------------
Dim SQLcm As OleDbCommand = cn.CreateCommand
Dim Adapter As New OleDbAdapter(SQLcm)
Dim Table As New DataTable
SQLcm.CommandText = "SELECT * FROM テーブル"
Adapter.Fill(Table)
'データグリッドにデータを表示する
DataGridView1.DataSource = Table
Table.Dispose()
Adapter.Dispose()
SQLcm.Dispose()
cn.Dispose()
--------------------------------------------------------------
'Tableの内容をテキストにして書き出す
Dim Writer As New IO.StreamWriter("D:\Data.csv")
Dim LineText As String
For Each Row As DataRow In Table.Rows
LineText = ""
For i As Integer = 0 To Table.Columns.Count - 1
If Len(LineText) > 0 Then
LineText &= ","
End If
LineText &= Row(i)
Next
Writer.WriteLine(LineText)
Next
Writer.Close()
Writer.Dispose()
---------------------------
'S-JIS
Dim Writer As New IO.StreanWriter
("C:\*****.csv", False, System.Text.EncodingGetEncoding("Shift-Jis"))
-------------------------------------------------------
Dim cCom As OleDbCommandBuilder
Dim dSet As DataSet = New DataSet()
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;
DataSource=D:\***.mdb;Persist Security Info=False")
dAdp = New OleDbDataAdapter("SELECT * FROM テーブル", ocn)
dAdp.Fill( dSet , "t_テーブル" )
cCom = New OleDbCommandBuilder(dAdp)
Dim i As Integer
For i = 0 To 999 (----> dSet.Tables("t_テーブル").Rows.Count - 1)
dSet.Tables("t_テーブル").Rows(i)("列名") = "代入物"
Next
dAdp.Update( dSet, "t_テーブル")
dAdp.Update( dSet , "t" )
→→→前回のフォームの位置をおぼえて、再度開いた時同じ位置にする
フォームプロパティを保存
Form1→「プロパティ」ウィンドウの上の方にある
(PropertyBinding)の欄の[.....]ボタンをクリック
↓
[...]ボタンをクリックするとダイアログボックスが表示される
プロパティの一覧の中から「Location」を探し右側の下矢印ボタンをクリックする
↓
ここで「新規」を選べば設定項目との対応付けができる
↓
Nameのところに「Pos」と入力
↓
これでウィンドウの位置を保存するための設定ができる
Form1→「プロパティ」ウィンドウの上の方にある
(PropertyBinding)の欄の[.....]ボタンをクリック
↓
[...]ボタンをクリックするとダイアログボックスが表示される
プロパティの一覧の中から「Location」を探し右側の下矢印ボタンをクリックする
↓
ここで「新規」を選べば設定項目との対応付けができる
↓
Nameのところに「Pos」と入力
↓
これでウィンドウの位置を保存するための設定ができる
2011年7月26日火曜日
→→→ListBoxに表示された列をダブルクリックで実行させる
TextBoxとListBoxを貼り付け
TextBoxに検索する文字列を入力
↓
指定したフォルダから一致するファイルを検索し一致したらListBoxに表示
↓
ListBoxら表示された列をダブルクリックすると実行する
Imports System.IO
Dim Folder As New DirectoryInfo("C:\USER\Documents")
Private Sub TextBox1_TextChanged(...
ListBox1.Items.Clear()
If TextBox1.Text.Length = 0 Then
Return
End If
Dim File As FileInfo
ListBox1.BeginUpdate()
For Each File In Folder.GetFiles( TextBox1.Text & "*" )
ListBox1.Items.Add( File.FullName )
Next
ListBox1.EndUpdate()
End Sub
Private Sub ListBox_DoubleClick( ....
On Error Resume Next
Process.Start( ListBox1.SelectedItem )
End Sub
→→→メール送信ひながた
Imports System.Net
Imports System.Net.Mail
Public Class Form1
Private Sub Button1_Click( ・・・
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(50220)
Try
Dim message As New System.Net.MailMessage("****@**.**.ne.jp" , "***@***.ne.jp" )
message.SubjectEncoding = enc
message.BodyEncoding = enc
message.Subject = Me.txtSubject.Text
message.Body = Me.txtBody.Text
Dim Client As New System.Net.Mail.SmptClient("mail.***.***.ne.jp")
Client.Credentials = New NetWorkCredential("ユーザー名","パスワード")
Client.Send(message)
txtForm.Clear()
txtTo.Clear()
txtSubject.Clear()
txtBody.Clear()
messageBox.Show("メールを送信しました","送信終了")
Catch ex As Exception
messageBox.Show("送信できませんでした","エラー")
End Try
Me.Close()
End Sub
End Class
Imports System.Net.Mail
Public Class Form1
Private Sub Button1_Click( ・・・
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(50220)
Try
Dim message As New System.Net.MailMessage("****@**.**.ne.jp" , "***@***.ne.jp" )
message.SubjectEncoding = enc
message.BodyEncoding = enc
message.Subject = Me.txtSubject.Text
message.Body = Me.txtBody.Text
Dim Client As New System.Net.Mail.SmptClient("mail.***.***.ne.jp")
Client.Credentials = New NetWorkCredential("ユーザー名","パスワード")
Client.Send(message)
txtForm.Clear()
txtTo.Clear()
txtSubject.Clear()
txtBody.Clear()
messageBox.Show("メールを送信しました","送信終了")
Catch ex As Exception
messageBox.Show("送信できませんでした","エラー")
End Try
Me.Close()
End Sub
End Class
→→→VB2005データベースの作成
1.[プロジェクト]→[新しい項目の追加]
2.SQLデータベースを選択
3.ファイル名決定
4.追加
5."データソース構成ウィザード"が表示
6.キャンセル
7.テーブル作成
7-1[表示]→[データベースエクスプローラ]
7-2データエクスプローラで「***.mdf」を選ぶ
7-3[データ]→[新規]→[テーブル]
7-4テーブルに表を(列作成)作る
7-5テーブルの作成が終わったら[ファイル]→[Tableを保存]→テーブル名を変え保存
7-6すべてを保存→1回終了
8データベースファイルのコピー
8-1データベースファイルをプログラムの出力先ディレクトリーにコピー
8-2ソリューションエクスプローラで「***.mdf」を選び
プロパティウィンドウの「出力ディレクトリーにコピー」を「コピーしない」に設定
8-3VB2005を終了してプロジェクトのフォルダにある「***.mdf」ファイルを
コピーしてプロジェクトのフォルダ→binフォルダ→Debugフォルダに貼り付ける
2.SQLデータベースを選択
3.ファイル名決定
4.追加
5."データソース構成ウィザード"が表示
6.キャンセル
7.テーブル作成
7-1[表示]→[データベースエクスプローラ]
7-2データエクスプローラで「***.mdf」を選ぶ
7-3[データ]→[新規]→[テーブル]
7-4テーブルに表を(列作成)作る
7-5テーブルの作成が終わったら[ファイル]→[Tableを保存]→テーブル名を変え保存
7-6すべてを保存→1回終了
8データベースファイルのコピー
8-1データベースファイルをプログラムの出力先ディレクトリーにコピー
8-2ソリューションエクスプローラで「***.mdf」を選び
プロパティウィンドウの「出力ディレクトリーにコピー」を「コピーしない」に設定
8-3VB2005を終了してプロジェクトのフォルダにある「***.mdf」ファイルを
コピーしてプロジェクトのフォルダ→binフォルダ→Debugフォルダに貼り付ける
2011年7月25日月曜日
→→→入力時の全半角チェック
Imports System
Imports System.Text
Imports.System.RegularExpressions
Private Sub Button1_Click(....
Dim intRet As Integer
Dim dr As DataSet1.入力Row = DataSet11.入力.NewRow()
'5ケタ半角で入力
If Regex.IsMatch( TextBox1.Text , "^[0-9]{5}$" ) Then
Try
TextBox1.Text = TextBox1.Text
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Else
MsgBox("半角5ケタで入力してください")
End If
dr.SEQ = TextBox1.Text
dr.Zip = TextBox2.Text
'全角で入力
intRet = CHK(TextBox3.Text , 0 )
If intRec > 0 Then
MsgBox("全角で入力してください")
Exit Sub
Else
dr.住所 = TextBox3.Text
End If
DataSet11.入力.Rows.Add( dr )
UpdateDatabase()
End Sub
Private Sub Form1_Load( ....
oleDbDataAdapter1.Fill( DataSet11, "入力" )
End Sub
Private Sub UpdateDatabase()
If Not DataSet11.HasChanges() Then Return
oleDbDataAdapter1.Update( DataSet11 )
End Sub
Private Function CHK(ByVal AO As String , ByVal AKA As String) As Long
Dim nagasa As Long
Dim position As Long
Dim moji As String
Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift-JIS")
CHK = 0
nagasa = AO.Length
position = 1
Do
If position > nagasa Then
Exit do
End If
moji = Mid( AO , position , 1 )
If sjisEnc.GetByteCount( moji ) = 1 Then
If AKA = 0 Then
CHK = position
Exit Function
End If
Else
If AKA = 1 Then
CHK = position
Exit Function
End If
End If
position = position + 1
Loop
End Function
----------------------------------------
新規フォームに
TextBox1 = SEQ
TextBox2 = Zip
TextBox3 = 住所
Button1 = 登録
を貼り付け
Imports System.Text
Imports.System.RegularExpressions
Private Sub Button1_Click(....
Dim intRet As Integer
Dim dr As DataSet1.入力Row = DataSet11.入力.NewRow()
'5ケタ半角で入力
If Regex.IsMatch( TextBox1.Text , "^[0-9]{5}$" ) Then
Try
TextBox1.Text = TextBox1.Text
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Else
MsgBox("半角5ケタで入力してください")
End If
dr.SEQ = TextBox1.Text
dr.Zip = TextBox2.Text
'全角で入力
intRet = CHK(TextBox3.Text , 0 )
If intRec > 0 Then
MsgBox("全角で入力してください")
Exit Sub
Else
dr.住所 = TextBox3.Text
End If
DataSet11.入力.Rows.Add( dr )
UpdateDatabase()
End Sub
Private Sub Form1_Load( ....
oleDbDataAdapter1.Fill( DataSet11, "入力" )
End Sub
Private Sub UpdateDatabase()
If Not DataSet11.HasChanges() Then Return
oleDbDataAdapter1.Update( DataSet11 )
End Sub
Private Function CHK(ByVal AO As String , ByVal AKA As String) As Long
Dim nagasa As Long
Dim position As Long
Dim moji As String
Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift-JIS")
CHK = 0
nagasa = AO.Length
position = 1
Do
If position > nagasa Then
Exit do
End If
moji = Mid( AO , position , 1 )
If sjisEnc.GetByteCount( moji ) = 1 Then
If AKA = 0 Then
CHK = position
Exit Function
End If
Else
If AKA = 1 Then
CHK = position
Exit Function
End If
End If
position = position + 1
Loop
End Function
----------------------------------------
新規フォームに
TextBox1 = SEQ
TextBox2 = Zip
TextBox3 = 住所
Button1 = 登録
を貼り付け
2011年7月23日土曜日
→→→イベントとプロシージャを動的に結びつける
状況に応じて動的に結びつけるには{AddHandlerステートメント・RemoveHandlerステートメント}を使う
(1)例えば MyClickプロシージャとButton2のClickイベントを結びつけるには
AddHandler 変数.イベント名 AddressOf イベントの関数
AddHandler Button2.Click , AddressOf MyClick
フォームにButton1,2を貼り付けてから
Private Sub Button1_Click( .... ) Handles Button1.Click
AddHandler Button2.Click , AddressOf MyClick
End Sub
Private Sub MyClick( .... )
MsgBox( sender.name )
End Sub
このプログラムを実行するとはじめButton2をクリックしても何も起きない。
Button1をクリックしてからButton2をクリックすると
MyClickプロシージャが呼び出される
Private Sub Button1_Click( .... ) Handles Button1.Click
MsgBox("はじめ")
RemoveHandler Button1.Click , AddressOf Button1_Click
AddHandler Button1.Click , AddressOf MyClick
End Sub
Private Sub MyClick( .... )
MsgBox("2回目以降")
End Sub
Button1_ClickプロシージャにHandles句があるので、はじめはButton1をクリックするとこのプロシージャ
が呼び出されます。
ところが、このプロシージャの中でRemoveHandlerステートメントが使用されていて、
Button1のClickイベントとButton1_Clickプロシージャの結びつきが削除されてしまう
それで新たにAddHandlerステートメントを利用して
Button1のClickイベントはMyClickプロシージャに結びつけられる
(1)例えば MyClickプロシージャとButton2のClickイベントを結びつけるには
AddHandler 変数.イベント名 AddressOf イベントの関数
AddHandler Button2.Click , AddressOf MyClick
フォームにButton1,2を貼り付けてから
Private Sub Button1_Click( .... ) Handles Button1.Click
AddHandler Button2.Click , AddressOf MyClick
End Sub
Private Sub MyClick( .... )
MsgBox( sender.name )
End Sub
このプログラムを実行するとはじめButton2をクリックしても何も起きない。
Button1をクリックしてからButton2をクリックすると
MyClickプロシージャが呼び出される
Private Sub Button1_Click( .... ) Handles Button1.Click
MsgBox("はじめ")
RemoveHandler Button1.Click , AddressOf Button1_Click
AddHandler Button1.Click , AddressOf MyClick
End Sub
Private Sub MyClick( .... )
MsgBox("2回目以降")
End Sub
Button1_ClickプロシージャにHandles句があるので、はじめはButton1をクリックするとこのプロシージャ
が呼び出されます。
ところが、このプロシージャの中でRemoveHandlerステートメントが使用されていて、
Button1のClickイベントとButton1_Clickプロシージャの結びつきが削除されてしまう
それで新たにAddHandlerステートメントを利用して
Button1のClickイベントはMyClickプロシージャに結びつけられる
→→→KeyPressイベント
このイベントプロシージャの第2引数はKeyPressEventArgs型で入力されたキーに関する情報が
取得できる。
また、このKeyPressEventArgs型のHandledプロパティは読み取りだけでなく設定することもでき、
Trueを設定した場合はキーボードからの入力もキャンセルすることができる。
(例)テキストボックスに数字以外入力できないようにする。
Private Sub TextBox1_KeyPress(ByVal sender As Object ,
ByVal e As System.Windows.Forms.KeyPressEventArgs)
Handles TextBox1.KeyPress
If IsNumeric(e.KeyChar) = False Then
e.Handled = True
End If
End Sub
取得できる。
また、このKeyPressEventArgs型のHandledプロパティは読み取りだけでなく設定することもでき、
Trueを設定した場合はキーボードからの入力もキャンセルすることができる。
(例)テキストボックスに数字以外入力できないようにする。
Private Sub TextBox1_KeyPress(ByVal sender As Object ,
ByVal e As System.Windows.Forms.KeyPressEventArgs)
Handles TextBox1.KeyPress
If IsNumeric(e.KeyChar) = False Then
e.Handled = True
End If
End Sub
→→→お絵かき
Private Sub PictureBox1_MouseMove(ByVal sender As Object,
ByVal e As System.Windows.Forms.MouseEventArgs)
Handles PictureBox1.MouseMove
Dim g As Graphics = sender.CreateGraphics()
If e.Button = MouseButtons.Left Then
g.FillEllipse( Brushes.Red , e.X , e.Y , 10 , 10)
ElseIf e.Button = MouseButtons.Right Then
g.FillEllipse( Brushes.Blue , e.X , e.Y , 10 , 10)
End If
End Sub
ByVal e As System.Windows.Forms.MouseEventArgs)
Handles PictureBox1.MouseMove
Dim g As Graphics = sender.CreateGraphics()
If e.Button = MouseButtons.Left Then
g.FillEllipse( Brushes.Red , e.X , e.Y , 10 , 10)
ElseIf e.Button = MouseButtons.Right Then
g.FillEllipse( Brushes.Blue , e.X , e.Y , 10 , 10)
End If
End Sub
2011年7月22日金曜日
→→→イベントプロシージャの第2引数の使い方
-----------------------------------------------------------------------------
Private Sub Button1_Click(Byval sender As System.Object,
ByVal e As System.EventArgs)Handles Buttin1.Click
End Sub
-----------------------------------------------------------------------------
1つ目はイベントとプロシージャを結びつけるHandlesキーワードがある
2つ目は引数
イベントプロシージャには必ず2つの引数があり、
第1引数はObject型、第2引数はEventArgs型
この2つの要件を満たしいるものはすべてイベントプロシージャです。
第1引数はイベントを発生させたクラスが渡されています。上記の
Clickイベントプロシージャの場合、第1引数のsenderには
Button1がセットされています。
第2引数はイベントの追加情報が渡されてきます
*イベントプロシージャの使い方
-------------------------------------------------------------------------------
①MouseEnterイベント(マウスがコントロールの上に入ったときに発生)
Private Sub Button1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Button1.MouseEnter
Button1.BackColor = Color.Pink
End Sub
--------------------------------------------------------------------------------
②MouseLeaveイベント(マウスカーソルがコントロール外に離れていったときに発生)
Private Sub Button1_Click(Byval sender As System.Object,
ByVal e As System.EventArgs)Handles Buttin1.Click
End Sub
-----------------------------------------------------------------------------
1つ目はイベントとプロシージャを結びつけるHandlesキーワードがある
2つ目は引数
イベントプロシージャには必ず2つの引数があり、
第1引数はObject型、第2引数はEventArgs型
この2つの要件を満たしいるものはすべてイベントプロシージャです。
第1引数はイベントを発生させたクラスが渡されています。上記の
Clickイベントプロシージャの場合、第1引数のsenderには
Button1がセットされています。
第2引数はイベントの追加情報が渡されてきます
*イベントプロシージャの使い方
-------------------------------------------------------------------------------
①MouseEnterイベント(マウスがコントロールの上に入ったときに発生)
Private Sub Button1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Button1.MouseEnter
Button1.BackColor = Color.Pink
End Sub
--------------------------------------------------------------------------------
②MouseLeaveイベント(マウスカーソルがコントロール外に離れていったときに発生)
Private Sub Button1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Button1.MouseLeave
Button1.BackColor = Color.FromKnownColor(KnownColor.Control)
End Sub
--------------------------------------------------------------------------------
→→→リストボックスにフィールドの値を一覧表示
ListBox1.DataSource = dSet.Tables("t_テスト")
ListBox1.DisplayMember = "コード"
ListBox1.ValueMember = "コード"
DisPlayMemberプロパティにはListBoxコントロールに表示するフィールド
表示したそれぞれの項目に対してプログラム内で実際に使うフィールドの値を
ValueMemberプロパティで指定
ListBox1.DisplayMember = "コード"
ListBox1.ValueMember = "コード"
DisPlayMemberプロパティにはListBoxコントロールに表示するフィールド
表示したそれぞれの項目に対してプログラム内で実際に使うフィールドの値を
ValueMemberプロパティで指定
→→→テキストボックス
Dim dSet As DataSet = New DataSet
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
Data Source = D:\**.mdb; Persist Security Info=False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト", ocn )
dAdp.Fill( dSet , "t_テスト" )
TextBox1.DataBindings.Add("Text" , dSet.tables("t_テスト") , "コード")
TextBox2.DataBindings.Add("Text" , dSet.tables("t_テスト") , "製品")
Add.(プロパティ名 , テーブル名 , フィールド名)
次のレコードを表示
Me.BindingContext.Item( ).Position += 1
2011年7月21日木曜日
→→→DataGridを編集可能かつ行の追加を不可にする
Dim dSet As DataSet = New DataSet("t_テスト")
Dim dView As DataView
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4..0;
Data Source=D:\***.mdb;Persist Security Info = False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト", ocn )
dAdp.Fill( dSet, "t_テスト" )
dView = New DataView( dSet.Tables("t_テスト"))
'新しい行を追加できないようにする
dViewAllowNew = False
DataGrid1.DataSource = dView
------------------------------------------------------------------
<クリックされたセルの行番号、列番号を取得>
Private Sub DataGrid1_MouseUp(ByVal sender As Object,
ByVal e As System.Windows.Forms.MouseEventArgs)
Handles DataGrid1.MouseUp
Dim hitInfo As DataGrid.HitTestInfo
hitInfo = sender.HitTest( e.X , e.Y )
MessageBox.show("クリックした行:" & hitInfo.Row + 1 & ControlChars.NewLine &
"クリックした列:" & hitInfo.Column + 1, "通知結果")
End Sub
→→→DataGrid(すでに開かれているDataGridをいじる)
Dim dSet As DataSet
Dim dTbl As DataTable
Dim i As Integer
dSet = DataGrid1.DataSource
dTbl = dSet.Tables(DataGrid1.DataMember)
For i = 0 To dTbl.Rows.Count - 1
Debug.WriteLine( i.ToString() & ControlChars.Tab & dTbl.Rows(i).RowState.ToString())
Next
-----------------------------------------------------------
Add ---->追加された行
Deleted ---->削除された行
Detached -->DataRowコレクションに追加されていない行
Modified --->変更された行
Unchanged ->前回のAcceptChangesメソッド以降変更されていない行
-------------------------------------------------------------
DataGridの行の編集を確定する
Dim dTbl As DataTable
Dim i As Integer
dSet = DataGrid1.DataSource
dTbl = dSet.Tables(DataGrid1.DataMember)
For i = 0 To dTbl.Rows.Count - 1
Debug.WriteLine( i.ToString() & ControlChars.Tab & dTbl.Rows(i).RowState.ToString())
Next
-----------------------------------------------------------
Add ---->追加された行
Deleted ---->削除された行
Detached -->DataRowコレクションに追加されていない行
Modified --->変更された行
Unchanged ->前回のAcceptChangesメソッド以降変更されていない行
-------------------------------------------------------------
DataGridの行の編集を確定する
Dim dSet As DataSet
Dim dTbl As DataTable
Dim i As Integer
dSet = DataGrid1.DataSource
dTbl = dSet.Tables(DataGrid1.DataMember)
For Each dRow In dTbl.Rows
If dRow.RowState <> DataRowState.Unchanged Then
dRow.AcceptChanges()
End If
Next
For Each dRow In dTbl.Rows
i += 1
Debug.WriteLine( i.ToString() & "行目" & dRows.RowState.ToString())
Next
DataGridを編集できないようにする
---------------------------------
DataGrid1.ReadOnly = True
-------------------------------------
<DataGridのセルのクリックイベントを処理する>
・DataGridコントロールのセルをクリックしたときのイベントを処理するには
DataGridコントロールのセルを表す
DataGridTextBoxオブジェクトのTextChangedイベントを利用する
TextChangeイベントを処理するイベントハンドラを作成し、
TextChangeイベントをAddHandlerステートメントと
AddressOf演算子を使ってイベントハンドラに関連付けます
-------------------------------------------
AddHandler イベント AddressOf イベントハンドラ
-------------------------------------------
→→→DataGridにタイトルをつける
Dim dSet As DataSet = New DataSet
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4..0;
Data Source=D:\***.mdb;Persist Security Info = False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト", ocn )
dAdp.Fill( dSet, "t_テスト" )
DataGrid1.SetDataBinding(dSet, "t_テスト")
DataGrid1.CaptionText = "社員情報"
DataGrid1.CaptionForeColor = Color.Red
DataGrid1.CaptionBackColor = Color.White
---------------------------------------------------------------------
<タイトルバーを表示しない>
DataGrid1.CaptionVisible = False
---------------------------------------------------------------------
<一行おきに背景色をつける>
DataGrid1.AlternatingBackColor = Color.Gray
---------------------------------------------------------------------
<DataGridの高さを変更する>
DataGrid1.PreferredRowHeight = 30
---------------------------------------------------------------------
<DataGridの列見出しクリック時に並べ替えないようにする>
DataGrid1.AllowSorting = False
2011年7月20日水曜日
→→→DataGridの特定の行にマークをつける
商品コード 単価 チェック
A001 150 ○
B001 100 ○
C001 500
A001 150 ○
B001 100 ○
C001 500
Dim dCol As DataColumn
Dim dSet As DataSet = New DataSet
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider~"
dAdp = New OleDbDataAdapter ("SELECT * FROM テスト" , ocn)
dAdp.Fill( dSet, "t_テスト")
dCol = dSet.Tables("t_テスト").Columns.Add("チェック")
dCol.Expression = "IIF(単価<200 , '○' , ' ' )"
DataGrid1.SetDataBinding( dSet , "t_テスト")
登録:
投稿 (Atom)