VB6と同じ固定長型するには?

解決


self  2004-04-04 02:56:08  No: 112633

こんにちは
VB6.0で、以下のような宣言をしていて

Type Person
    Name As String * 10
End Type

これをVB.NETで同じようにしたい。
です。
いろいろやっているのが全く同じにすることが出来ません。
・サイズが10バイトであること。(SizeOfで図って)
・10文字に満たない場合、残りはスペース埋めになること。
・最大で10文字設定出来ること。
以上を満たしたいのですが、1つをクリアしても残りが
ダメだったりしてうまく行きません。
どなたかご存知ないでしょうか?


魔界の仮面弁士  2004-04-04 10:03:53  No: 112634

> これを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


魔界の仮面弁士  2004-04-04 14:06:59  No: 112635

上記は間違い。PadLeft → PadRight でした。m(__)m


self  2004-04-04 19:15:58  No: 112636

そうですね。
出来ないんですよね。
> ・サイズが10バイトであること。(SizeOfで図って)
> ・最大で10文字設定出来ること。
この二つはCharの配列にすることで可能なのですが

> ・10文字に満たない場合、残りはスペース埋めになること。
これを満たすことが出来ないんですよね。
設定する側でLSet(xxx,10)してもらうぐらいしか方法が
思いつきません。
なにかイイ方法はないでしょうか?


魔界の仮面弁士  2004-04-07 08:10:54  No: 112637

> 設定する側でLSet(xxx,10)してもらうぐらいしか方法が
> 思いつきません。
> なにかイイ方法はないでしょうか?

項目を直接操作させるのではなく、読み書き用のプロパティを作って、
そのプロパティに空白を補完させるという手法を、先の回答で提示しましたが、
それではだめなのでしょうか?


self  2004-04-08 07:59:01  No: 112638

すみません。やり方をしくっていました。
教えていただいた方法で解決しました。
ありがとうございました。


はや  2004-08-12 08:08:33  No: 112639

VBFixedStringAttribute


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加