[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/02/17(Sat) 11:42
投稿者名:らんでぃ
Eメール:
URL :
タイトル:
プロパティの参照渡しで値が変更されない
久々にVB6.0を使用したらすごく初歩的なところで詰まってしまいました。
下のソースでText1.Textが"かきくけこ"に変ってくれないのは仕様でしたっけ?
すいません、どなたか教えて下さい。

Private Sub Command1_Click()
   Text1.Text = "あいうえお"
   Call func(Text1.Text)
End Sub

Private Sub func(ByRef strstring As String)
   strstring = "かきくけこ"
End Sub

投稿時間:2007/02/17(Sat) 13:32
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: プロパティの参照渡しで値が変更されない
> 下のソースでText1.Textが"かきくけこ"に変ってくれないのは仕様でしたっけ?

ByRef 引数にプロパティ・メソッド・関数・リテラル等の「式」を渡した場合には、
内部で一時的な変数が作られ、その一時変数が書き変えられるだけなので、
実質上、ByVal 相当の動作となります。

ByRef で内容が書き変わるのは、渡したデータが「変数」であった場合だけです。
   Dim s As String
   Call func(s)
   Text1.Text = s
のようにすれば、反映させる事ができるでしょう。
# ただしこのようなケースでは、参照型引数を使うのではなく、戻り値で処理するべきです。


ついでに、ByVal / ByRef に引数にオブジェクト(例:TextBox)を渡した場合の動作について、
下記も読んでおかれるとよいでしょう。
http://support.microsoft.com/kb/161308/ja

投稿時間:2007/02/17(Sat) 14:01
投稿者名:らんでぃ
Eメール:
URL :
タイトル:
Re^2: プロパティの参照渡しで値が変更されない
魔界の仮面弁士さん、こんにちは。

早速の回答ありがとうございます。
Text1.Textは「式」になるのですね。

VB6.0の値渡しや参照渡し等の基本的な言語仕様が思い出せなくて、いろいろ実験ソースを作成して試していたのですが、さらに謎が深まって悩んでいたところでした。


> > 下のソースでText1.Textが"かきくけこ"に変ってくれないのは仕様でしたっけ?
>
> ByRef 引数にプロパティ・メソッド・関数・リテラル等の「式」を渡した場合には、
> 内部で一時的な変数が作られ、その一時変数が書き変えられるだけなので、
> 実質上、ByVal 相当の動作となります。
>
> ByRef で内容が書き変わるのは、渡したデータが「変数」であった場合だけです。
>    Dim s As String
>    Call func(s)
>    Text1.Text = s
> のようにすれば、反映させる事ができるでしょう。
> # ただしこのようなケースでは、参照型引数を使うのではなく、戻り値で処理するべきです。
>
>
> ついでに、ByVal / ByRef に引数にオブジェクト(例:TextBox)を渡した場合の動作について、
> 下記も読んでおかれるとよいでしょう。
> http://support.microsoft.com/kb/161308/ja