異なるクラス間で共通の変数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件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
>再び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
だけでいいと思いますよ。
No.4
- 回答日時:
'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と書く必要があると思います。
No.2
- 回答日時:
クラス関の変数の共有というより、異なるプロジェクト間の変数
のやりとりと言う事でしょうか?
この回答への補足
異なるプロジェクト(EXE作成プロジェクトとDLL作成プロジェクト)間の変数のやりとりということで、つまりクラス間の変数の共有ということになると思います。
補足日時:2007/05/30 00:04Class1(DLL)の中で宣言したaという値をForm1でも使えるようにしたいです。
Form1で宣言すればForm1がロードされればその変数はクローズされるまで永久に存在していますが、Class1(DLL)を呼び出すと呼び出すたびに宣言されたりしてしまいおかしなことになるのではないかと思っています。
No.1
- 回答日時:
こんばんわ、質問の意図が
いまいち理解できないので、
的確な例ではありませんが、
求める値を得るための例を
記述します。
見当違いならごめんなさい。
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です。
あまりよい例ではありません。
とりあえず答えを出すだけです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
C#で通常のbuttonコントロール...
-
既定のコンストラクタがない?
-
オーバーライド関数の呼び出し...
-
Visual C++ 6.0 でクラス表示が...
-
C++ protectedにアクセス不可
-
C#で定数クラスをシングルトン...
-
MFCアプリのコマンドラインでパ...
-
VB.Netの大域変数
-
[MFC] CWnd::MessageBoxの警告...
-
イベントにAddHandlerされてい...
-
vba sendKeysを送る相手のソフ...
-
正規表現 [^/]+ の意味を教えて
-
WindowsAPIのリストビューの...
-
エディットコントロールでEnter...
-
ダイアログクラスのコントロー...
-
【ASP.NET】 独自で作成したク...
-
MFCのCListCtrlでスクロールを検出
-
ボタンのオーナードローについて
-
特定のビューへのポインタ取得...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
エディットコントロールのイベ...
-
エディットコントロールでEnter...
-
WindowsAPIのリストビューの...
-
CMainFrameクラスの使い方
-
DebugクラスとTraceクラスの違い
-
MessageBoxを継承したい
-
C++ protectedにアクセス不可
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
MFCアプリのコマンドラインでパ...
-
【ASP.NET】 独自で作成したク...
-
C#で通常のbuttonコントロール...
-
ダイアログクラスのコントロー...
-
派生クラスから基本クラスprote...
おすすめ情報