型の違う構造体をコピーするには

解決


C言語じじい  2004-06-17 18:19:16  No: 84073

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文字分となるようにはしています。

よろしくご教示ください。


魔界の仮面弁士  2004-06-17 19:12:31  No: 84074

全ての文字列が固定長である事が保証されているなら、各メンバを
連結した値を返す/設定するようなプロパティを実装するとか。

 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
という感じで。


C言語じじい  2004-06-17 22:07:12  No: 84075

魔界の仮面弁士様ご教示ありがとうございます。
構造体にもプロパティが設定できるとは知りませんでした。
目から鱗デス。

構造体の数が多い場合はコーディング量もかなりのものになると思いますが、ポインタを取得してメモリコピーのような方法をご存知の方は
いらっしゃいませんでしょうか?
RtlMoveMemoryなども試してみたのですが、パラメータの与え方が悪いのか
うまくいかないのですが。。。


魔界の仮面弁士  2004-06-17 23:51:21  No: 84076

> 構造体の数が多い場合はコーディング量もかなりのものになると思いますが、

であれば、リフレクションでメンバを列挙するとか。

 <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も同様なのでは。


C言語じじい  2004-06-18 00:07:35  No: 84077

魔界の仮面弁士様重ねてのレス本当にありがとうございます。
おかげで前に進むことができそうです。

> VB6でも、「As String」(自由長文字列型)を含んだユーザー定義型・・・
実はVBを触るのはかなり久しぶりでして、実際に開発で触ったのは
VB6どころかVB2以来てな具合なのです。。。
VB6からの変更などはMSのヘルプ含めてあちこちで見るのですが、
私にとってはあまり意味がないものですから、本当に助かりました。
また何かありましたらよろしくお願いします。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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