2008年03月06日

VB6のhDCプロパティはVB.NET(VB2005)ではどうなる?

VB6でグラフィック関連のWindowsAPIを使うときは必ずと言ってよいほどコントロール(FormやPictureBox)のデバイスコンテキストであるhDCプロパティを指定する。

これをVB.NET(VB2005)で使おうとしてアップデートウィザードを使うと肝心のhDCが「'UPGRADE_ISSUE: Form プロパティ Form1.hdc はアップグレードされませんでした。」となり使えない。別件だが同じくWindowsAPIでよく使うウィンドウハンドル(.hWnd)は、.NET Frameworkでは(コントロール).Handleというプロパティになっており判りやすい。
いったいhDCはどうすれば指定できるのだ?と思い調べてみたところこんな具合になった。VB6との比較で紹介する。

例として起動したフォームの座標(x,y)地点の色(RGB値)を取得するGetPixel関数で説明する。
この関数の定義は以下の通り、最初の引数にhDCを渡す。
Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

VB6:
Dim iro As Long
iro = GetPixel(Me.hdc, x, y) 'たったこれだけ。
 
VB.NET/VB2005:
Dim gp As Graphics = Me.CreateGraphics 'フォームのGraficsを作成
Dim hDC As IntPtr = gp.GetHdc() 'そのデバイスコンテキストを取得
Dim iro As Long = GetPixel(hDC, x, y) 'やっと使える
posted by なっちゃん at 19:56| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2007年10月15日

日付型(DateTime)の初期値を判定

VB6まではDate型は8バイトのDouble形式で値が格納されていた。
整数部が日付で小数部が時刻という具合である。

プログラムの中で日付型の変数に値があるかどうか、言い方を変えると使用されたかどうか、を判断するのにその値が0であるかどうかでチェックすることができた。

VB.NET(VB2005)になって仕様が変わってこの方法がそのまま使えなくなった。そこで違いを確認し、初期値(定義直後の値)を確認する方法をまとめた。

以下は日付型の変数にNow関数とDate関数(VB2005はToDay関数)で現在日時と現在日付を取得しそのまま表示させたものにVal関数とCDbl関数で変換を行っている。また変数を定義した直後の値も同様に表示している。VB2005の場合はToOADate関数でVB6のCDbl関数で取得したのと同様の結果が得られる。またToBinary関数ではVB6には無かった100ナノ秒単位までの値を含む64ビットのシリアル値を表示する。このToBinaryをみると定義直後の値が0であることが良く分かる。

・VB6の場合
VB6の場合

Dim d1 As Date
d1 = Now
Text1.Text = d1
Label4.Caption = "Val : " & Val(d1) & vbCrLf & "CDbl : " & CDbl(d1)
Text2.Text = Date
Label5.Caption = "Val : " & Val(Date) & vbCrLf & "CDbl : " & CDbl(Date)
Dim d2 As Date
Text3.Text = d2
Label6.Caption = "Val : " & Val(d2) & vbCrLf & "CDbl : " & CDbl(d2)


・VB2005の場合
VB2005の場合

Dim d1 As DateTime = Now
TextBox1.Text = d1
Label4.Text = "Val : " & Val(d1) & vbCrLf & _
"ToOADate : " & d1.ToOADate & vbCrLf & _
"ToBinary : " & d1.ToBinary
TextBox2.Text = Today
Label5.Text = "Val : " & Val(Today) & vbCrLf & _
"ToOADate : " & Today.ToOADate & vbCrLf & _
"ToBinary : " & Today.ToBinary
Dim d2 As Date
TextBox3.Text = d2
Label6.Text = "Val : " & Val(d2) & vbCrLf & _
"ToOADate : " & d2.ToOADate & vbCrLf & _
"ToBinary : " & d2.ToBinary
posted by なっちゃん at 11:43| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年11月10日

次期OS「Vista」ではVisualBasic6はサポートされるが、VisualStudio.NET2002,2003はサポートされないんだと

http://www.microsoft.com/japan/msdn/vstudio/support/windowsvista/faq/
上記リンクにMicrosoftの言い分が載っている。

NET Frameworkが出現し、いずれVB6は対応しなくなる可能性があるからわざわざ.NETに移行した開発者はバカをみた事になるのか。そのままVB6で開発していればまだ生き長らえたかもしれないのにね。

開発ツールがサポートされなくなるだけでアプリケーションは動くらしい。でも開発できないんじゃやっぱりVS2005に移行させるしかないじゃん。VB6からの移行に比べたら何でもないけど・・・。

