親子におすすめの新型プラネタリウムとは?

VB初心者です。色々調べてみたのですが分からなくて、ヒントでも結構ですので教えていただけないでしょうか。
現在VB.Net2003 からVB2005に移行しているのですが下記の関数で現在開いているフォームを調べていますがVB.Net2003だとなんら問題なかったのにVB2005では「関数 'FormIsLord_Tag' は、すべてのコード パス上では値を返しません。結果が使用されるときに、null 参照の例外が実行時に発生する可能性があります。」という警告が出てしまいます
Function FormIsLord_Tag(ByVal GetTag As String) As Form
Dim LoopForm As Form
Try
For Each LoopForm In Forms
If LoopForm.Tag = GetTag Then
Return LoopForm
End If
Next
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Function

If LoopForm.Tag = GetTag Then とかの前にLoopFormがNothingだったらとか色々やってみましたがわからなくて・・・
警告なので動かないって訳ではないのですが・・・
よろしくお願いします。

A 回答 (2件)

お世話になります。



ロジックの内容をアタマの中で
フローチャート化してみると、
明示的に値を返していないパスがあるはずです。

「意識していないかもしれませんが、
このような可能性がありますよ」という警告だと思います。
Nothing を返すことを意識しているのであれば
明示的に書いてやると、この警告は消えます。

End Try
の後に、
Return Nothing
と書くと、
Forms が空っぽでも、
例外処理の Cacth ブロックに入ったときでも、
For Each ループ内で tag が該当しなくても
Nothing が明示的に返されます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
消えました!
勉強になりましたありがとうございます。

お礼日時:2006/08/08 09:12

if で条件が合致した時に return していますけど、


ループが終了した時までにreturn がされていない場合、
return で値が明示的に返されていませんよということです。
    • good
    • 2
この回答へのお礼

回答ありがとうございます!
勉強になりましたありがとうございます。

お礼日時:2006/08/08 09:13

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

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

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

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

Q値を返さないコード パス

標準モジュールにFunctionプロシージャーを作ったのですが、

警告1
関数 'プロシージャー名' には値を返さないコード パスがあります。
実行時に結果が使用されると、null 参照の例外が発生する可能性があります。

という警告が出るのですが、
値を返さないコード パスがどのことを指してるのかわかりません。

Function test()
test = "aaa"
End Function

のように値が返るようにしています。

コードが長すぎてここに記載できないのですが、
値が返るようにしているのに、なぜこのエラーが出てしまうのでしょうか?

Aベストアンサー

警告を表示させないようにするだけなら簡単ですが、それでは根本的な解決にはならないので、「値を返さないコードパス」を探してみましょう。

ありがちなのとして
○ エラー処理などで Exit Functionを使っている
例)
' エラーになったっときには関数を終了させる
If エラー発生 Then
Exit Function
End if

○ Then側だけで、Else側だけ、特定のCaseだけで、戻り値が設定されている
例)
' A<>0のときは戻り値が無い
If A = 0 Then
test="aaa"
End If

' Aが1でも2でも無いときに、戻り値が無い
Select Case A
Case 1
test="aaa"
Case 2
test="bbb"
End Select

注意しなければいけないのは、コンピュータは「絶対有り得ない」かどうかを判断できない、ということです。

例えば、上記Select Caseで、Aは絶対に1か2になるようにプログラムを作ってあったとします。
それを知っている人間は、このSelect Caseで「値を返さないコードパス」は存在しない、と判断できます。
しかし、コンピュータには、それを知る手段がありません。A=0になっているかもしれない、そのときには値を返さない、と判断します。




> コードが長すぎてここに記載できないのですが

そういう「長いコード」を整理することも考えましょう。

警告を表示させないようにするだけなら簡単ですが、それでは根本的な解決にはならないので、「値を返さないコードパス」を探してみましょう。

ありがちなのとして
○ エラー処理などで Exit Functionを使っている
例)
' エラーになったっときには関数を終了させる
If エラー発生 Then
Exit Function
End if

○ Then側だけで、Else側だけ、特定のCaseだけで、戻り値が設定されている
例)
' A<>0のときは戻り値が無い
If A = 0 Then
test="aaa"
End If

' Aが1でも2でも無いときに、戻り値が無い
Select Case A
C...続きを読む

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. ところが、アプリ...続きを読む

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

こんにちは。

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

Aベストアンサー

こんばんは.

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

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

Qオブジェクト参照がオブジェクト インスタンスに設定されていません  というエラーについて

