2008年4月28日月曜日

[vb2005] -- 継承コントロールの作成_その1。(準備)


【目的】汎用的なコントロールの作成、利用。


01.『Windowsコントロールライブラリ』で新規作成する。
02.『UserControl1』が作成されるので、「コードを表示」する。
03.コードは以下のようになっている

Public Class UserControl1

End Class

04.下記のように継承コードを一文追加する。
  (下記はラベルコントロールの継承)

Public Class UserControl1
Inherits System.Windows.Forms.Label ' ← Inherits = 継承

End Class

05.すると、「System.Windows.Forms.Label」の下に警告の波線が表示される。
06.この一文にカーソルを当てると、赤丸感嘆符と以下のようなメッセージが表示される。

 「クラス 'UserControl1' に指定された基本クラス 'System.Windows.Forms.Label' は、
  その他の partial 型の 1 つである基本クラス 'System.Windows.Forms.UserControl' と
  異なることはできません。」

07.このエラーを解消するために、赤丸感嘆符にカーソルを当ててクリックする。
08.以下の選択肢がリンクで表示される。

 ・System.Windows.Forms.Label から継承するために UserControl1 を変更します。
 ・System.Windows.Forms.UserControl から継承するために UserControl を変更します。

09.「System.Windows.Forms.Label から継承するために UserControl1 を変更します。」をクリックする。
10.すると、エラー一覧に次のエラーが表示される。

説明    :'AutoScaleMode' は 'ソリューション名.UserControl1' のメンバではありません。
ファイル  :UserControl1.Designer.vb
行     :26
列     :9
プロジェクト:(プロジェクト名)

11.このエラーをダブルクリックする。
12.エラーの箇所がエディタに表示される。
  このエラーは『UserControl1.Designer.vb』にあるので、このファイルが開く。
13.すると、26行目の「Me.AutoScaleMode」の下に警告の波線が表示されている。
14.この一文をコメントアウト、もしくは削除する。
15.「UserControl1.Designer.vb」を保存して、閉じる。
16.これで準備完了。後は好きにプログラムる。


※ 「10」のエラーや「05」のエラーの理由。
   プロジェクト作成すると、最初は「System.Windows.Forms.UserControl」を
  継承して作成されており、自動生成されるデザイン定義ファイル「~.Designer.vb」
  も最初は「Inherits System.Windows.Forms.UserControl」と記載されている。
  併せて、System.Windows.Forms.UserControlのプロパティ設定が記載されている。
   今回のエラーは「~.Designer.vb」に記載されていたUserControlのプロパティである
  「Me.AutoScaleMode」が、「System.Windows.Forms.Label 」に互換しない
  (Label のプロパティでない)ために起こった。

   「~.Designer.vb」ファイルは、「「Inherits ・・・」の部分を修正してくれても、
  このプロパティのところは自動修正できないらしい。。。

2008年4月23日水曜日

[vb2005] -- MDBのテーブルから主キー情報を取得する。

    
Dim OleDbCn As New OleDbConnection() '○ OLEDBのクラスインスタンス
Dim SchemaTbl As DataTable ' 取得情報保持用データテーブル
    ' 接続先DB
Dim strDtSrc As String
strDtSrc = "PROVIDER=Microsoft.jet.OLEDB.4.0;" & _
"DATA SOURCE=./XXX.mdb;"
    ' 対象テーブル
Dim strTblName As String
strTblName = "TBL_SAKURA"
    Try
OleDbCn.ConnectionString = strDtSrc
OleDbCn.Open()
        SchemaTbl = OleDbCn.GetOleDbSchemaTbl( & _
OleDbSchemaGuid.Primary_Keys, _
New Object() { Nothing, Nothing, strTblName } )
        ' ItemArray は配列で全ての値を取得する。ので、
' この配列分 For文をループさせている
For i As Integer = 0 To SchemaTbl.Rows(0).ItemArray.Length - 1
' 全ての配列の値を、出力
Debug.WriteLine( SchemaTbl.Rows(0).Item(i).ToString() )
Next i
        ' 主キーが存在すれば、行を取得する ( Rows.Count は "1" 以上 ) 
If SchemaTbl.Rows.Count > 0 Then
'----Debug---------------------
Debug.WriteLine( "主キーを発見。" )
Debug.WriteLine( "項目名:" & SchemaTbl.Rows(0).Item(3).ToString() )
'------------------------------
Else
'----Debug---------------------
Debug.WriteLine( "主キーは見つかりません。" )
'------------------------------
End If

Catch ex As Exception
MessageBox.Show(ex.Message, "エラー:SchemaCheck")
Finally
'○ DB閉鎖
If OleDbCn.State = ConnectionState.Open Then
OleDbCn.Close()
End If
End Try

整理は後程。ひとまずメモる。