連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第4回 変数スコープと文字列関数

(株)ピーデー
川俣 晶
2002/04/23

Page1 Page2

 今回は、前回にも少し触れたVBFixedString属性の活用方法をまず解説し、続いてVB 6とVB.NETでの変数のスコープの違いや、文字列を扱う関数の挙動の違いについて解説する。

ランダム・ファイルとVBFixedString属性

 VBFixedString属性は文字列変数の長さを制限しないことは前回ですでに述べた通りである。では、いったいどこで、この長さは意味を持つのか。その実例を示すサンプルをお見せしよう。

 さて、ここでお見せするサンプル・ソースはランダム・ファイルの入出力を行うサンプルである。ファイル入出力関係に関しては、VB 6からVB.NETでは、まったくの別物といってよいほどの変貌を遂げている。VB.NET固有のステートメントとしていくつかの関数などがあるほか、.NET Frameworkクラス・ライブラリの入出力関連クラスもすべて使うことができる。どちらを使ってもよいのだが、伝統的なBASIC言語のランダム・ファイルを扱うには、VB.NET固有の関数を用いると便利である。

 以下は、VB 6で記述したランダム・ファイルを扱うサンプル・ソースである。

 1: Private Type Person
 2:    Age As Integer
 3:    Name As String * 32
 4: End Type
 5:
 6: Private Sub Form_Load()
 7:   Dim p As Person
 8:   Open "c:\test.dat" For Random As #1 Len = Len(p)
 9:   p.Age = 17
10:   p.Name = "太郎"
11:   Put #1, 1, p
12:   p.Age = 18
13:   p.Name = "花子"
14:   Put #1, 2, p
15:
16:   Get #1, 1, p
17:   Debug.Print p.Age
18:   Debug.Print p.Name
19:   Get #1, 2, p
20:   Debug.Print p.Age
21:   Debug.Print p.Name
22:   Close #1
23: End Sub
固定長のデータをファイルに書き込み、それを読み込むVB 6のサンプル・プログラム1

 これを実行すると以下のようになる。

-17-
太郎------------------------------
-18-
花子------------------------------
サンプル・プログラム1の実行結果
編集部注:黄色のハイフン(-)は半角スペースを示しています。

 Typeステートメントで定義した固定長のデータをPutステートメントで書き込み、Getステートメントで読み出している。これをVB.NET用に書き換えたのが以下のサンプル・ソースである。

 1: Public Class Form1
 2:   Inherits System.Windows.Forms.Form
 3:
 4: #Region " Windows フォーム デザイナで生成されたコード "
 5:
 6:   Private Structure Person
 7:     Public Age As Integer
 8:     <VBFixedStringAttribute(32)> Public Name As String
 9:   End Structure
10:
11:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
12:     Dim p As Person
13:     FileOpen(1, "c:\test.dat", OpenMode.Random, , , Len(p))
14:     p.Age = 17
15:     p.Name = "太郎"
16:     FilePut(1, p, 1)
17:     p.Age = 18
18:     p.Name = "花子"
19:     FilePut(1, p, 2)
20:
21:     FileGet(1, p, 1)
22:     Trace.WriteLine(p.Age)
23:     Trace.WriteLine(p.Name)
24:     FileGet(1, p, 2)
25:     Trace.WriteLine(p.Age)
26:     Trace.WriteLine(p.Name)
27:     FileClose(1)
28:   End Sub
29: End Class
サンプル・プログラム10をVB.NETで書き換えたサンプル・プログラム2

 これを実行すると以下のようになる。

17
太郎----------------------------
18
花子----------------------------
サンプル・プログラム2の実行結果
編集部注:黄色のハイフン(-)は半角スペースを示しています。

 Openステートメントの代わりにFileOpen関数、Putステートメントの代わりにFilePut関数、Getステートメントの代わりにFileGet関数、Closeステートメントの代わりにFileClose関数がそれぞれ使われている。書式が少し違うが、渡している引数の内容はほぼ同じである。FileOpen関数に渡しているいくつかの名前が異なっているが、基本的には同じ意味を持つキーワードが存在している。

 さて、肝心の8行目に記述されたVBFixedString属性の効能だが、13行目のLen関数、16、19行目のFilePut関数、21、24行目のFileGet関数の動作に影響を及ぼしている。Len関数は、文字列の長さに関係なく、VBFixedString属性の値を用いて構造体の長さを計算しており、ランダム入出力するための正しい構造体のバイト数を計算できる。またFilePut関数では、VBFixedString属性で指定された長さに足りない文字列には空白文字を補って、正しい長さでファイルに書き込みを行う。FileGet関数では、VBFixedString属性で指定された長さで文字列を取得している。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第4回 変数スコープと文字列関数
  1.ランダム・ファイルとVBFixedString属性 
    2.変数のスコープ
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間