- 締切済み
Visual Basic 2005 クラスライブラリの使い方
異なるクラス間で共通の変数aを使いたいのですが、うまくいきません。あるクラスForm1でaを宣言しても他のクラスClass1でも宣言しないとエラーが出てしまいます。 以下のクラスをデバイスアプリケーションとして作成し、 Public Class Form1 Public a As Integer = 100 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Test As New MyLibrary.Class1 Test.Plus1() MsgBox(a, MsgBoxStyle.Information, "実験") End Sub End Class 以下のクラスをクラスライブラリMyLibraryとして作成します。 Public Class Class1 Dim a As Integer = 0 Public Sub Plus1() a += 1 End Sub End Class Form1でボタンを押すと、メッセージボックスに100と表示されます。 (関数Plus1の効果なし) ちなみにClass1の「Dim a」を「Static a」にしてクラスライブラリ(DLL)を最初に呼び出したときだけ初期化すればよいと思ったのですが、そうすると「'Static' は、メンバ変数宣言では有効ではありません。」というエラーが出てしまいます。 解決方法をご存知の方、ご教授願います。 また、クラスライブラリ(DLL)を作成するとまとまりができてプログラムの変更がしやすいと思いますが、やはり処理速度が遅くなるなどの問題もあるのでしょうか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- tsukasa-12r
- ベストアンサー率65% (358/549)
>モジュールファイルを使うとどういうメリットがあるのでしょうか? 異なるクラス間で使用できます。 ( ただし、Public で宣言しなければなりません。)
- perse
- ベストアンサー率74% (113/152)
>再びDLLにアクセスしたときにPublic Shared a As Integer = 100が >再び呼ばれることはないということを意味しているのでしょうか? 再び初期化させることはありません。 例えば... 現在Form1があるソリューションにForm2を追加します。 Form2には、 '//------------------------------------------------------- Public Class Form2 Private Shared a As Integer = 100 Private Sub Form2_Load( _ ByVal sender As System.Object _ , ByVal e As System.EventArgs _ ) Handles MyBase.Load a += 1 MessageBox.Show(Convert.ToString(x)) Me.Close() End Sub End Class '-------------------------------------------------------// と記述し、Form1側にはForm2を呼び出すためのボタンを配置し、 '//------------------------------------------------------- Private Sub Button1_Click( _ ByVal sender As System.Object _ , ByVal e As System.EventArgs _ ) Handles Button1.Click Dim f As New Form2() f.Show() End Sub '-------------------------------------------------------// と記述します。 これで実行してボタンを押してもらうとわかると思いますが、 押すたびにaは1ずつ増えていきます。 Private Shared a As Integer = 100 が最初の一回目以降呼び出されることはありません。 宣言と同時に初期化したくない場合は Private Shared a As Integer と宣言しておいて MyLibrary.Class1.a = 100 '初期化 とフォームロードイベント等で一回だけ実行するという書き方もあります。 >DLLが呼び出されるたびにJAPAN=7に設定され constもshared変数と同じで、この場合=7が設定させるのは一回だけで、 dllを呼び出すたびに設定させるわけではありません(多分ね)。 仮に設定されていたとしても、 変数や定数に値を設定する処理時間は限りなく0秒に近いでしょう。 そのためだけに同じ意味を持つ定数を両クラスに書くのはナンセンスです。dll側に Public Const JAPAN = 7 だけでいいと思いますよ。
- perse
- ベストアンサー率74% (113/152)
'dll側-------------------------------- Class1に public shared a as Integer と宣言したら '別ソリューションのform内------------- MyLibrary.Class1.a で使えます。shared(共有)なので宣言する必要はありません。
- tsukasa-12r
- ベストアンサー率65% (358/549)
モジュールファイルに Module Module1 Public a As Integer End Module のように Public 宣言してはどうですか?
お礼
回答ありがとうございます。モジュールファイルを使うとどういうメリットがあるのでしょうか?
- unamana19
- ベストアンサー率62% (56/89)
クラス関の変数の共有というより、異なるプロジェクト間の変数 のやりとりと言う事でしょうか?
お礼
Class1(DLL)の中で宣言したaという値をForm1でも使えるようにしたいです。 Form1で宣言すればForm1がロードされればその変数はクローズされるまで永久に存在していますが、Class1(DLL)を呼び出すと呼び出すたびに宣言されたりしてしまいおかしなことになるのではないかと思っています。
補足
異なるプロジェクト(EXE作成プロジェクトとDLL作成プロジェクト)間の変数のやりとりということで、つまりクラス間の変数の共有ということになると思います。
- sendaitaro
- ベストアンサー率25% (6/24)
こんばんわ、質問の意図が いまいち理解できないので、 的確な例ではありませんが、 求める値を得るための例を 記述します。 見当違いならごめんなさい。 Public Class Form1 Public a As Integer = 100 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim test As New MyLibraryClass1 MsgBox(test.plus1(a), MsgBoxStyle.Information, "実験") End Sub End Class '--- ここからクラス --- Public Class MyLibraryClass1 Function plus1(ByVal a As Integer) As Integer plus1 = a + 1 End Function End Class この方法だと、public変数の定義は不要です。 ローカル変数の値渡しでOKです。 あまりよい例ではありません。 とりあえず答えを出すだけです。
お礼
回答ありがとうございます。異なるクラス間で共通の変数を使用したい場合はどうすればいいのでしょうか?
お礼
適切な回答ありがとうございます。これで解決できました。非常に気になることがありますので、補足回答お願いします。
補足
'別ソリューションのform内------------- Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Test As New MyLibrary.Class1 Test.Plus1() Test.Plus1() MsgBox(MyLibrary.Class1.a, MsgBoxStyle.Information, "実験") End Sub End Class 'dll側-------------------------------- Public Class Class1 Public Shared a As Integer = 100 Public Sub Plus1() a += 1 End Sub End Class とすると、メッセージボックスには「102」と表示されると思いますが、Sharedキーワードで宣言された変数は、一番最初に呼び出された時にだけ初期化(100が代入)され、そのあと再びDLLにアクセスしたときにPublic Shared a As Integer = 100が再び呼ばれることはないということを意味しているのでしょうか? また、 Public Class Class1 Const JAPAN = 7 Public Shared a As Integer = 100 Public Sub Plus1() a += 1 End Sub End Class のようにした場合、DLLが呼び出されるたびにJAPAN=7に設定され、非常に短い処理時間の遅れなど発生するのでしょうか?JAPANという記号定数を両クラス内でともに使用したい場合はForm1にも同じようにConst JAPAN = 7と書く必要があると思います。