VB6のサポートを決めたのは、世にVB6アプリが沢山あって、歴史の浅い.NETアプリなんかよりずっと沢山の人々が使っているからなんだろう。
だったらVB2005の後はVB9としてアンマネージコードも作成できるようにして欲しいよ。

Windows VistaのBeta2とRC2を使っているけど、操作方法がいろいろ変わってまた覚えないといけない。XPが出たときもそうだったが、ベテランほどストレスが溜まるんだ。OSを独占している現在の状態が問題なのは言うまでも無い。Microsoftの意向が神の御告げのようにユーザーに降りかかるのである。
Linuxのように無料かそれに近い安さで公的な資産とし、ディストリビュータ毎にカスタマイズして競争させれば、一番使い勝手の良いものが売れるようになるだろうから、操作性もそう大幅に変わることも無いだろうにと思う。
posted by なっちゃん at 17:19| 静岡 ????| Comment(0) | TrackBack(1) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年09月29日

自アプリケーションのバージョンを取得

MajorMinorBuildRevision
VB6App.MajorApp.Minor-App.Revison
Label1.Cation = App.Major & "." & App.Minor & "." & App.Revision
VB.NETDim Ver As New Version(Application.ProductVersion)
Ver.MajorVer.MinorVer.BuildVer.Revison
Dim Ver As New Version(Application.ProductVersion)
Label1.Text = Ver.ToString
VB2005Dim Ver As Version = My.Application.Info.Version
Ver.MajorVer.MinorVer.BuildVer.Revison
Label1.Text = My.Application.Info.Version.ToString

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

2006年09月28日

VB2005から新たに加えられたMouseイベント

前回のTips用サンプルを作っていたときに偶然見つけたのだが、DoubleClickイベントとは別にMouseDoubleClickイベントなるものがあるのに気が付いた。ヘルプをみたら、.NET Framework2.0つまりVB2005で新たに追加されたものらしい。
どう違うのか、理解しやすいようにバージョン毎のイベントの流れを比較してみる。

ダブルクリックしたときのイベント発生順序
 
VB6 VB.NET VB2005
----------------------------------------------------
1. MouseDown MouseDown MouseDown
2. MouseUp Click Click
3. Click DoubleClick MouseClick
4. DblClick MouseUp MouseUp
5. MouseUp MouseDown
6. DoubleClick
7. MouseDoubleClick
8. MouseUp
----------------------------------------------------

VB6よりVB.NETの方がイベントがスッキリしているが、VB2005になって複雑になった。細かく制御できるわけだがそこまで使うかどうか・・・。

ClickとMouseClick、DoubleClickとMouseDoubleClickの違いは、Mouseと名づけられた方が、純粋にマウスからのイベントだけを処理するものだ。
クリックイベントは、コントロールにフォーカスがあるときEnterキーやSpaceキーでも発生させることができるからだ。キーボードだけで操作したいこともあるからね。
posted by なっちゃん at 15:23| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年09月26日

イベントの中で他のコントロールのクリックを実行するには

例として、リストボックスの項目を選択・確定する処理で説明する。

一般的には
1.リストボックスの項目をクリックし選択状態にし、
2.ボタンコントロールをクリックして確定する。
の2段階で行う。

これを
1.リストボックスの項目をダブルクリックして選択・確定する。
という1つのイベントで実行させたいことがある。

VB6では以下のようになる。

Private Sub Form_Load()
With List1
.Clear
.AddItem "私"
.AddItem "お父さん"
.AddItem "お母さん"
.AddItem "お兄ちゃん"
.AddItem "お姉ちゃん"
.ListIndex = 0
End With
End Sub
 
'/// 選択したリストの項目を表示 ///
Private Sub Command1_Click()
MsgBox "「" & List1.List(List1.ListIndex) & "」が選ばれました"
End Sub
 
'/// ボタンのクリックを内部で実行 ///
Private Sub List1_DblClick()
Command1_Click '上記のクリックイベントを呼んでいるだけ
End Sub

VB.NET(2005含)になると、VB6のようにイベントプロシージャをそのまま呼ぶことはできない。そこで登場するのが PerformClickメソッド
ヘルプをみると「Clickイベントを発生させる」とある。クリック以外のイベントを発生させるメソッドがないか調べてみたがどうもなさそうだった。

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
With ListBox1
.Items.Clear()
.Items.Add("私")
.Items.Add("お父さん")
.Items.Add("お母さん")
.Items.Add("お兄ちゃん")
.Items.Add("お姉ちゃん")
.SelectedIndex = 0
End With
End Sub
 
'/// 選択したリストの項目を表示 ///
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
MsgBox("「" & ListBox1.SelectedItem & "」が選ばれました")
End Sub
 
