VB 入門 〜 VB.NET Sample インデックス

VB Tips And Sample(HOME)
 

VB2005 VB2008 VB2010入門 基礎編

VB2005 入門 基礎編vs2008VB2010Express

Visual Studio(ビジュアル・スタジオ)操作編

VB2005サンプル プログラミング編

通信編
ASP.NET編
VB2005 2008サンプル データベース編
VB2005サンプル できあがった!配布するぞ編
旧分類 VS(VB)2002、2003サンプル

VB2002


VB.NETについて
インストール

VB6はWindws7でも動作するそうです。
世間ではドットNETと騒いでいますが、といってもマイクロソフトだけかも? いえいえ、職安の条件欄にもドットNET の文字が出てきました。
私の記憶ではVB6のサポートは2005年で終了?、それに巷のOSがXPになって行きつつあり、95系列のOSは端っこに追いやられていきつつあるようです。でも、MEをまだ使っていますけど。だって在るもんは使わなきゃ勿体無いでしょう。
さて、そんなこんなことを思いつつ、ITの流れの速さにうめきつつ自分もドットNET始めました。ホンとネ。きりが無いとは この事でしょう。
ぼやいても仕方がないけれど。
環境はXPのプロでその上にNETのプロをインストールしています。そのインストールですがやたら時間がかかります。
なんで?というぐらい。一度キャンセルして最初からやり直してみましたがやはり時間がかかるようです。果たして私は今日寝ることが出来るのでしょうか???

起動・速度

インストールは何とか終了して、起動させてみたら、遅い・・・。うーんPC代をケチったたから仕方ないが、これでは 既存の98なんかの上ではもっと遅いんじゃないだろうか?実験してみなきゃ分からないけれど、想像に難くない。
まあ、1年も経てば性能は倍になるPCだからいいのかな?
で、VB.NET始めました。といってもまだまだ全く右も左も分からない状態です。で、本を調べつつ、・・・・つづく

文法など

起動してからフォームにコントロールを貼り付けてダブルクリックでコードを書いていくのはVB6と一緒です。
ちょっと文法が変わっている。と言っても世間で言うほどではないと思うのですが。
細かいことを気にしなければ入門書一冊で概略はつかめると思います。
以下はサンプルコードです。


リッチテキストの文字列を縦書きの表組みにする
Public Class Form1’.NETからはこんな風にフォームも明示的にクラスとして書かれてます。
   Inherits System.Windows.Forms.Form’使うクラスを書いておく所
      #Region " Windows フォーム デザイナで生成されたコード "’ここは初期設定ぐらいの時にしか書き込まない箇所です。#Region 〜#End Region間は通常は折りたたまれている。

省略
    ' InitializeComponent() 呼び出しの後に初期化を追加します。
     RichTextBox1.Text = "ワードからコピーして、ここへ貼り付け。「表組み」実行後、クリップボードに表組みされたものが格納されます。"’これを書き込みました。

省略

   #End Region


’イベントを書き込んでます。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  '表組み開始ボタン
   HyouGUmi(RichTextBox1.Text)自作関数の呼び出し。帰り値が無くても( )を付けます。
  MessageBox.Show("終了しました。", "終了", MessageBoxButtons.OK, MessageBoxIcon.Information)メッセージボックスがこんな感じになりました。従来の文法でも行けるらしいが、パフォーマンスはこちらがいいとのこと。
End Sub

エラー処理Try〜Catch ex As Exception〜エラー処理を書き込んでおく〜End Try 意味の無い例ですけど・・・
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged
  Try
     Me.RichTextBox1.Height = Me.Height - 100
  Catch ex As Exception
     MessageBox.Show(ex.ToString, "エラー処理", MessageBoxButtons.OK, MessageBoxIcon.Error)
  End Try
End Sub

Private Sub MenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem3.Click
    '終了の仕方 閉じる
   Application.Exit()
End Sub

Private Sub MenuItem12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem12.Click
    'テキストファイル開くダイアログボックスを開く
      With Me.OpenFileDialog1
         .Filter = "テキストファイル(*.txt)|*.txt"
          .Title = "開くファイルを選択して開いてください。"
             If (.ShowDialog() And DialogResult.OK) And (.FileName.Length > 0) Then
               If .FileName.Substring(.FileName.Length - 4, 4) = ".txt" Then
                    Me.RichTextBox1.LoadFile(.FileName, RichTextBoxStreamType.PlainText)
                End If
             End If
       End With
