出産前後の痔にはご注意!

こんばんわ!
VB6.0からの移行でVB.net2012に挑戦中なんですが、グローバル変数の宣言の仕方で分からないことがあり質問しに着ました!

内容
モジュール内で
public hoge as string="aaa"
と宣言するのと

モジュール内で
public hoge as string
と宣言しておいて
フォーム起動時に
hoge="aaa"
と宣言するのにどのような違いがあるのでしょうか?

hogeの変数を変更したいのですが、上記の方法だと動いて、下記の方法だと動かないのですが・・・
まだ良く分かっていないので、程度の低い質問で申し訳ないのですが、アドバイスのほどよろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

> グローバルで変数として一箇所のみで宣言しているのですが、それで別の変数になることはあるのでしょうか?


hoge が本当は text とかなら有り得ます。この場合、フォームの Text プロパティが変更されます。
別のクラスなどを Imports していて、そちらに同名の変数がある場合も有り得るかも知れません。
ただし、スコープが同じ変数が複数あると↓文法エラーが出るはず。
http://msdn.microsoft.com/ja-jp/library/856b0w3t(v=vs.110).aspx
http://msdn.microsoft.com/ja-jp/library/03x63w1z(v=vs.110).aspx

上記の現象の確認には、変数を使用している場所で右クリックメニューから「定義へ移動」で
その変数がどこで宣言されたものを参照しているか分かります。
変数のスコープが狭いものが優先して使用されるため、ローカル宣言や、自分が定義していなくとも
既に VB.NET で宣言されているものとかぶってはだめです。


>意味合い自体は同じであると認識しているのですが、あっていますか?
変数宣言は同じで、初期値が違います。…見たまんまだと思いますが。


>「 public hoge as string」と宣言したhoge
>動かないのは配列の項目数(例えば、hoge_arra(hoge)のように)使用しているのですが
配列の添字を文字列型にするなど話になりません。問題外です。
数値型にして下さい。
    • good
    • 0
この回答へのお礼

定義へ移動は便利ですね^^
使わせてもらいますw

>変数宣言は同じで、初期値が違います。…見たまんまだと思いますが。
ですよね~そのはずなのに動かないです・・・。

>「 public hoge as string」と宣言したhoge
はミスですw失礼しましたw実際はintegerで宣言してますw

色々試して、初期値を入れておいて、改めて別の数値をいれると動いたので、それでやってみます。

本当にナンなんだろう・・・

お礼日時:2013/03/12 12:48

>色々試して、初期値を入れておいて、改めて別の数値をいれると動いたので、それでやってみます。


つまり変数の宣言の問題ではなくて、初期値の設定の問題だという事ですよね。
フォームのロード前か、フォームのロード時でも初期値の設定のコードの実行前に
使用しているということでは?
モジュール側で配列をグローバル宣言してると、モジュールが呼ばれた際に初期化の
処理が全て走ってしまうからフォームのロードイベントに書いてある初期値設定の
コードを実行する前にモジュール側で初期化しようとしているとか。

プログラムの開始から1行1行ステップ実行すれば分かるのでは?
    • good
    • 1

#1 さんに追加で、


(起動しているフォームのインスタンスが違うなどの理由で)
そもそも処理が実行されていない可能性もあります。
ブレークポイントを設定して処理が実行されている事は
確認しましたか?
    • good
    • 0
この回答へのお礼

処理の実行までは確認できているのですが、ダメですね~。
なぜかエラーが・・・

意味合い自体は同じであると認識しているのですが、あっていますか?

お礼日時:2013/03/07 00:17

・form起動より先にhogeを参照するような、動作になっている


・名前空間が違うなどで、「 public hoge as string」と宣言したhogeと、「フォーム起動時にhoge="aaa"」とは別の変数になっている

などが考えられます。

「動かない」とは具体的にどのような状態なのでしょうか?
    • good
    • 0
この回答へのお礼

・form起動より先にhogeを参照するような、動作になっている
なっていないんですToT

・名前空間が違うなどで、「 public hoge as string」と宣言したhogeと、「フォーム起動時にhoge="aaa"」とは別の変数になっている
グローバルで変数として一箇所のみで宣言しているのですが、それで別の変数になることはあるのでしょうか?

動かないのは配列の項目数(例えば、hoge_arra(hoge)のように)使用しているのですが、エラーが出ます・・・

お礼日時:2013/03/07 00:17

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBでグローバル変数を宣言するには

VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。
Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか?
どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

Aベストアンサー

>Public a as Integerのように宣言して、初期化するにはどのように記述を行えばよいですか?

>Public a As Boolean = 0
のように記したら”コンパイルエラー”と出ました。

Booleanって整数値取れたかなと思いつつ。
Sub~End Sub内でa = 0を代入したりしてください

扱おうと言うことがあるかどうか疑問だけど

Public Const a As Integer = 10 'グローバルな定数の宣言

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QVB.NETで他のプロジェクトで作成したフォームを使う方法

こんにちは。
VB.NETのプロジェクトがぐちゃぐちゃで参照設定とかいろんなの呼んでしまっているので、新しく作成しなおしたいのですが、
新しいプロジェクトでプロジェクトを作成し、前のプロジェクトで必要なファイル(.vb、RESX)を新しいプロジェクトのフォルダにコピーしたのですが、
普通のモジュールは追加>新しい項目の追加でなんとか追加できたのですが、フォームの追加の仕方がわかりません><教えてくださいー

P.S. RESXファイルってフォームのデータが入ってるのでしょうか?そんな気がしてコピーしたのですが。

※VB6.0からVB.NETに以降した際にアップデート情報みたいなのがプログラム上にくっついてしまって.vbファイルも参照項目も増えまくってしまった

Aベストアンサー

ドラッグ&ドロップが使いやすい。
Windowsのエクスプローラでvbファイルをドラッグして、VS.NETのソリューションエクスプローラへドロップする。

QVB.NETでラベルの大きさってどうやって変えるの?

VB.NETでラベルの大きさってどうやって変えるの?
バージョンは2008

Aベストアンサー

あれ?
普通に
Widthプロパティ
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.width%28VS.100%29.aspx
やHeightプロパティを変更すればできるはずだけど、コード、IDE問わず。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.height%28VS.100%29.aspx

#まぁAutoSizeプロパティをfalseにしないと、Textプロパティに代入された文字列を格納するのに必要な最低限の大きさに自動で調整されちゃうみたいだけど。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.autosize.aspx

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

QVB.NETが学習できるようなサイト知りませんか?

こんにちは。
自分は現在、仕事でVB.NETを扱うために参考書を使って学習中です。
上の人からは、「とりあえず、関数とか制御構造とか、基本的なことをおさえといて」と言われました。でも、持ってる参考書だけではなんだか物足りないです。サンプルでもいいから、もっとたくさんコーディングしてみたいと思っています。
参考書を買わなくても手軽に勉強したいと思ったので、そういうサイトをご存知の方がいらっしゃれば教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

図書館に行くと結構いろんな本がありました。無料ですし、あまり借りる人もいないのでいつでも貸出可です(笑)
サンプル作品的なものは下のサイトに何個かあるみたいです^^

http://www.mitene.or.jp/~sugisita/vbnet_smp.html
http://jeanne.wankuma.com/tips/
http://133.53.64.43/tonoike/computer/vb/sampleindex.asp
http://anetm.com/dev/tools/vbdotnet/
http://www.ujihara.jp/iTextdotNET/ja/examplesvb.html

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

QVB.NET getとsetの概念がわかりません。

GetとSetがどういう働き・意味をもっているのか理解できていません。

たとえばSpecialTextBoxというクラスがあったとします。
***************************************************************
Imports System.Web.UI.MobileControls

Partial Class SpecialTextBox
Inherits System.Web.UI.MobileControls.MobileUserControl

Public Property Item() As SelectionList

Get
Return Me.CheckBox
End Get
Private Set(ByVal value As SelectionList)
Me.CheckBox = value
End Set

End Property

End Class
****************************************************************

ここでのGet Setはどういう動き・働きをしているんでしょうか?
わかる方がいたらご助言お願いいたします。
(サンプルソースなどがあれば理解しやすいかもしれません。。)

GetとSetがどういう働き・意味をもっているのか理解できていません。

たとえばSpecialTextBoxというクラスがあったとします。
***************************************************************
Imports System.Web.UI.MobileControls

Partial Class SpecialTextBox
Inherits System.Web.UI.MobileControls.MobileUserControl

Public Property Item() As SelectionList

Get
Return Me.CheckBox
End Get
Private Set(ByVal value As Sele...続きを読む

Aベストアンサー

getはそのインスタンスから値を取り出します。
setはそのインスタンスに値を設定します。
あなたの例だと、GetはCheckBoxの値を取り出します。
SetはCheckBoxに指定した値を設定します。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング