Basicで文字列といったら、$マークをくっつけた変数や、String型で定義した変数を利用するんじゃ…
おっしゃる通り、以前までのBasicでは文字列といえば、String型変数でした。
しかしこのString型変数、扱いはとても簡単ですが、落とし穴もあります。難しい話になってしまいますが、文字列バッファ用のメモリを確保したり、解放したりする処理を独自に行っているため、Win32API用をはじめとするいくつかの機能はこれらメモリ操作のことを考慮してくれません。String型変数は、独自のプログラム内でのみの利用ならなんの問題もありませんが、Windowsアプリケーションの開発を行っていく上で、どうしても無理が生じる場合があります。
そこで登場するのか、Byte配列の変数。メモリ確保、解放などの処理が必要ないため、比較的単純な構造をしています。こちらもコツさえつかんでしまえば、扱いはとても簡単です。C言語を経験したことがあるかたなら、以下のプログラムが同等のものであるといえば、一発で理解できるでしょう。
Dim a[100-1] As Byte
イコール
char a[100];
ActiveBasicでは、Win32APIなどを通し、Windowsアプリケーション開発を行う場合は、なるべくByte配列を利用することを推奨します。ここから以下は、Byte配列の変数を利用した文字列操作の方法を紹介します。
Byte配列のデータ構造
Byte配列の文字列は、定義した範囲内の長さを持つ、 NULL終端の非常にシンプルな構造をしています。NULLとは、文字コード0のデータのことを意味します。
通常、配列変数のデータを扱うときは a[0]、a[1] などというように、変数名の後にカッコをつけ、任意の配列要素を指定します。文字列内の任意の文字を扱うときはこの表記方法を用いますが、文字列の先頭ポインタを扱うときは、変数名だけを指定することがあります。少しややこしい話になりますが、以下の2つの意味は同じになります。
a
イコール
VarPtr(a[0])
文字列のコピー
Dim FilePath[255] As Byte
Dim path2[255] As Byte
lstrcpy(FilePath,"C:\My Document\hp\index.html")
lstrcpy(path2,FilePath)
MessageBox(0,path2,"文字列テスト",MB_OK)
先頭の2行のDim命令で、256バイトずつ(合計512バイト)文字列用のバッファを定義しています。
次に、FilePath配列に、"C:\My Document\hp\index.html" という文字列をコピーし、更にそれをpath2配列にコピーしているのがわかります。このように、lstrcpy関数を利用すれば、Byte配列同士、文字列のコピーを行うことができます。
lstrcpy(コピー先のバッファポインタ, コピー元のバッファポインタ)
Byte配列に対して、a="ABCDEFG" や、a=a+b などといった演算はできないので、慣れるまでは注意しましょう。
文字列の連結
試しに、馴染みの深いString型変数を利用して文字列連結の操作を行ってみましょう。
Dim a As String
Dim b As String
a="ABCDEFG"
b="1234567"
a=a+b
MessageBox(0,a,"test",MB_OK)
これと同じ動作をByte配列を用いて再現すると、以下のようなプログラムに書き換えることができます。
Dim a[255] As Byte
Dim b[255] As Byte
'文字列をセット
lstrcpy(a,"ABCDEFG")
lstrcpy(b,"1234567")
'文字列aに文字列bを連結させる
lstrcat(a,b)
MessageBox(0,a,"文字列テスト",MB_OK)
lstrcatは、文字列連結のための関数であり、以下のようなパラメータを持ちます。
lstrcat(連結先文字列, コピー元文字列)
文字列の消去
任意の個所の文字列を消去するのは、Byte配列の得意分野かもしれません。
Dim a[100] As Byte
'文字列をセット
lstrcpy(a,"ABCDEFG1234567")
'後半の数値部分を削除
a[7]=0
MessageBox(0,a,"文字列テスト",MB_OK)
上のプログラムのように、消去したい文字列を示す位置に0を入れるだけで実現できます。この0というのは、一般的に、NULL文字と呼ばれるもので、文字列の終端部分を表すときに用いられます。
BytePtr型の変数
BytePtr型変数とは、Byte配列の先頭ポインタを管理する変数のことを指します。先頭ポインタの変更ができる点を除けば、Byte配列と扱い方は変わりません。
Dim FilePath[100] As Byte
Dim pBuf As BytePtr
'文字列をコピー
lstrcpy(FilePath,"C:\My Document\hp\index.html")
'FilePathの先頭ポインタをpBufに格納
pBuf=FilePath
' ファイル名"index.html"を消去
pBuf[17]=0
MessageBox(0,pBuf,"文字列テスト",MB_OK)
最終更新:2010年06月23日 22:08