End Sub

Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
   'テキストファイル保存ダイアログボックスを開く
    With Me.SaveFileDialog1
    .Filter = "テキストファイル(*.txt)|*.txt"
    .Title = "保存するファイル名を決めて実行してください。"
      If (.ShowDialog() And DialogResult.OK) And (.FileName.Length > 0) Then
        If .FileName.Substring(.FileName.Length - 4, 4) = ".txt" Then
            Me.RichTextBox1.SaveFile(.FileName, RichTextBoxStreamType.PlainText)
        End If
      End If
    End With
End Sub


Private Sub MenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem5.Click
  '切り取り クリップボードへコピーする
   Clipboard.SetDataObject(Me.RichTextBox1.SelectedText)
   Me.RichTextBox1.SelectedText = ""
End Sub

Private Sub MenuItem7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem7.Click
'貼り付けクリップボードから取得する
   Dim riOb As DataObject = Clipboard.GetDataObject()
   Dim stData As String
    If riOb.GetDataPresent(DataFormats.Text) Then
      stData = CType(riOb.GetData(DataFormats.Text), String)
         If stData <> "" Then
            Me.RichTextBox1.SelectedText = stData
         End If
    End If
End Sub

Private Sub MenuItem9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem9.Click
'フォントフォントダイアログボックスを開く
   If Me.FontDialog1.ShowDialog = DialogResult.OK Then
    Me.RichTextBox1.SelectionFont = Me.FontDialog1.Font
   End If
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'フォ−ムロード時メニューをフォーム等のプロパティーに代入する
    Me.Menu = Me.MainMenu1 'これが必要みたい!!!
    Me.ContextMenu1.MenuItems.Add(Me.MainMenu1.CloneMenu.MenuItems(1))
    Me.RichTextBox1.ContextMenu = Me.ContextMenu1
    Me.Label1.Text = CStr(Len(Me.RichTextBox1.Text))’型変換は明示的に行うようにした方がよい
End Sub

Private Sub MenuItem10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem10.Click
'全て選択
    Me.RichTextBox1.SelectAll()
End Sub

Private Sub MenuItem13_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem13.Click
'元に戻すRichTextBox1_TextChangedイベントを取得して文字列の長さなどを取得した後には元に戻せない仕様?
   If Me.RichTextBox1.CanUndo = True Then
      Me.RichTextBox1.Undo()
      Me.RichTextBox1.ClearUndo()
   End If
End Sub

Private Sub MenuItem13_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem13.Click
Shell関数は昔と一緒の様?
  Try
   Dim ProcID As Integer
     ProcID = Shell("hh.exe " & Application.StartupPath & "\WHyou.chm", AppWinStyle.NormalFocus)
  Catch ex As Exception
     MessageBox.Show(ex.ToString, ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error)
  End Try
End Sub
End Class
ここまでで一つのクラス



