[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Property Letで引数を複数にした場合の指定の仕方について』(jrw)
ググってもChatGPTでもよくわからなかったので質問させてください。
クラスのProperty Letで引数を複数にした場合の引数の渡し方についでです。
いつも引数が1つのProperty Letでは
MyClass.○○ = "A"
みたいな形で引数を渡しているのですが、複数の引数があるProperty Letにはどういった記述で渡せばよいのでしょうか?
自分でも色々試してみたのですが、上手く引数を複数渡せません。
Property Letに複数の引数を渡す時の記述方法についてどなたか解る方がいれば教えていただければ助かります。
宜しくお願い致します。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
(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
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
稲葉さん、配列のアイディアをありがとうございます。用途についてはクラス内の変数などの設定を複数個一気に変更できたらよいなぁと素人的に思った感じです。もしかすると私はクラスや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.