• 締切済み

定数を構造体で・・・

こんにちわ。 ちょっと疑問に思いまして、お聞きしたいのですが。 VB.net2005を使用しています。 定数宣言を構造体で宣言するのは 考え方として変でしょうか? たとえば public structure TEST   public dmy as byte '←エラー解除のダミー   public const CNUM as integer = 1 end structure public sub testM()   Lbl1.Text = TEST.CNUM end sub のように作り 定数宣言が多くあった場合に いちいちページ切り替え等をしなくても TEST.と打った後にすぐに一覧がでてくるので 便利だと思ったのですが。 この考え方はやっぱりへんなんですかね? もともとC言語出身なもので、 色々試していて疑問におもったのです。 もっとほかによい方法あるよ!ってのが あればお教えください。 お暇なときでよいので回答お願い致します^^   

みんなの回答

回答No.3

私なら構造体よりクラスを使います。以下のような感じで。 Public NotInheritable Class TEST Public Const CNUM As Integer = 1 End Class 構造体の場合、 public dmy as byte というメンバを持たせてますね。 きっと質問者さんも不本意ながら、何も無いとエラーになるので仕方なく入れているのではないかとお察しします。 クラスなら、上のように必要な定数だけでも大丈夫です(^^) また、Enumと違いString型でも使えますよ。 あと気になったので。 No1さんへの回答への補足で、 >VS VB.net2005ではTEST.と打った時点では >ENUMの場合出てこないですね。 とありますが、TEST.と打った時点で出ませんか? 私は出ましたが。

  • isomaru
  • ベストアンサー率33% (1/3)
回答No.2

はじめまして この質問は、定数か構造体どちらの質問でしょうか? 定数ならEnumで解決できると思います 構造体は以下のようにすれば使用できます。 ●標準モジュール Option Explicit '(1)構造体の宣言 '(宣言なので定数は指定できません) Public Type TEST cc As Byte CNUM As Integer End Type '(2)構造体の実装 'Cでも同じですね Public ttest As TEST ●Formのコード Option Explicit Private Sub TestM() Text1.Text = ttest.CNUM End Sub Private Sub Form_Load() '(3)CNUMの初期化 ttest.CNUM = 1 End Sub 構造体は非常に便利なのでよく使用します (例えば関数の戻り値等) が、VBではCのような初期化が出来ないのが難点ですね。

kspring
質問者

補足

ご返答有難うございます。 定数と構造体の両方の質問です。 isomaruさんの場合VB.net2005ではないように思えます。 私自身、VB.net2005しか使ったこと無いので いまいち判りませんが。 「type」はサポートされていません。と出ます。 実際に私の質問のコードを書いた場合 構造体の宣言部分ですが・・・・なぜか定数を定義することが出来。 かつ、正常に動きます・・・ 構造体の概念的には、たしかにずれてるのですが・・・ OBJ思考のデータを中心とした考えの場合、ずれてないようにも 思えます。 あくまで、人それぞれの考え方もあると思うので どうなのかな?程度に質問しました・・・ 判りにくい文章で、申し訳ございません。

  • unamana19
  • ベストアンサー率62% (56/89)
回答No.1

Enum(列挙型)があるので、そちらで実現できます。 Public Enum TEST As Integer   CNUM = 1 End Enum

kspring
質問者

補足

ご回答有難うございます。 返答が遅くなりすみません。 VS VB.net2005ではTEST.と打った時点では ENUMの場合出てこないですね。 質問の内容がわかりにくくすみません。 内容としては、定数を構造体で持つことで 開発時のストレスを軽減するために、このような 方法で行ってる人はいるのかな? 程度でした・・・ 実際に定数を管理する上で、ある程度名前を記憶していますが 一部忘れることが多々あり、上記のような方法を思いついたのです。 VB.net2005ではエラーもなく、問題なく動作していたので。 あとENUMだとString型は持てないので、上記の方法はどうなのかな? というのもありました。(これは情報不足でした。)

