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

投稿日: 2005/02/02(Wed) 11:01
投稿者魔界の仮面弁士
Eメール
URL
タイトルRe^3: 理解を深めて。。

> 「絶対的にはForm1.Text1.Textのように記される」「Form1.は省略して良い」ですか。
省略しても同じ結果となりますね。
ほとんどの場合、「Form1.Text1」と「Text1」は同じ意味を持ちます。

# ただ、「Form1」は暗黙定義の変数なので、自フォーム内から呼ぶのであれば、
# 「Me.Text1」という記述の方が適切かもしれません。

ただ、両者は完全に同一の意味というわけではありませんので、その点は注意してください。
たとえば、下記のような状況です。
  Option Explicit
  Public X As Long
  Public Sub Test(ByVal X As String)
    Debug.Print TypeName(X)     'これは「String」と出力されます。
    Debug.Print TypeName(Me.X)  'これは「Long」となります。
  End Sub


> Form1!Text1.Text類は
この場合の Form1!Text1 は、「Form1("Text1")」の意味で扱われます。
「!」とは、『規定のメンバ』を呼び出すためのショートカットです。

そして、「!」によるアクセスと「.」によるアクセスは、必ずしも同一ではありませんので、
こちらも注意が必要です。たとえば、TextBoxの名前を「Name」という名前にした場合には、
Me.Name と Me!Name が、別の物を指し示すことになります。(実際に試してみてください)


ここで、「!」の動作について、少し実験してみましょう。
クラスモジュール Class1 を一つ追加して、そこに
  Option Explicit
  Public Function MyMethod(ByVal Param As String) As String
    MyMethod = Param
  End Function
のようなコードを追加します。ここで、VBのメニューから
[ツール]-[プロシージャ属性] のダイアログを開き、詳細ボタンから、
上記「MyMethod」メソッドの「プロシージャID」を「(規定値)」にします。


こうしておくと、
  Private Sub Form_Load()
    Dim X As Class1
    Set X = New Class1
    Debug.Print X.MyMethod("ab cd")
    Debug.Print X![0123]
    Debug.Print X!Z80
    Set X = Nothing
  End Sub
というコードを実行すると、この規定のメソッドが呼び出され、
  ab cd
  0123
  Z80
という出力結果が得られる事になります。「!」にはこのような意味があったわけですね。


ここで、先の TextBox コントロールの例に戻ってみますと、
   Me!Text1
   Me("Text1")
   Me.Controls!Text1
   Me.Controls("Text1")
   Me.Controls.Item("Text1")
これらはすべて、同一の「Text1コントロール」に対するアクセスを提供します。
上方にあるのが省略表記、一番最後のは省略せずに記述した場合です。

# なお、Formの規定のプロパティは「_Default」という名前ですので、
# 『Me.[_Default]("Text1")』や『Me.[_Default].Item("Text1")』でも、
# 同じ結果を得ることができます。


「Me!Text1」に対し、Me.Text1 や Text1 でのアクセスは、Text1 が文字列引数として
評価されるのではなく、そのフォーム上の TextBox コントロールを直接指し示すことが
できますので、個人的には、「!」ではなく「.」によるアクセスをお勧めします。

たとえば、「Text100」という名前のコントロールが存在しない時に、
  Private Sub Form_Load()
    Dim S As String
    S = Me!Text100.Text
  End Sub
というコードは、コンパイルができてしまう(実行時にエラー)のですが、
  Private Sub Form_Load()
    Dim S As String
    S = Me.Text100.Text
  End Sub
とすれば、コンパイルエラーとして報告されますので、スペルミスによるバグも防げますよ。


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

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

- VBレスキュー(花ちゃん) - - Web Forum -