タイトルの「オブジェクト参照がオブジェクト インスタンスに設定されていません」についてですが、

このエラーは、

null を参照しようとして例外が発生している

エラーだと解釈しているのですが、nullでないのに、このエラーが出る場合はどのように対処すればいいのか教えてください。

下記のような文があるとします。

Dim aaa as String
'aaaは、データベースからデータをとってきています。

If aaa IsNot DBNull.Value Then
DropDownList.SelectedItem.Text = aaa.TrimEnd 'ここでエラー
End If

aaaは、NullではないのでIf文の中に入っていくのですが、DropDownListにデータを入れようとすると、タイトルのようなエラーが発生します。

デバッグでaaaの値を見ても、ちゃんとデータが入っているし、Nullではないのですが、なぜこのようなエラーが出るのかわかりません。

このエラーは他に違う意味があるのでしょうか?

また、他に影響している部分があるのでしょうか?

どなたか教えてください。

よろしくお願いいたします。

タイトルの「オブジェクト参照がオブジェクト インスタンスに設定されていません」についてですが、

このエラーは、

null を参照しようとして例外が発生している

エラーだと解釈しているのですが、nullでないのに、このエラーが出る場合はどのように対処すればいいのか教えてください。

下記のような文があるとします。

Dim aaa as String
'aaaは、データベースからデータをとってきています。

If aaa IsNot DBNull.Value Then
DropDownList.SelectedItem.Text = aaa.TrimEnd 'ここでエ...続きを読む

Aベストアンサー

SelectedIndexは何番目の行かということを示すので、数値でなければ
なりません。Items(i).Text=aaaになるiを見つけて設定します。
FindByTextかFindByValueで検索したListItemを使って、IndexOfで
インデックスを求める方法がスマートでしょうか。

http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.findbytext(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.findbyvalue(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.indexof(VS.80).aspx

>表示するデータと値のデータを別々に設定
Text(表示するデータ)とValue(値のデータ)を仕込んだListItemを
Add(場合によってはInsert)メソッドで追加(挿入)します

http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitem(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.add(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.insert(VS.80).aspx

SelectedIndexは何番目の行かということを示すので、数値でなければ
なりません。Items(i).Text=aaaになるiを見つけて設定します。
FindByTextかFindByValueで検索したListItemを使って、IndexOfで
インデックスを求める方法がスマートでしょうか。

http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.findbytext(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.findbyvalue(VS.80).aspx
http://msdn.microsoft...続きを読む

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でのイベントの途中終了

VB.NETで、あるボタン(button1)をクリックさせた際にイベントを発生させます。

そのイベント内の処理途中で、イベントを終了させたいと思っていますが、どのように書いていいかわからず困っています。

どなたかおわかりの方お願いします。

Aベストアンサー

Exit ←これをイベント終了したいところで、使えばいいと思いました。

(例)
Private Sub Button1_Cilck・・・省略・・・
 '「Button1」をクリックしたときのイベント
 If Msgbox("イベントを途中終了しますか?",vbYesNo) = vbYes Then
  Exit Sub 'イベント途中終了
 End If
 Msgbox("イベントを途中終了しませんでした。")
End Sub

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して、複数の値を受け渡すという手法をよく使っています。

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に指定した値を設定します。

QTextBoxに半角数字のみの入力しかできないようにしたい

タイトルどおりです。
フォームに貼り付けた、TextBoxに、半角数字のみしか入力できないようにしたいです。
000000~999999までのコード(数字)を入力させるようにするわけですが、そのままだと半角英数も全角も入力できてしまいます。

GrapeCity社製のカスタムコントロール「InputMan」の“Number”を用いると簡単なのですが、これだとカーソルがボックス内の右端にきて、一の位から入力が始まってしまいます。
数字は、ボックス内の左側から入力されていくようにしたいのですが、“Number”だとなんか出来なさそう・・・?
(“Number”で左側から入力できるならそれがいいのですが)

そこで、TextBoxを使うことにしたのですが、TextBoxだと、半角数字のみしか入力できないような制限がかけるのかが、わかりません。

もし、お分かりの方がいらっしゃいましたら、ご教授下さいませ。

Aベストアンサー

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ' Ctrl + V
Case &H18 ' Ctrl + X
Case &H1A ' Ctrl + Z
Case Else
KeyAscii = 0
End Select
End Sub

で、いかがでしょうか。

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ...続きを読む


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

人気Q&Aランキング