関連するQ&A

  • 定数の宣言ってdimは使えないのですか?

    VBAです。 標準モジュールに Option Explicit Public Const フォルダ名 As String = "新しいフォルダー" Sub aaaa() End Sub はできるのですが、 Option Explicit dim Const フォルダ名 As String = "新しいフォルダー" Sub aaaa() End Sub は、エラーになってしまいます。 Option Explicit Sub aaaa() dim Const フォルダ名 As String = "新しいフォルダー" End Sub もダメみたいです。 定数を使うときは、必ずPublicで宣言しなけらばいけないのでしょうか?

  • 定数にFullNameは使えないのですか?

    アクセスで、 Sub aaa() Const sPath As String = CurrentProject.FullName MsgBox sPath End Sub をすると、「定数式が必要です。」問われるのですが、上記のように定数に自身のfaiある名を入れたいのですが、無理なのでしょうか?

  • 定数と変数、どちらを使った方がいいか?

    vbaの勉強中なので教えてください。 Sub 定数を使った場合() Const moji = "あああ" MsgBox moji End Sub Sub 変数を使った場合() Dim moji As String moji = "あああ" MsgBox moji End Sub 二つのサンプルは答えは一緒なのですが プログラムを作るにおいてどちらを使った方が良いのでしょうか? このサンプルならどっちでもいいのでしょうか?

  • 構造体をランダムファイルに書き込みたいのですが

    .NETで構造体をランダムファイルに書き込む処理を作成していますが、エラーになります。 構造体宣言は Public Structure aaa   Public aa as DateTime   Public bb() as int16   Public Sub Init()     ReDim bb(100)   End Sub End Structure Public wData As New aaa ファイル登録時に FileOpen(iFileNo, sFileName, OpenMode.Random, , , len(wData)) FileOut(iFileNo, wData, iRecord) 上記のFilePutを実行した時点で、 「レコード長が正しくありません」 とエラーが出ます。 オープンするファイルナンバーやレコードは、 初回登録時は共に、1で問題ありません。 VBのイメージで作成したのですが、どうもうまくいきません。 なにとぞ、お教えください。

  • VB2008で構造体を引数とした時にエラー

    VB2008の勉強を始めて数週間の初心者です。 勉強用にいろいろとプログラムを作っているのですが、 構造体(Structure)を引数で渡して戻り値を取得する Functionを作成してみました。 同一クラス内のPrivate Function の場合は問題ないのですいが、 追加した別クラスに Function を作成したところ 「 型 'TEST_A.Form1.str_IN' の値を 'TEST_A.Class1.str_IN' に変換できません。」 のエラーが表示されてしまいます。 別クラスのFunctionを使用する時、引数には構造体は指定できないのでしょうか? なにか文法上の誤りがあるのでしょうか? 初心者なので変な質問してたらスイマセン。 詳しい方がいらっしゃいましたらよろしくお願いします。 ------------------------------------------------------ Public Class Form1  Public Structure str_IN   Public in_aaa As String  End Structure  Private Sub Button1_Click(ByVal sender As System.Object,  ByVal e As System.EventArgs) ~   Dim stin As New str_IN   '------------------------------------   stin.in_aaa = "aaa"   Label1.Text = Test_Sub(stin) '<------- これはok   '-------------------------------------   Dim cls = New Class1   stin.in_aaa = "aaa"   Label1.Text = cls.CFnk(stin) '<----- エラーになる  End Sub  Private Function Test_Sub(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class ------------------------------------------------------------ Public Class Class1 '新たに作成したクラス  Public Structure str_IN   Public in_aaa As String  End Structure  Public Function CFnk(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class

  • 構造体のコピー

    VB6ですが、構造体のコピーは正しくできるのでしょうか type a test1(0 to 5) as byte test2 as integer test3 as string end type dim b1 as a dim c1 as a b1.test = 2 c1 = b1 私はここで、c1.test2が0だった

  • Form1.vbに書いた定数をModule1.vbでも使うには?

    Form1.vbには Public Class Form1Form Public Const 横幅 As Long = 1200 と書いています。 そして、 Module1.vbに Sub 共通_横幅() Form1Form.Width = 横幅 End Sub と書くと、 「名前 '横幅' は宣言されていません。」 となります。 Form1.vbの Public Class Form1Formの上に 「Public Const 横幅 As Long = 1200」 を移動しても 「名前空間のステートメントが無効です。」 となります。 どうすれば Form1.vbで宣言した定数をModule1.vbで使用することができるのでしょうか? スコープを「Public」にしただけではだめなのでしょうか? Class Form1Form.Width = 横幅 にしてもだめでした。 よろしくお願い致します。

  • Public 定数が認識されない

    vb2010を使用しています。form1でPublic Const PASS_WORD As String = "12345"と宣言します。form1から呼び出したウィンドウform2では、次のようなコードです。 Public Class form2 Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles btnOK.Click Dim f As form1 f = Me.Owner If Me.TextBox1.Text = PASS_WORD Then Me.DialogResult = DialogResult.OK End If End Sub End Class このとき「PASS_WORDは宣言されていません。」というエラーが発生します。form1で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の宣言は要らないのですが、 これを省くとエラーになってしまいます。 この部分も正しい使い方ではないように思うのですが、 ご教授頂ければ幸いです。

  • 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 と処理できるようになりました ただ、これで本当にいいのかが分かりません よろしくお願いします

専門家に質問してみよう