2006年02月23日

NULL(ヌル)の判定

VB.NETになってNULLの判定が変った。

VB6VB.NET
オブジェクトデータベース
NullNothingDBNull
関数IsNullIsNothingIsDBNull



posted by なっちゃん at 11:21| 静岡 ☁| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年02月20日

全角ひらがなを半角カタカナに変換

半角カタカナはインターネットの世界では通常使わないが、業務アプリなどで省略名称として短縮させて使う場合にはまだ需要がある。

例:全角「あいうえお」を半角「アイウエオ」(注:Webなので全角カタカナで表記)

VB6:
Debug.Print StrConv("あいうえお", vbKatakana + vbNarrow)
 
VB.NET
Debug.WriteLine(StrConv("あいうえお", _
VbStrConv.Katakana + VbStrConv.Narrow)
)
posted by なっちゃん at 17:03| 静岡 ☔| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2005年12月28日

INIファイルの読み書き

VB6ではプログラムの動作環境を保存しておくのに、レジストリを使わない方法としてよく利用した。Win32APIを使うが、VB.NETもほとんど同じである。
※サンプルソースのダウンロードができます。VB6_INI.lzhVBNET_INI.lzh

VB6
Private Declare Function GetPrivateProfileString _
Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
 
Private Declare Function WritePrivateProfileString _
Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFileName As String) As Long

 
Public Function GetIni(ApName As String, KeyName As String, _
Default As String, Filename As String _
) As String
'INIファイルから参照したいキーの値を取得する
'ApName : セクション名
'KeyName : 項目名
'Default : 項目が存在しない場合の初期値
'FileName : 参照ファイル名
'****************************************
Dim strResult As String
strResult = Space$(255)
Call GetPrivateProfileString(ApName, KeyName, Default, _
strResult, Len(strResult), _
Filename)
GetIni = Left$(strResult, InStr(strResult, Chr$(0)) - 1)
End Function
 
Public Sub PutIni(ApName As String, KeyName As String, _
Param As String, Filename As String)
'INIファイルに新たなキーの値を書込む
' ※既存のキーがあれば更新・なければ新規作成する
'ApName : セクション名
'KeyName : 項目名
'Param : 更新する値
'FileName : 書出ファイル名
'****************************************
Call WritePrivateProfileString(ApName, KeyName, _
Param, Filename)
End Sub
 
Private Sub Command1_Click()
PutIni "TEST", "Item", "テスト", "C:\test.ini"
End Sub
 
Private Sub Command2_Click()
Dim strVar As String
strVar = GetIni("TEST", "Item", "", "C:\test.ini")
MsgBox ("test.iniの内容=" & strVar)
End Sub
 
