• ベストアンサー

VisualBasic6からVB2005に移行に難儀しています。

.NETが流行りだした時期にパソコンから遠ざかっていましたので、昔作成したVB6のアプリケーションをVB2005に書き直そうと大それたことを考えています。 VB6のソースをVB2005に自動的に書き直すVisualBasic アップグレードウィザードで変換しましたが、案の定、変換エラーだらけでした。 Public easy(5) As Boolean等はそのまま変換していますが、Typeでユーザー定義型を作成した配列は、 以下のようにVB6だけの知識では理解不能な書き換えや説明が付加されていました。 StructureはTypeの意味だとわかりますが、<VBFixedArray((10))>や 変数を初期化する必要があるなど、どのタイミングで初期化する (追加記述しなければいけない部分が何なのか)わかりません。 また、ステートメントやメソッド?が異なる(アップグレード)されたとか 詳細についてクリックしてくださいとありますが、クリックしても無反応でした。 Structure AruKata Dim num As Byte <VBFixedArray((10))> Dim pos() As Byte 'char 'UPGRADE_TODO: この構造体のインスタンスを初期化するには、"Initialize" を呼び出さなければなりません。 ... Public Sub Initialize() ReDim pos(10) End Sub End Structure 'UPGRADE_WARNING: 配列 AruKata で各要素を初期化する必要があります。 詳細については... Public difficult(8) As AruKata このようにVB6からVB2005に移行するにあたって、よく説明している書籍など(あるのかな?)ありましたら教えてください。

  • hdkoa
  • お礼率0% (1/117)

質問者が選んだベストアンサー

  • ベストアンサー
  • MidKnight
  • ベストアンサー率57% (20/35)
回答No.1

VB6からVB2005への移行は、VBマイグレーションと呼ばれています。 マイクロソフトにもたくさん情報がありますし、書籍も出ています。 他の会社もサポート情報を出してたりします。 検索してもたくさん出てきますよ。 マイクロソフトのVBマイグレーションセンターを参考URLに入れておきますね。

参考URL:
http://www.microsoft.com/japan/msdn/vbasic/migration/

その他の回答 (1)

noname#221739
noname#221739
回答No.2

念のため。 数値を扱うデータ型は、VB6までとは異なり、JavaやC++などと相互ハンドリング可能にさせる為に、若干変更されてます。 あとは。 完全な、Class中心のオブジェクト指向で、作るようになった…ということが大きな違いですかね。 書店で、『VB6ユーザーがよく分かる、VB2005』なんて趣旨のハンドブックを斜め読みされると良いでしょう。 他には、@IT にも同様のコンテンツがありますし。

