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