VB初心者のものです。
VB.Net(2003)で開発をしていて詰まっています。
内容は表題の通り方の違う構造対同士のコピーができないというものです。
例えば
Structure KANRI
Dim strSyubetu As String
Dim strSyohinCode As String
Dim strFiller As String
End Structure
dim KANRI_REC as KANRI
Structure HENPIN
Dim strSyubetu As String
Dim strDenpyoKubun As String
Dim strSyohinCode As String
Dim strSuryo As String
Dim strHenpinKubun As String
Dim strFiller As String
End Structure
dim HENPIN_REC as HENPIN
という2つの構造体があるとして
HENPIN_RECからHENPIN_RECへコピーするためには
どのようなコードで書けばいいのでしょうか?
VB6.0まではLSetなどでできていたようですが。。。
構造体の各メンバは<VBFixedString(8)> などで
レングスの指定をしていてコーディング上は構造体の
各メンバの合計は40文字分となるようにはしています。
よろしくご教示ください。
全ての文字列が固定長である事が保証されているなら、各メンバを
連結した値を返す/設定するようなプロパティを実装するとか。
Structure KANRI
Dim strSyubetu As String '1文字
Dim strSyohinCode As String '2文字
Dim strFiller As String '5文字
Public Property Value() As String
Get
Return Me.strSyubetu & Me.strSyohinCode & Me.strFiller
End Get
Set(ByVal Value As String)
Me.strSyubetu = Value.Substring(0, 1)
Me.strSyohinCode = Value.Substring(1, 2)
Me.strFiller = Value.Substring(3, 5)
End Set
End Property
End Structure
こんな感じにしておいて、
HENPIN_REC.Value = KANRI_REC.Value
という感じで。
魔界の仮面弁士様ご教示ありがとうございます。
構造体にもプロパティが設定できるとは知りませんでした。
目から鱗デス。
構造体の数が多い場合はコーディング量もかなりのものになると思いますが、ポインタを取得してメモリコピーのような方法をご存知の方は
いらっしゃいませんでしょうか?
RtlMoveMemoryなども試してみたのですが、パラメータの与え方が悪いのか
うまくいかないのですが。。。
> 構造体の数が多い場合はコーディング量もかなりのものになると思いますが、
であれば、リフレクションでメンバを列挙するとか。
<StructLayout(LayoutKind.Sequential)> _
Structure MyStructure
Dim A As String
Dim B As String
Dim C As String
End Structure
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Test As MyStructure
Dim T As Type = GetType(MyStructure)
Test.A = "あいうえお"
Test.B = "かきくけこ"
For Each F As Reflection.FieldInfo In T.GetFields()
Dim O As Object = F.GetValue(Test)
If O Is Nothing Then
MessageBox.Show(F.Name & " = Nothing")
Else
MessageBox.Show(String.Format("{0} = ""{1}""", F.Name, F.GetValue(Test)))
End If
Next
End Sub
もし、メンバの順番が重要な場合は、適当なカスタム属性を各フィールドに
与えておき、それを使って順番を識別するとか。。。
> RtlMoveMemoryなども試してみたのですが、パラメータの与え方が悪いのか
> うまくいかないのですが。。。
VB6でも、「As String」(自由長文字列型)を含んだユーザー定義型は、
LSetやRtlMoveMemoryではコピーできず、メンバ毎に個別に複写する
必要がありましたよね。VB.NETも同様なのでは。
魔界の仮面弁士様重ねてのレス本当にありがとうございます。
おかげで前に進むことができそうです。
> VB6でも、「As String」(自由長文字列型)を含んだユーザー定義型・・・
実はVBを触るのはかなり久しぶりでして、実際に開発で触ったのは
VB6どころかVB2以来てな具合なのです。。。
VB6からの変更などはMSのヘルプ含めてあちこちで見るのですが、
私にとってはあまり意味がないものですから、本当に助かりました。
また何かありましたらよろしくお願いします。
ツイート | ![]() |