関連するQ&A

  • VB.NET2013多次元構造体の初期化について

    Visual Studio2013 VB.NETを始めたばかりです 多次元構造体の初期化で困ってました 内容的には Public Structure ST1 Public a1 As Boolean Public a2 As Integer <VBFixedArray((9), (2)), MarshalAs(UnmanagedType.ByValArray, sizeconst:=30)> _ Public a3(,) As Long Public Sub Initialize() ReDim a3(9, 2) End Sub End Structure Public ss1(0) as ST! Public Sub test() ss1.Initialize() ss1(0).a3(0,0)=0 この状態では、多次元配列は確保されなくNothingで 初期化できない、参照型であると言うのが分かり 色々と調べてみてやっと、 コピーコンストラクタを用意して複製する方法で出来るのが分かりました Public Sub New(ByVal ss As ST1) MyClass.a1 = ss.a1 MyClass.a2 = ss.a2 MyClass.a3 = DirectCast(ss.a3.Clone(), Long(,)) End Sub End Structure Public Sub test() Dim ss0 As ST1 ss0.a1 = True ss0.a2 = 1 ss0.a3 = New Longr(,) {・・・・} Dim ss1(0) As New ss0 ただa3のサイズが大きいため定義するのは大変なので Dim bb(9,2) As Long ss0.a3 = bb としても上手く初期化できるのが分かり そしてステップ実行で中を確認していると あれっと思い 「コピーコンストラクタを用意して複製」 の方法ではなく元のまま Public Sub test() Dim bb(9,2) As Long ss1.Initialize() ss1(0).a3=bb とすると、上手く初期化され ss1(0).a3(0,1) = 100 と処理できるようになりました ただ、これで本当にいいのかが分かりません よろしくお願いします

  • VB2005でバイト配列をコピーするには

    どなたかご教授下さい。 VB6で作成したプログラムをVB2005にコンバートしました。構造体からなる配列変数を一つの配列変数にコピー したいのですが、構造体の最初のメンバーだけ値が同じで以降の値は正しくセットされていませんでした。 どのように記述したらよいのでしょうか。またCopymMemory以外で良い方法があればご教授下さい。 よろしくお願い致します。 ===概略=== Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Byte, ByRef Source As Byte, ByVal Length As Short) 構造体定義 (コピー元) <StructLayout(LayoutKind.Sequential)>Structure ST_MOTO <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim byte_strTranCd() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Dim byte_strTanSeq() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim byte_strTxtNo() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim byte_strTxtSeq() As Byte End Structure Dim A As ST_MOTO (コピー先) <StructLayout(LayoutKind.Sequential)> Structure ST_SAKI Dim lngrecLen As Integer 'データのLength <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Dim bytrecData() As Byte 'データ End Structure Dim B As ST_SAKI Call CopyMemory(B.bytrecData(0), A.byte_strTranCd(0), 14) 出力結果 '最初の構造体のメンバーの値は正しく設定されている B.bytrecData(0) =80    A.byte_strTranCd(0) =80 B.bytrecData(1) =50    A.byte_strTranCd(1) =50 B.bytrecData(2) =57    A.byte_strTranCd(2) =57 B.bytrecData(3) =50    A.byte_strTranCd(3) =50 'これ以降は正しくない。(VB6だと正しく設定されている) B.bytrecData(4) =0     A.byte_strTanSeq(0) =80 B.bytrecData(5) =0     A.byte_strTanSeq(1) =87 B.bytrecData(6) =0     A.byte_strTanSeq(2) =48 B.bytrecData(7) =0     A.byte_strTanSeq(3) =48 B.bytrecData(8) =6     A.byte_strTanSeq(4) =55     ・              ・     ・              ・

  • vb.netでByte型の実配列サイズが大きい件

    vb.netでByte型の配列を100byteで宣言しましたが、実際の配列サイズは101byteになりました。 (例) Module Module1 Sub Main() Dim buffSize As Integer = 100 Dim inputBuff(buffSize) As Byte Dim ii As Integer = inputBuff.Length Console.WriteLine("バッファサイズ = {0}", ii) End Sub End Module ここで、iiは、101となります。 CとかC++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。

  • VB6のTYPE文をVB.NETのStructureに変えるとき

    VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。

  • VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法

    VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ???  '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。

  • VB2005でVC6.0で作成したDLLから値を取得するには

    VB6からVB2005にコンバートをしたのですがVCで作成したDLLの関数の箇所で下記エラーが出てしまいました。(VCのDLLは他で使用の為変更できず。) エラー内容 「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」 いろいろサイト等を調べたのですがうまくいきません。 Marshal.AllocCoTaskMem、Marshal.Copyなどを使用すればできるらしいのですが難しすぎて挫折しました。。 どなたかご教授下さい。 よろしくお願い致します。 VC側ソース(XXX.DLL) GetData( unsigned char far *pRec,   //データ short int *pRecLen,  //サイズ { Char cbBuf[1024]; //バッファ memset(cbBuf, ' ', 1024); //初期化 Call GetBuf(cbBuf); memcpy(pRec, cbBuf, *pRecLen); return(0) ; } VB2005のソース <StructLayout(LayoutKind.Sequential)> Structure St Dim A () As Byte Dim B () As Byte End Structure Declare Function GetData Lib "XXX.DLL" (Byref RecData As St , ByRef Reclen As Short) As Short Sub Dim TmpData As St Dim TmpLen As short =100 Dim X As Byte Dim Y As Byte Redim TmpData.A(49) Redim TmpData.B(49) Call GetData(TmpData, TmpLen) X =TmpData.A(0) Y =TmpData.B(1) ・ ・ End Sub

  • VB6→VB2005アップグレードの際のエラー

    VBを勉強中です。段階としては書籍やサイトの見本プログラムを いくつか真似て作っているところです。 質問ですがVB6で作られたプログラムのバージョンアップを 行っています。VS2005を使いアップグレードを行った際 UPGRADE_WARNINGが発生し、デバッグできない状態です。 エラーを潰してデバッグしたいのですが、どう直して良いのか 教えて下さい。 "配列型の次元数が異なるため、型 'Object の 2 次元配列' の値を 'Object の 1 次元配列' に変換できません。" 構文は以下の通りです。 Public Sub Sort(ByRef Ar() As Object, ByRef rs As Integer, ByRef cs As Integer, ByRef Re As Integer, ByRef ce As Integer, ByRef keyc As Integer) Dim i As Integer Dim j As Integer Dim k As Integer Dim aa As Object For i = rs To Re - 1 For j = i + 1 To Re 'UPGRADE_WARNING: オブジェクト Ar(j, keyc) の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト Ar(i, keyc) の既定プロパティを解決できませんでした。 If Ar(i, keyc) > Ar(j, keyc) Then For k = cs To ce 'UPGRADE_WARNING: オブジェクト Ar(i, k) の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト aa の既定プロパティを解決できませんでした。 aa = Ar(i, k) 'UPGRADE_WARNING: オブジェクト Ar(j, k) の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト Ar(i, k) の既定プロパティを解決できませんでした。 Ar(i, k) = Ar(j, k) 'UPGRADE_WARNING: オブジェクト aa の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト Ar(j, k) の既定プロパティを解決できませんでした。 Ar(j, k) = aa Next End If Next Next End Sub

  • VB2005のファイル読込でDo While Not EOFを使用するには?

    いつもお世話になります。VB2005でテキストファイル(中身は1レコードのみ)をFileOpen関数の ランダムアクセスを使用し、FileGet関数で値を取得しました。しかし、取得後に続くDo While Not EOF~LOOP内の 処理が実行されません。同じファイルでVB6版で使用したら問題なく実行されたのですが。 どのように対応したらよろしいのでしょうか? よろしくお願い致します。 ソース Structure TypeUkeData '(Length = 100) <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Dim b_UkeDate() As Byte  '受付日 <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Dim b_UkeTime() As Byte   '受付時刻 <VBFixedArray(3), MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim b_UkeCnt() As Byte '件数 <VBFixedArray(79), MarshalAs(UnmanagedType.ByValArray, SizeConst:=80)> Dim b_UkeNaiyo() As Byte '内容 Public Sub Initialize() ReDim b_UkeDate(7) ReDim b_UkeTime(7) ReDim b_UkeCnt(3) ReDim b_UkeNaiyo(79) End Sub End Structure Sub ReadFile Dim b_UkeData As TypeUkeData Dim i_FileNo As Short Dim i_RecNo As Short call b_UkeData.Initialize() i_FileNo = FreeFile() FileOpen(i_FileNo, "C:\UkeData.tmp", OpenMode.Random, , , 100) ' 最初のレコードを読み込む i_RecNo = 1 FileGet(i_FileNo, b_UkeData, i_RecNo) ←b_UkeDataに確かに値は入っている Do While Not EOF(i_FileNo)  ←ループ内の処理に一度も入らず次のFileCloseにいってしまう CALL SubSpilit(b_UkeData) ' 次のレコードを読み込む i_RecNo = i_RecNo + 1 FileGet(i_FileNo, b_UkeData, i_RecNo) Loop FileClose(i_FileNo) End Sub

  • VB6.0 →VB2005 のアップグレードでエラー表示

    VB6.0の標準モジュールでは Private Type typset a As String b As String c As Integer End Type Public make() As typset と記述してエラーもなく正常なのですが、VB2005にアップグレードしたときに、 Option Strict Off Option Explicit On Module Module1 Private Structure typset Dim a As String Dim b As String Dim c As Integer End Structure Public make() As typset←▼エラー▼            End Module 【エラー内容】 'make' は、module 'Module1' をとおして型 'typset' を namespace 'WindowsApplication1' で公開することはできません。 structure部をPublicなどにしてもエラーは消えますが、参照先に影響が出てしまいます。 根本的な解決方法が分かりません。 教えていただけないでしょうか?

  • VB.NETのStructureの使い方を教えてください。

    Publicの宣言をしてStructureを使いたいのですが、 2重になっているStructureを使う正しい方法を教えて頂きたいです。 現在 Structure OYA Dim zzz As String Structure KO_1 Dim No1 As String Dim No2 As String Dim No3 As String End Structure End Structure Public TESTOYA As OYA Public TEST_1 As OYA.KO_1 Sub ABCDE() TEST_1.No1 = 1 TESTOYA.KO_1.No1 = 1 End Sub というようになっているのですが、 Sub ABCDE()内の TESTOYA.KO_1.No1 = 1 という使い方をしたいのですが、この状態だとエラーになってしまいます。 TEST_1.No1 = 1 とすれば大丈夫なのですが、これだと OYAを入力してメンバを出すことが出来ないので、2重にする意味がなくなってしまいます。 KO_1は実際はKO_50くらいまであって 実際は連番ではないので、OYA.と入力したら、KOのメンバが出て その後、No1などのメンバが出て欲しいです。 (入力しやすいように) この様な使い方があれば正しい記入方法をご教授願えないでしょうか。 それと、最初の変数zzzの宣言は要らないのですが、 これを省くとエラーになってしまいます。 この部分も正しい使い方ではないように思うのですが、 ご教授頂ければ幸いです。

専門家に質問してみよう