VB.NET
Declare Function WritePrivateProfileString _
Lib "KERNEL32.DLL" Alias "WritePrivateProfileStringA" ( _
ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As Integer
 
Declare Function GetPrivateProfileString _
Lib "KERNEL32.DLL" Alias "GetPrivateProfileStringA" ( _
ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Integer, _
ByVal lpFileName As String) As Integer

 
Public Function GetIni(ByVal ApName As String, _
ByVal KeyName As String, _
ByVal Defaults As String, _
ByVal Filename As String _
) As String
'INIファイルから参照したいキーの値を取得する
'ApName : セクション名
'KeyName : 項目名
'Default : 項目が存在しない場合の初期値
'FileName : 参照ファイル名
'****************************************
Dim strResult As String = Space(255)
Call GetPrivateProfileString(ApName, KeyName, Defaults, _
strResult, Len(strResult), _
Filename)
GetIni = Microsoft.VisualBasic.Left(strResult, _
InStr(strResult, Chr(0)) - 1)
End Function
 
Public Sub PutIni(ByVal ApName As String, _
ByVal KeyName As String, _
ByVal Param As String, _
ByVal Filename As String)
'INIファイルに新たなキーの値を書込む
' ※既存のキーがあれば更新・なければ新規作成する
'ApName : セクション名
'KeyName : 項目名
'Param : 更新する値
'FileName : 書出ファイル名
'****************************************
Call WritePrivateProfileString(ApName, KeyName, _
Param, Filename)
End Sub
 
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
PutIni("TEST", "Item", "テスト2", "C:\test.ini")
End Sub
 
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Dim strVar As String
strVar = GetIni("TEST", "Item", "", "C:\test.ini")
MsgBox("test.iniの内容=" & strVar)
End Sub


VB.NETのWin32APIの使い方はVB6とほとんど同じように使えるが、別の宣言の仕方もある。
MicrosoftのVBマイグレーションTipsにはその方法が記載されている。
posted by なっちゃん at 19:09| 静岡 ☀| Comment(4) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2005年12月26日

よく使う文字列操作の比較一覧

Dim strVar As String
strVar = " VisualBasic2005は来年発売だって "
処理VB6VB.NET
大文字UCase(strVar)strVar.ToUpper()
小文字LCase(strVar)strVar.ToLower()
文字数取得Len(strVar)strVar.Length()
文字検索(前方)InStr(strVar, "I")strVar.IndexOf("I")
先頭の文字は1と数える
見つからなければ0
先頭の文字は0と数える
見つからなければ-1
文字検索(後方)InStrRev(strVar, "i")strVar.LastIndexOf("i")
空白削除(前後)Trim(strVar)strVar.Trim()
空白削除(前)LTrim(strVar)strVar.TrimStart()
空白削除(後)RTrim(strVar)strVar.TrimEnd()
置換Replace(strVar,"Basic","C#")strVar.Replace("Basic","C#")
左詰strVar=Space(10)
Lset strVar = "a"
strVar = "a"
strVar.PadRight(10)
右詰strVar = Space(10)
Rset strVar = "abc"
strVar = "abc"
strVar.PadLeft(10)
指定数分の文字String(10,"a")StrDup(10,"a")
Dim numVar As Long: numVar = -123456
金額表記FormatCurrency(numVar)numVar.ToString("C")
絶対値Abs(numVar)Math.Abs(numVar)
平方根Sqr(Abs(numVar))Math.Sqrt(Math.Abs(numVar))
16進数Hex(Abs(numVar))numVar.ToString("X")
8進数Oct(Abs(numVar))Oct(Abs(numVar))
※VisualBasic6互換関数

posted by なっちゃん at 20:19| 静岡 ☁| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

バイト数指定に対応したLeft、Right、Mid関数

VB6の文字列はUnicodeでありLeftB,RightB,MidBは実際使えない。そこで指定バイト数によるLeft・Right・Mid関数もどきを自作しなければならない。

VB6
'バイト数指定のLeft関数
Public Function bytLeft(buf$, L%) As String
'buf$ : 文字列
'L% : バイト数
'--------------------
bytLeft = StrConv(LeftB(StrConv(buf$, vbFromUnicode), L%), vbUnicode)
End Function
 
'バイト数指定のRight関数
Public Function bytRight(buf$, L%) As String
'buf$ : 文字列
'L% : バイト数
'--------------------
bytRight = StrConv(RightB(StrConv(buf$, vbFromUnicode), L%), vbUnicode)
End Function
 
'バイト数指定のMid関数
Public Function bytMid(buf$, S%, L%) As String
'buf$ : 文字列
'S% : 開始バイト位置
'L% : バイト数
'--------------------
bytRight = StrConv(MidB(StrConv(buf$, vbFromUnicode), S%, L%), vbUnicode)
End Function
 
VB.NET
Public Function bytLeft(ByVal buf As String, ByVal L As Integer) As String
'内部コードをShiftJISのバイト配列にする
Dim bytSJIS As Byte() = _
System.Text.Encoding.GetEncoding("Shift_JIS").GetBytes(buf)

'ShiftJISバイト配列の指定範囲を文字列に変換
Return System.Text.Encoding.Default.GetString(bytSJIS, 0, L)
End Function
 
Public Function bytRight(ByVal buf As String, ByVal L As Integer) As String
'内部コードをShiftJISのバイト配列にする
Dim bytSJIS As Byte() = _
System.Text.Encoding.GetEncoding("Shift_JIS").GetBytes(buf)

'ShiftJISバイト配列の指定範囲を文字列に変換
Return System.Text.Encoding.Default.GetString(bytSJIS, bytSJIS.Length - L, L)
End Function
 
Public Function bytMid( _
ByVal buf As String, ByVal S As Integer, ByVal L As Integer) As String
'内部コードをShiftJISのバイト配列にする
Dim bytSJIS As Byte() = _
System.Text.Encoding.GetEncoding("Shift_JIS").GetBytes(buf)

'ShiftJISバイト配列の指定範囲を文字列に変換
Return System.Text.Encoding.Default.GetString(bytSJIS, S - 1, L)
End Function


※Mid関数は2006年10月05日に追加したものです。
posted by なっちゃん at 16:18| 静岡 ☁| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2005年12月22日

テキストファイルの読み書き

例題:テキストファイル「test.txt」を読み、行番号を付けて「test2.txt」に書出す。

VB6
Private Sub FileIO_Click()
Dim f%, f2%, cnt%
Dim rFName$, wFName$, buf$
rFName$ = "C:\test.txt" '読み込むファイル
wFName$ = "C:\test2.txt" '書き出すファイル
cnt% = 0
'読込みモードでオープン
f% = FreeFile
Open rFName$ For Input As f%
'書込みモードでオープン
f2% = FreeFile
Open wFName$ For Output As f2%
Do Until EOF(f%)
'行数を数える
cnt% = cnt% + 1
'行データを読む
Line Input #f%, buf$
'行番号を付けて書き出す
Print #f2%, Format(cnt%, "0000"); Space(4); buf$
Loop
'2つのファイルを閉じる
Close f%, f2%
MsgBox ("完了")
End Sub
 
VB.NET
Private Sub FileIO_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles FileIO.Click
Dim f, f2, cnt As Integer
Dim rFName, wFName, buf As String
rFName = "C:\test.txt" '読み込むファイル
wFName = "C:\test2.txt" '書き出すファイル
cnt = 0
'読込みモードでオープン
f = FreeFile()
FileOpen(f, rFName, OpenMode.Input)
'書込みモードでオープン
f2 = FreeFile()
FileOpen(f2, wFName, OpenMode.Output)
Do Until (EOF(f))
'行数を数える
cnt += 1
'行データを読む
buf = LineInput(f)
'行番号を付けて書き出す
PrintLine(f2, Format(cnt, "0000"), SPC(4), buf)
Loop
'2つのファイルを閉じる
FileClose(f, f2)
MsgBox("完了")
End Sub


上記はVB.NETでもVisualBaisc6互換(Microsoft.VisualBasicランタイムライブラリ)のメソッドを使った方法である。
.NETらしい方法を使う場合は以下の通り(Javaとよく似ている)

Private Sub FileIO_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles FileIO.Click
Dim f, f2, cnt As Integer
Dim rFName, wFName, buf As String
rFName = "C:\test.txt" '読み込むファイル
wFName = "C:\test2.txt" '書き出すファイル
cnt = 0
'読込みモードでオープン
Dim sr As New System.IO.StreamReader(rFName, _
System.Text.Encoding.Default)

'書込み(上書き)モードでオープン
Dim sw As New System.IO.StreamWriter(wFName, _
False, _
System.Text.Encoding.Default)

Do Until sr.Peek = -1
cnt += 1
'行データを読む
buf = sr.ReadLine
'行番号を付けて書き出す
sw.WriteLine(Format(cnt, "0000") & Space(4) & buf)
Loop
'ファイルを閉じる
sr.Close()
sw.Close()

MsgBox("完了")
End Sub
posted by なっちゃん at 14:37| 静岡 ☀| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2005年12月21日

ComboBoxの初期化

VB6
Private Sub Form_Load()
With Combo1
.Clear
.Style = 2
'ドロップダウンリスト
.AddItem "その1"
.AddItem "その2"
.AddItem "その3"
.ListIndex = 0
'先頭を初期値
End With
End Sub
 
VB.NET
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
With ComboBox1
.Text = ""
.Items.Clear()
.DropDownStyle = ComboBoxStyle.DropDownList
.BeginUpdate()
'EndUpdate()が呼び出されるまで描画しない
.Items.Add("その1")
.Items.Add("その2")
.Items.Add("その3")
.EndUpdate()
'ここで描画され、ちらつきが発生しない
.SelectedIndex = 0
End With
End Sub
posted by なっちゃん at 14:43| 静岡 ☁| Comment(2) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

文字列関数(Left,Right,Mid)

VB6
Dim strVar As String, moji As String
strVar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
'左端から5文字取得
moji = Left(strVar, 5) '"ABCDE"が取得される
'右端から3文字取得
moji = Right(strVar, 3) '"XYZ"が取得される
'先頭10文字目から4文字取得
moji = Mid(strVar, 10, 4) '"JKLM"が取得される
 
VB.NET
Dim strVar As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim moji As String
'---- VB.NET標準関数 ----
'左端から5文字取得
moji = strVar.Substring(0, 5)
'右端から3文字取得
moji = strVar.Substring(strVar.Length - 3)
'先頭10文字目から4文字取得
moji = strVar.Substring(9, 4) '先頭を0とするので10文字目は9
 
'---- VisualBasic6互換関数 ----
'左端から5文字取得
moji = Microsoft.VisualBasic.Left(strVar, 5)
'右端から3文字取得
moji = Microsoft.VisualBasic.Right(strVar, 3)
'先頭10文字目から4文字取得
moji = Microsoft.VisualBasic.Mid(strVar, 10, 4)

posted by なっちゃん at 13:44| 静岡 ☁| Comment(0) | TrackBack(1) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

コントロール配列

VB.NETにはコントロール配列は存在しない、それに類似した処理をどう行うかを記す。

例:電卓の数字0〜9までのボタンをクリックした時

VB6
'btn(0)〜btn(9)までの10個のコマンドボタンの配列を作成
Private Sub btn_Click(Index As Integer)
MsgBox "ボタン[" & CStr(Index) & "]が押されました"
End Sub
 
VB.NET
Private Sub btn_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btn1.Click, btn2.Click, btn3.Click, _
btn4.Click, btn5.Click, btn6.Click, _
btn7.Click, btn8.Click, btn9.Click, _
btn0.Click

Dim btn As Button
Dim No As String
btn = CType(sender, Button) 'イベント発生元のボタン情報を取得
Select Case btn.Name 'ボタン名を参照
Case "btn1" : No = "1"
Case "btn2" : No = "2"
Case "btn3" : No = "3"
Case "btn4" : No = "4"
Case "btn5" : No = "5"
Case "btn6" : No = "6"
Case "btn7" : No = "7"
Case "btn8" : No = "8"
Case "btn9" : No = "9"
Case "btn0" : No = "0"
End Select
'--- 上記の場合は以下のように1行にできる -------
'No = Microsoft.VisualBasic.Right(btn.Name, 1)
'---------------------------------------------
MsgBox("ボタン[" & No & "]が押されました")
End Sub
posted by なっちゃん at 10:22| 静岡 ☁| Comment(2) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

デバッグ用出力

VB6
Debug.Print "コメントや変数=" & strVar & _
"をイミディエイトウィンドウに出力"
 
VB.NET
Debug.WriteLine("コメントや変数=" & strVar & _
"を出力(デバッグ)ウィンドウに出力")
'Consoleクラスが.NETらしい使い方
Console.WriteLine("こちらも使えます。")
posted by なっちゃん at 09:19| 静岡 ☁| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2005年12月20日

フォームを新たに開く

■モードレス(他のフォームも操作可能)

VB6
Private Sub Command1_Click()
Form2.Show 0
End Sub
 
VB.NET
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim frmForm2 As New From2
frmFrom2.Show()
End Sub

■モーダル(他のフォームは操作不能)

VB6
Private Sub Command1_Click()
Form2.Show 1
End Sub
 
VB.NET
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim frmForm2 As New From2
frmFrom2.ShowDialog()
End Sub

posted by なっちゃん at 19:07| 静岡 ☁| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

マウスポインタ(カーソル)の形状


VB6
'処理開始
Me.MousePointer = vbHourglass '砂時計
 
(処理中略)
 
'処理終了
Me.MousePointer = vbDefault '既定
 
VB.NET
'処理開始
Me.Cursor = Cursors.WaitCursor '砂時計
 
(処理中略)
 
'処理終了
Me.Cursor = Cursors.Default '既定
posted by なっちゃん at 17:00| 静岡 ☁| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

関連付けられたアプリケーションで開く

例:URLを指定してブラウザを起動

VB6 (APIを使う)
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpVerb As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
 
Const SW_SHOWNORMAL = 1
 
Private Sub Command1_Click()
Dim ret As Long
Dim Url As String
'URLを指定
Url = "http://natchan.seesaa.net/"
'関連付けられたアプリケーションで開く
ret = ShellExecute(Me.hwnd, _
"open", _
Url, _
vbNullString, _
App.Path, _
SW_SHOWNORMAL)

End Sub
 
VB.NET (Processクラスを使う)
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'URLを指定
Dim Url As String = "http://natchan.seesaa.net/"
'関連付けられたアプリケーションで開く
Process.Start(Url)
End Sub
posted by なっちゃん at 16:05| 静岡 ☁| Comment(0) | TrackBack(1) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2005年12月19日

Enterキーでフォーカスを移動するには

VB6
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
KeyAscii = 0 'これが無いと警告音が出る。
SendKeys "{TAB}"
End If
End Sub
 
VB.NET
Private Sub TextBox_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles TextBox.KeyPress
If e.KeyChar = Microsoft.VisualBasic.ChrW(13) Then
e.Handled = True 'これが無いと警告音が出る。
SendKeys.Send("{TAB}")
End If
End Sub
'Microsoft.VisualBasic.ChrW(13) は Chr(Keys.Enter) でも良い


注意事項:
VB.NETでスマートクライアント(ノータッチデプロイメント)として実行させた場合、ローカルPC(http://localhost/xxxx.exe)で起動した場合は問題なく実行できるが、リモートPC側(http://(コンピュータ名)/xxxx.exe)から起動すると下図のようなセキュリティの警告が表示される

20051220-1.gif

この場合、IEのインターネットオプションのセキュリティの信頼済みサイトにアプリケーションサーバのホスト(この場合ではhttp://(コンピュータ名)/)を追加するとエラーは消える。
posted by なっちゃん at 15:36| 静岡 ☁| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

はじめに

使い慣れたVisualBasic6.0からいよいよ本格的にVB.NET(VisualStudio.NET2003)を使うことになり、VB6で行っていた処理がVB.NETでどう変わったかを、実例を上げて紹介したいと思う。
posted by なっちゃん at 15:04| 静岡 ☁| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。