こんにちは
VB6.0で、以下のような宣言をしていて
Type Person
Name As String * 10
End Type
これをVB.NETで同じようにしたい。
です。
いろいろやっているのが全く同じにすることが出来ません。
・サイズが10バイトであること。(SizeOfで図って)
・10文字に満たない場合、残りはスペース埋めになること。
・最大で10文字設定出来ること。
以上を満たしたいのですが、1つをクリアしても残りが
ダメだったりしてうまく行きません。
どなたかご存知ないでしょうか?
> これをVB.NETで同じようにしたい。
.NETには.NET向けのコーディングスタイルがありますから、
無理にVB6スタイルの言語仕様を引き継ごうとすると、
かえって難しくなってしまかも知れませんよ。
VB.NETには固定長文字列という機能がありませんし、
VB.NETの構造体はVB6のユーザー定義型とは、
厳密には異なるものなので、それら3つの条件を
同時にクリアするのは難しいです。
ファイル入出力など、限定された条件下であれば、
<System.Runtime.InteropServices.MarshalAs( _
System.Runtime.InteropServices.UnmanagedType.ByValTStr, _
SizeConst:=100), VBFixedString(10)> _
といった属性を付加する事で、ある程度の目的は果たせますが、
完全にVB6と同じ仕組みとなると無理でしょうね。
> ・サイズが10バイトであること。(SizeOfで図って)
あれ? VB6の仕様は「10文字」であって、「10バイト」では無いはずですよ。
厳密に10バイトにしたいなら、Byte配列を使ってください。10文字なら、Char配列でしょうか。
ただし、配列の初期化は自前で行う必要があります。
(Initializeという名前のメソッドを用意して、それを呼び出す手法が良く利用されます)
> 10文字に満たない場合、残りはスペース埋めになること。
構造体に、スペース埋めを行うPropertyを実装する事で対処できる化も知れません。
ただ、変数の初期化は自前で行う必要があるでしょうね。
Private _Name As String
Property Name() As String
Set(ByVal Value As String)
_Name = Value.PadLeft(10).Substring(0, 10)
End Set
Get
Return _Name
End Get
End Property
上記は間違い。PadLeft → PadRight でした。m(__)m
そうですね。
出来ないんですよね。
> ・サイズが10バイトであること。(SizeOfで図って)
> ・最大で10文字設定出来ること。
この二つはCharの配列にすることで可能なのですが
> ・10文字に満たない場合、残りはスペース埋めになること。
これを満たすことが出来ないんですよね。
設定する側でLSet(xxx,10)してもらうぐらいしか方法が
思いつきません。
なにかイイ方法はないでしょうか?
> 設定する側でLSet(xxx,10)してもらうぐらいしか方法が
> 思いつきません。
> なにかイイ方法はないでしょうか?
項目を直接操作させるのではなく、読み書き用のプロパティを作って、
そのプロパティに空白を補完させるという手法を、先の回答で提示しましたが、
それではだめなのでしょうか?
すみません。やり方をしくっていました。
教えていただいた方法で解決しました。
ありがとうございました。
VBFixedStringAttribute
ツイート | ![]() |