投稿日 | : 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
とすれば、コンパイルエラーとして報告されますので、スペルミスによるバグも防げますよ。