C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 173 を表示中)
■99807 / )  Re[1]: クラスが作れません。
□投稿者/ 魔界の仮面弁士 (3386回)-(2022/06/07(Tue) 10:14:08)
No99806 (白音 さん) に返信
> Private Sub Class_Initialize()
>  Dim dtAs Variant
>  name = ""
>  For Each mnt In data
>   dt= 0
>  Next
> End Sub

dtAs → dt As という点はさておき、変数 mnt が未定義ですし、
そもそもループ処理が意味不明過ぎるんですが…。


> 「クラスモジュール 定数、固定長文字列、配列、
> ユーザー定義型およびDeclare ステートメントは
> オブジェクトモジュールのパブリックメンバーとしては使用できません」

Public メンバーにしなければ OK です。(Private なら構わない)

そもそも、モジュールレベルの配列を Public として公開した場合、
クラス以外の場所から ReDim や Erase されてしまう可能性があるので、
「カプセル化」の観点からはあまり望ましくなかったりします。


'--- 案1: 白音さん御自身が行われたように、「内部処理形式が Double の配列であるバリアント型」を使う



'--- 案2: 配列として公開するのではなく、添字引数付きのスカラー値プロパティの形で公開する
' → ActiveX 版 ListBox の List プロパティがこの形ですね。
Option Explicit

Public Name As String
Private m_data(10) As Double

Public Property Get Data(ByVal index As Integer) As Double
  Data = m_data(index)
End Property
Public Property Let Data(ByVal index As Integer, ByVal newValue As Double)
  m_data(index) = newValue
End Property


'--- 案3: 「配列を戻り値として返す Function」または「配列を返す読み取り専用プロパティ」として公開する
' ※プロパティにすると扱い辛いので、このケースでは Function の方が便利です。
'
Option Explicit

Public Name As String
Private m_data(10) As Double

Public Property Get Data() As Double()
  Data = m_data
End Property

'あまりお奨めはしないけど、書き込み可能にするならこんな感じ
'Public Property Let Data(ByRef newArray() As Double)
'  Erase m_data
'  Dim vnt As Variant, idx As Integer
'  idx = LBound(m_data, 1)
'  For Each vnt In newArray
'    m_data(idx) = vnt
'    idx = idx + 1
'  Next
'End Property
返信 編集キー/


管理者用

- Child Tree -