■103074 / inTopicNo.5) |
Re[3]: 構造体のループ処理 |
□投稿者/ 魔界の仮面弁士 (3765回)-(2024/04/18(Thu) 11:59:26)
|
2024/04/18(Thu) 12:03:22 編集(投稿者)
■No103072 (dai さん) に返信 > 今回既存PGへの処理の追加を行っており、objTest1〜3(実際はobjTest40まである)はすでにいろいろな処理に使われていて、 > そちらには手を入れたくない、という背景があります。
構造体である以上、設定後に書き戻す処理が発生してしまうことになると思います。
Dim o() = {Nothing, objTest1, objTest2, objTest3}
'ループ処理 For i = 1 To 3 o(i).data1 = CDec(i) Next
objTest1 = o(1) objTest2 = o(2) objTest3 = o(3)
相手が Class なら、 Choose(i, objTest1, objTest2, objTest3).data1 = CDec(i) などといった手も使えるのですけれどね。
相手が Structure となると、CallByName やリフレクションでもどうにもならないと思います。 https://smdn.jp/programming/netfx/tips/set_struct_field_using_reflection/
VB の Choose 関数が、VB2017 で実装された「ByRef 戻り値」を採用しているなら Choose(i, objTest1, objTest2, objTest3).data1 = CDec(i) みたいに書けるかとも思ったものの、参照渡しな可変個引数がサポートされていない以上、どっちにしても NG 。
あと思いつくのは、デリゲートで操作できるようなヘルパーを用意するとか…?
Friend Delegate Sub TestProc(ByRef t As ST_TEST) Friend Sub Helper(index As Integer, proc As TestProc) Select Case index Case 1 : proc(objTest1) Case 2 : proc(objTest2) Case 3 : proc(objTest3) End Select End Sub
Sub Main() For i = 1 To 3 Dim value = CDec(i) Helper(i, Sub(ByRef o) o.data1 = value) Next Stop End Sub
|
|