'/// ボタンのクリックイベントを発生させる ///
Private Sub ListBox1_DoubleClick(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
Button1.PerformClick()
End Sub
posted by なっちゃん at 20:35| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年09月12日

TextBoxコントロールのよく使うプロパティ・メソッド比較

VB6VB.NET(VB2005)
コントロールに入力フォーカスを移すText1.SetForcusTextBox1.Forcus()
選択されたテキストの開始点を設定(取得)Text1.SelStart=0TextBox1.SelectionStart=0
選択されたテキストの文字数を設定(取得)Text1.SelLength=10TextBox1.SelectionLength=10
選択されたテキストの内容を設定(取得)Text1.SelText="hoge"TextBox1.SelectedText="hoge"
指定した位置のテキストを選択(該当なし)TextBox1.Select(0,10)
これは下の2行と同じ
TextBox1.SelectionStart=0
TextBox1.SelectionLength=10
コントロールの全てテキストを選択(該当なし)TextBox1.SelectAll()
posted by なっちゃん at 14:36| 静岡 ?J| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年09月08日

Erase ステートメントの違い

VB2005でデータベースからExecuteReaderでデータを読み込み、配列に代入するルーチンを作ったがなぜかアプリケーションエラーが発生する。(下図)

エラー画面

DBからのデータ取得はこれまでさんざんやってきた作業なのでコードに問題があるとは思えなくVB2005(ADO.NET 2.0)になってDataReaderのクラスが変わったのかなと思って調べてみたのだが、特にそれらしい記載はない。コードも代入する直前まで問題なく動いているので原因がなかなか判らなかった。

こうした場合エラーの原因は意外なところにあるもので、今回の場合ADO.NETの使い方ではなく代入先の配列の使い方にあった。
代入しようとする配列(変数のタイプは構造体)がNothingになっていたのだ。
えー、ちゃんと初期化してあるし、なんで?と思ったが確かにNothingになっている(下図)

エラー時のコード

何故Nothingになってたのか考えてみたところ、直前にEraseしているのが原因らしい。
実はVB6ではこれで問題なく動いていたのだ。ところがVB2005(VB.NETでも同じ)ではEraceの動きが違っている。

VB6のヘルプを見るとEraceの機能は
静的配列[Dim hoge(5) 添字を指定して宣言]
・・・変数を初期化(数値は0に、文字列は"")してくれる。
動的配列[Dim hoge() 添字を未指定にして宣言する]
・・・メモリを開放。その後ReDimする必要あり。

VB2005でもVB6と同様に静的配列の初期化を想定していたのだ。しかしVB6とは違い自動で初期化してくれなかった(^^;
※VB6ではこの初期化の機能が大変便利で、構造体の内部変数を初期化するのに、Eraseで一回で済むようわざわざ配列にしたくらいである。

VB2005のヘルプには「各配列変数に Nothing 値を割り当てるのと同じ結果になります」とある。サンプルは下のようになっている。
Dim threeDimArray(9, 9, 9), twoDimArray(9, 9) As Integer
Erase threeDimArray, twoDimArray
ReDim threeDimArray(4, 4, 9)

※VB6では静的配列をReDimできないのに、VB.NETではできてしまう!

これで直した結果、エラーは無くなった。(下図)

修正後のコード
posted by なっちゃん at 15:30| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年06月30日

文字列から数値への変換(その2):IIF関数内での注意

VB6、VB.NET共通のコーディング上の注意です。

テキストボックス(Text1)に入力された文字を数値に変換する処理の場合
(例)Text1.Text = "abc"

Dim s As Single
 
If IsNumeric(Text1.Text) = False Then
s = 0
Else
s = CSng(Text1.Text)
End If

上記のようにすればText1.Textの値に何がきても正しく処理されエラーになることはない、ところが次のようなコードにするとエラーになる。

s = IIF(IsNumeric(Text1.Text) = False, 0, CSng(Text1.Text))

これは、IIF関数がTrue時の式とFalse時の式を両方とも評価しているために起こる。つまり、CSng("abc")が実行されて「型が一致しません」のエラーになるからだ。
posted by なっちゃん at 20:27| 静岡 ??| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年06月16日

文字列から数値への変換

VB.NETでもVB6の時とほとんど同じ使い方(Val関数・CSng関数)ができるが、Javaと同じParseメソッドもある。
また、変換時に注意すべき点は、金額などで"¥"や3桁毎のカンマ(,)を含んだ場合にVal関数は使えないということだ。

実行サンプルVB6:結果VB.NET:結果
Val("1234.5")1234.51234.5
Val("1,234.5")11
Val("\1.234.5")00
CSng("1234.5")1234.51234.5
CSng("1,234.5")1234.51234.5
CSng("\1,234.5")1234.51234.5
Single.Parse("1234.5")-1234.5
Single.Parse("1,234.5")-1234.5
Single.Parse("\1,234.5")-1234.5※
※Single.Parse("\1,234.5",NumberStyles.Any)
としないとエラー
posted by なっちゃん at 14:46| 静岡 ?J| Comment(0) | TrackBack(1) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年05月29日

ComboBoxの初期化:その2

以前紹介したComboBoxの初期化は単純にテキスト項目をセットするものだった。
今回はVB6のItemDataに相当する表示テキストとは別の値(数値)をセットする方法である。

これは予想外に手間取った。結論から言えばVB.NETにItemDataに相当するプロパティは無い
オンラインマニュアル、サンプル、幾つかの参考書を調べても掲載されていないのだ。やっと見つけたのが「魔界の仮面弁士」さんの記事である。(この方は相当な経験と知識の持ち主である。これまでもオンラインソフトの開発では幾度となく助けられた。)
Addメソッドで登録できるのはVB6の場合はテキストのみだが、VB.NETではObject型に代わっている。つまりテキストの他何でも登録できるように進化している。
ただこれによってObject型の定義が事前に必要になってくる。共通モジュールにでも登録しておくといいだろう。

サンプルは前回のものを修正した。
VB6
Private Sub Form_Load()
With Combo1
.Clear
.Style = 2 'ドロップダウンリスト
.AddItem "その1"
.ItemData(.NewIndex) = 101 'ItemDataに値101をセット
.AddItem "その2"
.ItemData(.NewIndex) = 102
.AddItem "その3"
.ItemData(.NewIndex) = 103
.ListIndex = 0 '先頭を初期値に指定
End With
End Sub

'--- ItemDataを取り出す
Debug.Print Combo1.ItemData(Combo1.ListIndex)
 
VB.NET

'-- ComboBox用Item構造体 --
Public Structure ComboItem
Public Text As String '表示テキスト
Public Data As Integer '数値データ

'--- ToStringのオーバーライド(上書)
Public Overrides Function ToString() As String
Return Text
End Function

'--- コンストラクタ(Object生成時の初期化)の定義
Public Sub New(ByVal st As String, ByVal it As Integer)
Text = st
Data = it
End Sub
End Structure
 
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(New ComboItem("その1", 101))
.Items.Add(New ComboItem("その2", 102))
.Items.Add(New ComboItem("その3", 103))

.EndUpdate() 'ここで描画され、ちらつきが発生しない
.SelectedIndex = 0 '先頭を初期値に指定
End With
End Sub

'Dataの取り出し
Console.WriteLine DirectCast(ComboBox1.SelectedItem, ComboItem).Data

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

2006年05月17日

マウスカーソルが消えてしまう

以前VB6とVB.NETでのマウスカーソルの形状について比較を行った。
「マウスポインタ(カーソル)の形状」

今回とりあげるのは比較ではなく、VB6、VB.NETに関係なく両方に起きる困った現象である。

テキストボックスに入力したコードをキーとしてデータベースからデータを取得する、こういうプログラムを作った。その際、データを取得するまで若干時間が掛かるのでその間マウスカーソルを砂時計になるようにコードを記述した。
注)この処理はテキストボックスのキーイベント内部で行うものである。

ところが、実行すると砂時計になる前にマウスカーソルが消えてしまった。そしてデータが取得されたころ、つまり元のカーソルに戻すコードにきて現れた。
一体何だこれは?と思い。またVB.NETの特例かと心配になり、VB6で似たようなサンプルを作って確かめたところ、こっちでも同じようにマウスカーソルが消えてしまった。

最初は、データ取得にCPU負荷が大きすぎて表示する余裕がないためかと思い、Application.DoEventsメソッドなどを追加してみたのだがやはり表示されない。
いろいろ調べてみた結果、やっと分かったのが、コントロールパネルの「マウス」のプロパティで「文字の入力中にポインタを非表示にする」が有効になっているときに起きるということだった。これを無効にするとちゃんと砂時計が表示された。また、この現象はWindows2000で起きたのだが、マウスのプロパティが同じでもWindowsXPでは起きなかった。つまりWindows2000の問題のようである。
posted by なっちゃん at 16:48| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年05月16日

LabelコントロールのTextAlignとAutoSizeの連携動作の違い

VB.NETで変な動きを見つけた。
LabelコントロールのTextAlignプロパティをTopRight(右上)にしてAutoSizeプロパティをTrue(真)にしたところどうしても右揃えにならないのである。
VB6では確かこんなことは無かったはずだと気になったので簡単なサンプルを作って検証してみた。

結果はサンプルの動作画面を見ると一目瞭然である。

VB6
20060516-1.gif

VB.NET
20060516-2.gif

VB.NETではTextAlignを有効にするにはAutoSizeはFalse(偽)でなければならない。
posted by なっちゃん at 13:54| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年05月09日

フォームのスタイル

こんな初歩的なことでさえ判らないなんて情けないと思うが、それだけVB6とVB.NETは変ったという証拠(どっぷりVB6に漬かっていた証拠)でもある。

フォームを固定サイズにするためプロパティを変更しようと思ったのだが、どこにそれがあるのかすぐに判らなかった。VB6ではあまりにも慣れすぎた操作だったので同じように考えてそのプロパティが見つからないのである。
やっとそれらしきものを探したのだが、プロパティの値が英語で記述されていて迷った。下に対比表をまとめた。画面のキャプチャーも載せておく。

スタイル
※VB6での呼び方
VB6
(BorderStyle)
VB.NET
(FormBorderStyle)
なし0 (vbBSNone)None
固定(実線)1 (vbFixedSingle)FixedSingle
可変2 (vbSizable)Sizable
固定
ダイアログ
3 (vbFixedDialog)FixedDialog
固定ツール
ウィンドウ
4 (vbFixedToolWindow)FixedToolWindow
可変ツール
ウィンドウ
5 (vbSizableToolwindow)SizableToolWindow
該当無し該当無しFixed3D


20060509.gif 左がVB6、右がVB.NETのプロパティ画面
posted by なっちゃん at 20:52| 静岡 ??| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年04月25日

和暦表示

VB.NETになって不便になったことはいろいろあるが、和暦表示はその最たるものの一つ。Format関数でダイレクトに使えないところが不便極まりない。
今回は取り上げないが、DateTimePicker(VB6ではDTPicker)コントロールでの和暦表示がコントロールパネルの地域オプションで日付を和暦にしないと使えないらしい。困ったことだ(--#

VB6
'西暦の今日を和暦にする
Dim Wareki As String
Wareki = Format(Date, "gggee年mm月dd日")
'「平成18年04月25日」となる。
 
VB.NET
Dim Wareki As String
Dim cult As System.Globalization.CultureInfo = _
New System.Globalization.CultureInfo("ja-JP")
cult.DateTimeFormat.Calendar = _
New System.Globalization.JapaneseCalendar
Wareki = Today.ToString("ggyy年MM月dd日", cult)

実はVB.NETには不具合のおまけがあり、1桁の年の場合 "ggy年M月d日"と記述しても平成0x年と0が頭に付いてしまう。

毎回長々と記述するのは賢くないので関数化すると以下のようになる。

Imports System.Globalization
 
Public Function JpnFormat(ByVal tday As DateTime) As String
'tday : 日付
'-----------
Dim cult As CultureInfo = New CultureInfo("ja-JP")
cult.DateTimeFormat.Calendar = New JapaneseCalendar
Return tday.ToString("ggyy年MM月dd日", cult)
End Function
posted by なっちゃん at 16:33| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年02月28日

コントロール配列−その2

以前コントロール配列のイベント処理を扱ったが、データベースなどから取得したデータを画面に表示する場合など、コントロールに代入する際の方法を紹介する。VB6のようにコントロール配列が使えるととても楽になるのだが、VB.NET(ASP.NET)ではそれに代わる方法を用いるしかない。

例:配列の値を同数のテキストボックスに代入する

VB6:
'配列の添字と同数のコントロール配列を用いる
Private Sub StrDataSet(dat() As String)
Dim L%, U%, i%
L% = LBound(dat)
U% = UBound(dat)
For i% = L% To U%
Text1(i%).Text = dat(i%)
Next i%
End Sub
 
VB.NET(Windowsアプリでは使えず、Web(ASP.NET)アプリで可)
'配列の添字と比例するコントロール名を使う
Private Sub StrDatSet(ByVal dat() As String)
Dim L, U, i As Integer
Dim tx As System.Web.UI.WebControls.TextBox
L = LBound(dat)
U = UBound(dat)
For i = L To U
'コントロール名を探し出す
tx = FindControl("TextBox" & CStr(i))
'見つかったコントロールのTextプロパティに代入
tx.Text = dat(i)
Next
End Sub
posted by なっちゃん at 09:01| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

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| 静岡 ?J| 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(1) | 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")
文字検索(後方)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 | このブログの読者になる | 更新情報をチェックする