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を記述することもできない。
インタフェースを実装するクラスは、メンバー変数を勝手に追加することができない

→→→そのまま使えない「抽象クラス」

そのまま使えない、必ず子クラスを作って追加実装をしなければいけない「抽象クラス(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に書き換えるとエラー。

抽象クラスは「何をするか」の大枠だけを決めておいて「どのようにするか」を子クラスにまかせる仕組み

→→→メソッドのオーバーライド

メソッドのオーバーライド(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メソッドを呼び出せる。

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キーワードを使って継承元を指定する

→→→メソッドのオーバーロード

現在の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)」を並存させることが可能。

→→→インスタンス生成時に呼び出される「コンストラクタ」

インスタンス生成時に呼び出されるコンストラクタは、インスタンスの初期化を行うのに便利。
●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

→→→クラス

クラス(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」という名前で参照している。



→→→値の読み書きが処理につながる「プロパティ」

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プロシジャが、呼び出される。

利用する側からは、プロパティは変数と同様に見える。

トランザクション ログの肥大化

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) を実行

でログファイルは縮小される。

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メソッドを備えている。

→→→文字列を格納する文字列型

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 = ""
と初期化して使うべき時もある。

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


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 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 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


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()

→→→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オブジェクト, テーブル名 )

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" )

→→→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

→→→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()

→→→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 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」と入力



これでウィンドウの位置を保存するための設定ができる

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

→→→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フォルダに貼り付ける

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  =    登録
を貼り付け

     



     

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プロシージャに結びつけられる

→→→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

→→→お絵かき

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

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_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プロパティで指定

→→→テキストボックス

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 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


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_テスト")