• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB6構造体をVB2008クラスで行う場合)

VB6構造体をVB2008クラスで行う場合のポイントとは?

このQ&Aのポイント
  • 「VB6構造体をVB2008クラスで行う場合」について、初心者の方向けにポイントを解説します。
  • Sharedキーワードの使い方や、メソッドの分け方についてご説明します。
  • また、クラスとコレクションクラスを組み合わせる際の注意点についても触れます。

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

  • ベストアンサー
noname#259269
noname#259269
回答No.2

何が言いたいのか、日本語はあいかわらずよくわからないのですが、バグっているところは分かったので。 NG箇所: newtag メソッドの1行目 ADDTAG を呼び出すたびに Me.DataDict (NewGroupの入れ物)を作成しなすことになっていませんか? よく考えてみましょう。

kakedasi_pg
質問者

お礼

修正点は(御指摘通り)  Me.DataDict = New CLS_TagGroupCollection ←これを 自クラス内 Sub New()へ移動し問題解決致しました。 私の理解力不足かと思われますがうまく説明できず申し訳ありません。 尚且つ読みづらいコードを読んで頂いた物かと思われます。 御指摘にて修正&TESTを行い無事思い通りに動かすことができました。 もっと精進したいと思います・・・・・。 誠にありがとうございました。

その他の回答 (1)

noname#259269
noname#259269
回答No.1

(1) Shared を付けると、Class 名+.+メソッド名で呼び出せるようになります。この例だと呼出し元からは     Program.Main() という形で呼び出せます。Shared を付けないと、クラスのインスタンスを作成しないと呼べません(下記)。     Dim p As New Program()     p.Main() (2)どうやった結果どううまくいかないのか、自分の試した結果を書きましょう。

kakedasi_pg
質問者

お礼

Shared承知いたしました 御回答ありがとうございます。 申し訳ありません以下、参考よりテストしているコードとなります。 データのクラス+コレクションクラスにて参考例  Public Class Program Public Shared Sub Main() (省略) をタグ(データ)の追加,参照用に  Public Class Cls_TagProgramへ改造し 使用するフォーム直下に(Public Class Form_*** ) Public OBJPLCPRG As New Cls_FolderProgram にて生成しておき、テスト的にPBなどにてOBJPLCPRGより登録、参照をはしらせましたが 生成時のみしか参照できません・・・・・。 クラス(インスタンス生成)について理解不足と認識してはいるのですが 同一インスタンスを参照できていない?か、インスタンスが消失している? (そもそも手法の間違えなのでしょうか・・・・) 初心者ながら四苦八苦している所ですので御教示頂けると幸いです。 よろしくお願い致します。 Tab表示されず? 見づらくて申し訳ありません・・・。 '=========================================================== 'タグのクラス Public Class Cls_TagGroup Private intTagID As Integer 'タグの番号(ID) Private strTagName As String 'タグの名称 Private strTagCome As String 'タグのコメント 'タグの番号(ID) Public Property PLC_TagID() As Integer Get Return Me.intTagID End Get Set(ByVal value As Integer) Me.intTagID = value End Set End Property 'タグの名称 Public Property PLC_TagName() As String Get Return Me.strTagName End Get Set(ByVal value As String) Me.strTagName = value End Set End Property 'タグの名称 Public Property PLC_TagCome() As String Get Return Me.strTagCome End Get Set(ByVal value As String) Me.strTagCome = value End Set End Property End Class '=========================================================== 'タグのコレクションクラス(辞書コレクションンを使用) Public Class Cls_TagGroupCollection : Inherits System.Collections.Generic.Dictionary(Of Integer, Cls_TagGroup) Public Shadows Sub Add(ByVal Item As Cls_TagGroup) MyBase.Add(Item.PLC_TagID, Item) End Sub End Class '=========================================================== 'タグのクラス+コレクションクラス 'タグの追加,参照用にアプリよりこのクラスを使用 Public Class Cls_TagProgram Private DataDict As CLS_TagGroupCollection Private NewGroup As CLS_TagGroup Private intTagNo As Integer 'タグの番号 'インスタンス初回生成時実行 Public Sub New() intTagNo = -1 '開始番号を0とする為-1とする。 End Sub 'タグの追加 Public Sub ADDTAG(ByVal strName As String, ByVal strCome As String) intTagNo = intTagNo + 1 'タグID番号は0からオートNO newtag(intTagNo, strName, strCome) End Sub Private Sub newtag(ByVal intNO As Integer, ByVal strName As String, ByVal strCome As String) Me.DataDict = New CLS_TagGroupCollection Me.NewGroup = New CLS_TagGroup NewGroup.PLC_TagID = intNO NewGroup.PLC_TagName = strName NewGroup.PLC_TagCome = strCome DataDict.Add(NewGroup) End Sub 'タグの参照 TagID Public Function VIEW_IntTagID(ByVal intNO As Integer) As Integer If intNO <= intTagNo Then 'ID登録済みか? Return Me.DataDict.Item(intNO).PLC_TagID ' 'Console.WriteLine(Me.DataDict.Item(intNO).PLC_TagNO) 'デバック用 Else End If End Function 'タグの参照 TagName Public Function VIEW_StrTagName(ByVal intNO As Integer) As String If intNO <= intTagNo Then 'ID登録済みか? Return Me.DataDict.Item(intNO).PLC_TagName ' 'Console.WriteLine(Me.DataDict.Item(intNO).PLC_TagName) 'デバック用 Else Return "" End If End Function 'タグの参照 TagCome Public Function VIEW_StrTagCome(ByVal intNO As Integer) As String If intNO <= intTagNo Then 'ID登録済みか? Return Me.DataDict.Item(intNO).PLC_TagCome ' 'Console.WriteLine(Me.DataDict.Item(intNO).PLC_TagCome) 'デバック用 Else Return "" End If End Function End Class

関連するQ&A