■99810 / ) |
Re[3]: クラスが作れません。 |
□投稿者/ 魔界の仮面弁士 (3387回)-(2022/06/07(Tue) 15:56:36)
|
■No99808 (白音 さん) に返信 >>そもそもループ処理が意味不明過ぎるんですが…。 > data の中身を0で初期化するためです。
初期化も何も、Double の初期値は 0.0 ですよ。
なので、ループするまでも無く Private Sub Class_Initialize() Dim d(0 To 10) As Double Me.m_data = d End Sub あるいは Private Sub Class_Initialize() ReDim m_data(0 To 10) As Double End Sub で済む話です。
そもそも、「For Each dt In 数値の配列」のループでは 配列の中身を書き換えることはできません。使うならば For Each〜Next ではなく、For〜Next を使うべきです。
コレクションを列挙して、個々の要素のプロパティを書き換えるような用途なら For Each でも良いのですけれどね。
>>'--- 案1: 白音さん御自身が行われたように、「内部処理形式が Double の配列であるバリアント型」を使う > data にデータを入れる方法がわかりません。 > nd.data(0) = 1 > 1 になりません。
他クラスのメンバーから得られるのは、元の変数への参照そのものではなく、値のコピーだからです。
※Module と違って、クラスだと配列を Public にできないのもそれが理由。
これがコピーであることは、たとえば呼び出し側で Debug.Print Hex(VarPtr(nd.data)) を行った結果と、クラス側で Debug.Print Hex(VarPtr(Me.data)) を呼び出した場合、得られるアドレスが異なることからも判断できます。
配列の一部だけを直接書き換えようとするのではなく、 配列全体のコピーをいったん変数に受け取ってから、 その変数の内容を書き換えた上で、 書き換えた新しい配列全体を、改めて渡す方法を採れます。 'Dim dbl As Variant Dim dbl() As Double dbl = nd.data dbl(0) = 0.5 nd.data = dbl
配列の一部だけを書き換えたい場合は、案2 のようにするか、 またはクラス側に「内容を書き換えるためのメソッド」を設けるようにします。
>>'--- 案2: 配列として公開するのではなく、添字引数付きのスカラー値プロパティの形で公開する >>' → ActiveX 版 ListBox の List プロパティがこの形ですね。 > nd.data = Array(1,2,3,・・・)
このケースでは、左辺の data は添字引数が必須なプロパティになっています。 また、添字を指定した場合の戻り値は、As Double です。ですから Array の代入はできません。
たとえば、 Dim dbl1() As Double Dim dbl2 As Double に対して dbl1 = Array(1, 2) dbl2 = Array(1, 2) と書けないのは自明ですよね。
もしも nd.Data = Array(1.2, 3.4) と nd.Data(0) = 1.2 nd.Data(1) = 3.4 の両方を可能にしたいのであれば、 Data プロパティの定義をそのように書き換えるか、 もしくは一括設定用に ParamArray 引数なメソッドを追加するなどしてみてください。
|
|