標準モジュール
Module Module1
    Public Tatemoji As Integer

    Public Sub HyouGUmi(ByVal Moji As String)

        Try
            '  Debug.Print Selection.TextこれはVB6の書き方
            '文字数を取得する

            '例えば21文字目にVbCrを入れる
            Moji = Nijyu(Moji)
            If Moji = "" Then
                Exit Sub
            End If

            '文字数の取得
            Dim mojisu As Integer : mojisu = Len(Moji)

            Dim z As Integer = 1

            'エクセル起動
            Dim oExcel As Object
            Dim oBook As Object
            oExcel = CreateObject("Excel.Application")
            'oExcel.Visible = True

            'Debug.WriteLine(System.IO.Directory.GetCurrentDirectory()).NETのデバッグ

            oExcel.workbooks.Open(Application.StartupPath & "\Word.xls") 'アプリケーションの現在地の絶対パス

            oExcel.UserControl = True 'これを設定しておけば勝手に終了しない。


            oExcel.Worksheets("Sheet1").Cells.Select()
            oExcel.Selection.ClearContents()
            oExcel.Cells(1, 1).Activate()

            Dim X, Y, HozonY As Integerこんな変数の宣言でもOKになりました。
            Y = (mojisu \ Tatemoji) + 5
            HozonY = Y
            If Y = 0 Or IsNumeric(Y) = False Then
                Y = 20
            End If

            X = 1

            Do
                If vbCr = Mid(Moji, z, 1) Then
                    '改行記号が来たら、y-1にする
                    Y = Y - 1
                    'xを一に戻す
                    X = 1
                    'で改行記号を一個削る
                    Moji = Replace(Moji, vbCr, "", , 1)
                    mojisu = mojisu - 1 '文字数を-1しておく
                End If
                'ワークシートへ流し込む
                oExcel.Cells(X, Y).Value = Mid(Moji, z, 1)
                X = X + 1
                z = z + 1
            Loop Until z >= mojisu + 1


            oExcel.Worksheets("Sheet1").Range(oExcel.Cells(1, HozonY), oExcel.Cells(Tatemoji, Y)).Select()
            oExcel.Selection.Copy()
            oExcel.DisplayAlerts = False

            oExcel.Quit()
            oExcel = Nothing
            oBook = Nothing

            'Debug.Print Moji

        Catch ex As Exception
            MessageBox.Show(ex.ToString & ex.Message, "エラー発生 エラー処理です。", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try
    End Sub

    Private Function Nijyu(ByVal Moji2 As String) As String
        '縦20文字(VbCrを入れて(TateMoji+1)文字)にセットしなおす。

        Dim Cz As Integer
        Cz = 1

        Dim Lgyou As Integer
        Lgyou = 0 '行数

        Dim Moji2su As Integer
        Moji2su = Len(Moji2) '文字数

        Dim Tatemojisuu As String
        Tatemojisuu = InputBox("一行文字数の指定をして下さい", "縦文字数", "20")

        If Tatemojisuu = "" Then
            MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Nijyu = ""
            Exit Function
        End If
        '  Dim TateMoji As integr'モジュールレベルへ引き上げる。
        Tatemoji = CLng(Tatemojisuu)

        If Tatemoji = 0 Or IsNumeric(Tatemoji) = False Then’数字か否かチェック
            Tatemoji = 20
        End If

        Do

            If Cz = (Tatemoji + 1) And vbCr <> Mid(Moji2, Cz + (Lgyou * (Tatemoji + 1)), 1) Then

                '違えばかます
                Moji2 = Left(Moji2, Cz + (Lgyou * (Tatemoji + 1)) - 1) & vbCr & Mid(Moji2, Cz + (Lgyou * (Tatemoji + 1)))
                Moji2su = Moji2su + 1

                Cz = 0
                Lgyou = Lgyou + 1
            End If

            Cz = Cz + 1

        Loop Until Cz + (Lgyou * (Tatemoji + 1)) >= Moji2su + 1

        Nijyu = Moji2

    End Function

End Module




ADO.NETでSQLサーバーへ接続、検索、表示、編集するサンプルコードです。間違いがあるかも?
準備
注意!!データベースが更新されます。
(SQLサーバー7.0のノースウインドウデーターベースのCustomersをインポートエクスポートでCustomers1として複製しておく。)
(接続文字は各自の環境で設定してください。)
フォームにテキストボックス1、データグリッド1、コマンドボタン必要な数だけ貼り付けて以下のコードを書いて実行

Option Explicit On 
Option Strict On

Imports System.Data.SqlClient 'これをインポートしておくとコードが長ったらしくならなくて済む

Public Class Form1
    Inherits System.Windows.Forms.Form
    Dim dataAda As New SqlDataAdapter()  'クラスレベルとでもいいましょうか、モジュールレベルといいましょうか?
    Dim dataset As New DataSet()
    Dim cnn As New SqlConnection()
    Dim cmnd As New SqlCommand()

#Region " Windows フォーム デザイナで生成されたコード "

'省略。
#End Region


    Private Sub Kensaku(Optional ByVal MySQL As String = "select * from Customers1")

        Try
            'すべてのテーブル内のすべての行を削除して、データの DataSet を消去します。
            dataset.Clear()

            'コネクションストリングを設定
            'Dim cnn As New SqlConnection()
            cnn.ConnectionString = "user id=sa;password=;initial catalog=northwind;data source=(local);Connect Timeout=30"
            'この接続は明示的にオープンクローズする必要がない。Fillでオープンクローズを勝手にしてくれる


            'SQL文を設定し、コマンドにコネクションを設定する
            'Dim cmnd As New SqlCommand()

            MySQL = TextBox1.Text
            cmnd.CommandText = MySQL
            cmnd.Connection = cnn

            'データアダプターにコマンドを設定
            'Dim dataAda As New SqlDataAdapter()
            dataAda.SelectCommand = cmnd

            'レコード数の取得
            Dim reCount As Integer

            'データセットにデータの実態を取得する()
            'Dim dataset As New DataSet()
            reCount = dataAda.Fill(dataset, "Customers1")

            Me.Label1.Text = CStr(reCount)

            'データグリッドに表示する1
            ''DataGrid1.DataSource = dataset
            'DataGrid1.DataMember = "Customers1"

            'データグリッドに表示する2
            'DataGrid1.DataSource = dataset.Tables("Customers1")

            'データグリッドに表示する3
            '以下が推奨されているようです。
        DataGrid1.SetDataBinding(dataset, "Customers1")

        Catch ex As Exception
            MessageBox.Show(ex.Message, "SQL検索", MessageBoxButtons.OK, MessageBoxIcon.Hand)
        End Try
    End Sub

    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '検索実行
        '検索プロシージャへテキストボックスのSQL文を渡す
        Kensaku(TextBox1.Text)
    End Sub

    Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        '更新
        '更新がちょっとややこしい?
        Try
            '更新するSQL文の自動生成 MSDNのよれば
            'SqlDataAdapter の SelectCommand プロパティを設定した場合は、
            '単一テーブルを更新する Transact-SQL ステートメントを自動的に生成する SqlCommandBuilder オブジェクトを作成できます。
            'ということ。
            '当然ですが、SqlCommandBuilderを行うテーブルには主キーが必要らしい。

            Dim cmdbil As SqlCommandBuilder
            cmdbil = New SqlCommandBuilder(dataAda)
            dataAda.Update(dataset, "Customers1")
        Catch ex As Exception
            MessageBox.Show(ex.Message, "SQL検索", MessageBoxButtons.OK, MessageBoxIcon.Hand)
        End Try
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        '書き換え
        dataset.Tables("Customers1").Rows(0).BeginEdit()
        dataset.Tables("Customers1").Rows(0).Item("City") = "Tokyo"
        dataset.Tables("Customers1").Rows(0).EndEdit()
    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        '追加
        Dim obRow As DataRow
        obRow = dataset.Tables("Customers1").NewRow
        obRow.Item("City") = "XYXYXYXYX"
        dataset.Tables("Customers1").Rows.Add(obRow)
    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        'DebugWrite
        '一行目のCityをdebugwriteする
        Debug.WriteLine(dataset.Tables("Customers1").Rows(0).Item("City"))

        'データテーブルオブジェクトに取得して各行 各列にアクセスする
        Dim obTable As DataTable
        obTable = New DataTable()
        obTable = dataset.Tables("Customers1")

        Dim i As Integer
        For i = 0 To obTable.Rows.Count - 1
            Dim obRow As DataRow = obTable.Rows(i)
            Debug.WriteLine(obRow(0))
        Next
    End Sub


    Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize
        'クラスメソッド選択リストで「Base Class Events」のResizeイベントを選択するとFrom1のイベントになる
        With Me.DataGrid1
            .Top = 125
            .Height = Me.Height - 130
            .Left = 0
            .Width = Me.Width
        End With

    End Sub
End Class


別Formのコントールへのアクセス

VB6では直接 
Form1.Text1.text="成功!"
でしたが。

フォーム2(Form1で呼び出した)からフォーム1のテキストボックスへ値を代入するには
Dim f1 as Form1 =me.owner
f1.TextBox1.text="成功!"
とします。

  XMLウェッブサービス

IISをセットアップした後(XPのホームエディションでは出来ません)、新規プロジェクトでXMLウェッブサービスを選択して適当な名前を付けて プロジェクトを立ち上げます。
 次にソースコードの中に「Hello World」を返すメソッドがコメントアウトされている箇所があるので[']を外して、ビルドします。すると自動的に 「Hello World」を返すXMLウェッブサービスが出来上がります。
 サービスの基本はこれだけで、結局XMLウェッブサービスとは、「関数」をウェッブ上で公開して相手に使ってもらうということになります。
 で、このサービスを利用するためには、新規にプロジェクトを立ち上げて、「参照設定」の箇所で「Webの参照」で先ほど作成したサービスを参照し, そのサービスのインスタンスを
Dim サービス sr=new サービス
として実体化すれば
sr.HelloWorld
としてメソッドが利用できるようになります。
 後は、参考書などで、テクニックを習得すれば比較的VBライクにコードを書くことが出来ます。
 公開に当たってはセキュリティーをしっかりと設定するのをお忘れなく。
 
VB Tips And Sample(HOME)