プロが教えるわが家の防犯対策術!

異なるクラス間で共通の変数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)を作成するとまとまりができてプログラムの変更がしやすいと思いますが、やはり処理速度が遅くなるなどの問題もあるのでしょうか?

A 回答 (6件)

こんばんわ、質問の意図が


いまいち理解できないので、
的確な例ではありませんが、
求める値を得るための例を
記述します。
見当違いならごめんなさい。
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です。
あまりよい例ではありません。
とりあえず答えを出すだけです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。異なるクラス間で共通の変数を使用したい場合はどうすればいいのでしょうか?

お礼日時:2007/05/28 22:54

クラス関の変数の共有というより、異なるプロジェクト間の変数


のやりとりと言う事でしょうか?

この回答への補足

異なるプロジェクト(EXE作成プロジェクトとDLL作成プロジェクト)間の変数のやりとりということで、つまりクラス間の変数の共有ということになると思います。

補足日時:2007/05/30 00:04
    • good
    • 0
この回答へのお礼

Class1(DLL)の中で宣言したaという値をForm1でも使えるようにしたいです。
Form1で宣言すればForm1がロードされればその変数はクローズされるまで永久に存在していますが、Class1(DLL)を呼び出すと呼び出すたびに宣言されたりしてしまいおかしなことになるのではないかと思っています。

お礼日時:2007/05/30 00:13

モジュールファイルに



Module Module1
Public a As Integer
End Module

のように Public 宣言してはどうですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。モジュールファイルを使うとどういうメリットがあるのでしょうか?

お礼日時:2007/06/01 21:50

'dll側--------------------------------


Class1に
public shared a as Integer
と宣言したら

'別ソリューションのform内-------------
MyLibrary.Class1.a
で使えます。shared(共有)なので宣言する必要はありません。

この回答への補足

'別ソリューションの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と書く必要があると思います。

補足日時:2007/05/31 20:57
    • good
    • 0
この回答へのお礼

適切な回答ありがとうございます。これで解決できました。非常に気になることがありますので、補足回答お願いします。

お礼日時:2007/05/31 20:57

>再び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

だけでいいと思いますよ。
    • good
    • 0

>モジュールファイルを使うとどういうメリットがあるのでしょうか?



異なるクラス間で使用できます。
( ただし、Public で宣言しなければなりません。)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!