VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2004/07/28(Wed) 09:34
投稿者魔界の仮面弁士
Eメール
URL
タイトルRe^8:ゼロを取得する方法

# No.9797の投稿が削除されている…。
# [編集]するつもりで、間違えて[削除]してしまったのかな?


> >   案1) 「空欄かどうかを管理する変数」を、別に作っておく。
> >   案2) データ型 Integerではなく、String や Variant などにしておく。
> > のいずれかで対応する事になるかと思います。
> 空欄と、0をきっちり識別してくれる変数の定義の仕方を詳しく教えていただけますか?

案1) の方は、たとえば、標準モジュールで、
    Public gHasValue1 As Boolean
    Public gAge1 As Integer
のような変数を宣言しておき、Form1側では
    If Text1.Text = "" Then
        gHasValue1 = False
    Else
        gHasValue1 = True
        gAge1 = CInt(Text1.Text)
    End If
のようにしておく、という事です。

そうすれば、Form2側では、
  「gHasValue1 が False なら空欄とみなし、True なら gAge を年齢として扱う」
のように判定できますよね。
あるいは、この2つの変数をまとめたユーザー定義型を作ると言う手もあるかと。


案2)の方は、
    Public gAge1 As Variant
に対して、
    If Text1.Text = "" Then
        gAge1 = Empty
    Else
        gAge1 = CInt(Text1.Text)
    End If
のように代入し、IsEmpty関数で空欄判定を行うような方法です。
あるいは空欄時には Null値 を代入し、IsNull 関数で判定するのも良いでしょう。


> (マイナスの場合のコードを書けばよいのかもしれませんが)
どちらにしても、「空欄だった場合」という例外処理を書く必要があるのですから、
それが「マイナスだった場合」というコードで処理する事になっても、大差は無いのでは。

  '標準モジュール
  Public Const EMPTY_VALUE As Integer = -32768
  Public gAge1 As Integer

  'Form1
    If Text1.Text = "" Then
        gAge1 = EMPTY_VALUE
    Else
        gAge1 = CInt(Text1.Text)
    End If

  'Form2
    If gAge1 = EMPTY_VALUE Then
        MsgBox "空です。"
    ElseIf gAge1 >= 0 And gAge1 <= 18 Then
        MsgBox "18歳以下です。"
    Else
        MsgBox "19歳以上です。"
    End If

> > 「子1 が 0 だった場合」も Image1 は表示されてしまうと思いますよ。
> そうなんです。
「18以下」ではなく、「1〜18」にしたいのであれば、
   If Age <= 18 Then
ではなく、
   If (Age >= 1 And Age <= 18) Then
のような条件にする必要があるかと。0〜18ならば、
   If (Age >= 0 And Age <= 18) Then
ですよね。


> コード上では子1が0でもimage1は表示されると思うのですが
> それができないのが、今回の最大の問題なのです。
前回の投稿の繰り返しになりますが、If文の判定直前に、
変数に 0 を直接代入すれば、Image1 は表示されるのでしょうか?

直前に代入すれば表示されるのであれば、その時点での変数の値が
「0ではない値になっていた」と判断せざるを得ません。

逆に、直前に0を代入しても表示されないのであれば、
「If文の判定条件を見直す必要がある」という事になるかと。


> > 可能性2) 子_1 の値を、うっかり書き変えてしまっている部分がある。
> そのうっかりとは・・・・?
> 書き換えているつもりはないのですが・・・ 不安
大丈夫だとは思いますが、念のため、Visual Basic の
ウォッチウィンドウ や ローカルウィンドウ機能で確認して下さい。

VB6の場合は、[デバッグ]-[ウォッチ式の追加]というメニュー項目です。
そこで、"子_1"という変数名を指定し、[プロシージャ]は"(すべてのプロシージャ)"とし、
[モジュール]には標準モジュールの名前を指定しておきます。

そして、「式の内容が変化した時に中断」を選べば、式の内容が変化した時に、
プログラムの実行が一時停止されるようになります。


> > ……ただ、それ以前の問題として、TextBoxのTextプロパティにしても、
> > 「Public 子_2 As Integer」にしても、そもそも Empty 値が入ってくる事は
> > ありえないので、根本的な問題は、もっと前の部分にあるのだと思います。
> 根本的な問題の原因などが分かればもうすごく嬉しいです。

Integer型変数には、Empty を代入しようとしても、Emptyにはならないのです。たとえば、

Private Sub Form_Load()
    Dim X As Integer
    X = Empty
    If IsEmpty(X) Then
        MsgBox "Emptyです。"
    Else
        MsgBox TypeName(X) & "型です。"
    End If
End Sub

この場合、『Integer型です。』と表示されることはあっても、
『Emptyです。』と表示されることはありませんよね。

ですから、提示いただいたコードで、 子_1 などの変数に Empty が入るとしたら、
Variant型で宣言された、同名の変数がどこかにあるのではないか…と勘繰ってしまうのです。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -