[[20230407133847]] 『Property Letで引数を複数にした場合の指定の仕方』(jrw) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Property Letで引数を複数にした場合の指定の仕方について』(jrw)

ググってもChatGPTでもよくわからなかったので質問させてください。
クラスのProperty Letで引数を複数にした場合の引数の渡し方についでです。

いつも引数が1つのProperty Letでは
MyClass.○○ = "A"
みたいな形で引数を渡しているのですが、複数の引数があるProperty Letにはどういった記述で渡せばよいのでしょうか?
自分でも色々試してみたのですが、上手く引数を複数渡せません。
Property Letに複数の引数を渡す時の記述方法についてどなたか解る方がいれば教えていただければ助かります。
宜しくお願い致します。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


私の頭が固いのかと思いますが、
Property Letに2つの引数という概念がありませんでした。
率直に、動くんですか?

(tkit) 2023/04/07(金) 14:11:51


    Private i(0 To 2) As Long
    Property Get testA(id As Long) As Long
        testA = i(id)
    End Property
    Property Let testA(id As Long, newValue As Long)
        i(id) = newValue
    End Property

    Sub test()
        Debug.Print testA(0); testA(1); testA(2)
        testA(1) = 100
        Debug.Print testA(0); testA(1); testA(2)
    End Sub

(白茶) 2023/04/07(金) 14:19:31


 配列で渡すという手も・・・
 CLASS1
    Option Explicit
    Private v_ As Variant
    Public Property Let Add(ByVal v As Variant)
        v_ = v
    End Property
    Public Property Get Exec() As String
        Exec = Join(v_, "")
    End Property

 標準モジュール
    Sub test()
        Dim cls As Class1
        Set cls = New Class1
        cls.Add = Array("A", "B", "C")
        MsgBox cls.Exec
    End Sub

 どういう用途を考えているのか差し支えなければ教えてもらいたいですね。

(稲葉) 2023/04/07(金) 14:29:53


 あー、そういう意味ですか。
 引数ってマジでValueを複数一気に渡すつもりだったわけですね。

    Private v(1 To 4, 1 To 3) As Long
    Property Get testB(arg1 As Long, arg2 As Long) As Long
        testB = v(arg1, arg2)
    End Property
    Property Let testB(arg1 As Long, arg2 As Long, newValue As Long)
        v(arg1, arg2) = newValue
    End Property
    Sub test2()
        Dim r As Long, c As Long
        Erase v
        For r = 1 To 4
            For c = 1 To 3
                testB(r, c) = (r - 1) * 3 + c
            Next
        Next
        For r = 1 To 4
            Debug.Print testB(r, 1); testB(r, 2); testB(r, 3)
        Next
    End Sub

 ↑ていう感じに、arglistが複数の事かと思ったら...

 わたしはそういう場合はメソッドで定義しますね。
 例えば
 Topプロパティ,Leftプロパティ、Heightプロパティ、Widthプロパティをそれぞれ個々に定義した上で、
 4つとも一気に設定できるMoveメソッドも定義しておく。 みたいな...

(白茶) 2023/04/07(金) 14:39:26


Class1
 Private Total As Double

 Property Let Add(ByVal CalcSymbol As String, ByVal Arg As Double)
    Select Case CalcSymbol
        Case "+": Total = Total + Arg
        Case "-": Total = Total - Arg
        Case "×", "*": Total = Total * Arg
        Case "÷", "/": If Arg <> 0 Then Total = Total / Arg
    End Select
 End Property

 Property Get Answer() As Double
    Answer = Total
 End Property

標準モジュール

 Sub Sample()
    Dim c As Class1
    Set c = New Class1
    With c
        .Add("+") = 10
        .Add("-") = 3
        .Add("*") = 8
        .Add("÷") = 4
        Debug.Print .Answer
    End With
 End Sub

実験してみました。
(火災報知器) 2023/04/07(金) 16:00:39


 おお白茶さんの実験しているうちに面白そうな題材が・・・
 火災報知器さんのは明日遊びますー

 白茶さんの提案的にはこんな感じです・・・かね?
 そのためのクラスオブジェクトだろうから、プロパティは複数を渡すよりかは
 1:1なほうが使いやすい気がしました。

    Option Explicit
    Type Rect
        Left As Long
        Top As Long
        Width As Long
        Height As Long
    End Type
    Private v As Rect
    Property Let Left(Left_ As Long)
        v.Left = Left_
    End Property
    Property Let Top(Top_ As Long)
        v.Top = Top_
    End Property
    Property Let Width(Width_ As Long)
        v.Width = Width_
    End Property
    Property Let Height(Height_ As Long)
        v.Height = Height_
    End Property
    Sub Move(Left_ As Long, Top_ As Long, Width_ As Long, Height_ As Long)
        v.Left = Left_
        v.Top = Top_
        v.Width = Width_
        v.Height = Height_
    End Sub
    Property Get Left() As Long
        Left = v.Left
    End Property
    Property Get Top() As Long
        Top = v.Top
    End Property
    Property Get Width() As Long
        Width = v.Width
    End Property
    Property Get Height() As Long
        Height = v.Height
    End Property
    Function GetMove() As Long()
        Dim x(3) As Long
        x(0) = v.Left
        x(1) = v.Top
        x(2) = v.Width
        x(3) = v.Height
        GetMove = x
    End Function
    Sub a()
        Dim w() As Long
        Left = 1
        Top = 2
        Width = 3
        Height = 4
        Debug.Print Left; Top; Width; Height
        Move 5, 6, 7, 8
        w = GetMove
        Debug.Print w(0); w(1); w(2); w(3)
    End Sub
(稲葉) 2023/04/07(金) 16:08:58

tiktさんコメントありがとうございます。率直に動きません。

稲葉さん、配列のアイディアをありがとうございます。用途についてはクラス内の変数などの設定を複数個一気に変更できたらよいなぁと素人的に思った感じです。もしかすると私はクラスやPropertyLetに対する感覚が間違っているのかもしれません。

白茶さんコメントありがとうございます。わかりにくい質問ですみません。メソッドで定義する方法、参考にしてみます。

火災報知器さん、実験ありがとうございます。理解できるよう努めて参考にさせていただきたく思います。

みなさまの回答で自分が思ったことが一般的でないことがよくわりました。ありがとうございます。

みなさまが書いてくださるサンプルは自分が知らない便利なことが沢山つまっており、それを見ているだけでもとても勉強になり助かります。

追記:稲葉様、再度のコメントありがとうございます。しっかり読んで勉強させていただきます。
(jrw) 2023/04/07(金) 17:03:43


 Propertyはいわゆるアクセサとしての「それらしい」使い方に特化したものですが、
 本質的にはSubやFunctionと何ら変わらないと思いますので、
 メソッド使った方が自然に表現できるならメソッド使えばイイと思います。

 CollenctionのメンバなんてSubとFunctionだけでとっても潔しですよ。(もはや「かっこいい!」と感じる ^^;)

 >クラスやPropertyLetに対する感覚が間違っているのかもしれません
 まぁ、こうだったら正しい みたいなのがあるのかどうか分かりませんし、
 単純に「やりたい事に適ってるかどうか」での判断だと思います。

 私なんかもクラス定義でしばしば「値」と「有効範囲」を管理する必要性に出くわします。
 例えば
     .Value
     .Max
     .Min
 というメンバを持った何らかのクラスですね。

 個々の属性はそれぞれに役割がありますから当然の様にそれぞれPropertyを定義しますけども、
 互いに関連性の強い属性なので「きっと一気に設定したいシーンが出てくるな」と想像できます。

 例)
     1.有効範囲を設定
     2.初期値を設定
          ↓
     3.利用により値が変化
          ↓
       (場合によっては1に戻る)

        だったら、1と2は[Reset]メソッド作った方が自然であろう みたいな。
        かと言って、Maxだけ途中で変わる事や、有効範囲は変えずに2に戻る場合もあるから
        PropertyもPropertyでやはりあった方が便利。てか必要...

 クラスのメンバにアクセスする手段を用途に応じて増やす。という感覚です。

(白茶) 2023/04/07(金) 18:44:49


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.