ScrollBoxの子ウィジェットの扱いについて

掲題の通り、WBPで扱うことができるScrollBoxについての質問です。
まず、自分の実現したい処理の内容は、

1.ScrollBoxにあるWBPクラスのオブジェクトをAddChildで作成する
2.その後、ScrollBoxからGetAllChildrenで要素を取り出し、RemoveChildなどでそれぞれの要素に何らかの処理を行う。

しかしながら、GetAllChildrenで取得した配列をForeachで操作しようとしたところ、全ての要素を取得することができませんでした。
(画像の処理は繰り返し行うもので、2回目のGetAllChildrenではScrollBoxの中身に2つウィジェットオブジェクトが格納されている状態です。しかしながら、Foreachで1つの要素しか取得できませんでした。そして、3つ要素を入れた場合には2つの要素しか取得できませんでした。)

参考として、以下3つの画像を添付させていただきます。
・GetAllChildrenを行いAddChildを行うまでの一連の処理
・ScrollBoxを持つウィジェットの階層
・ScrollBoxに追加するWBPの中身



また、ScrollBoxへのAddChild処理を行ったのちにScrollBoxの親のCanvasPanelのVisibilityを2度変更する処理を挟んでいるので、こちらも添付しておきます。


Remove ChildではなくClear Childrenにすれば全て削除はできますが、削除以外にも同様に子要素へ操作を行う予定のため、なぜ全ての子要素を取得できないのか、ご教授いただけると幸いです。

【追記】
関数の外でGetChildrenを行った場合に、AddChildしたオブジェクトの個数分Foreachが繰り返されることが分かりました。

Pure関数の動作について認識する必要があります

GetAllChildrenはPure関数であるため、呼び出されるごとに評価を行い、最新の情報を返します

今回の場合だとForEach中にRemoveChildで子WidgetをRemoveしており、GetAllChildrenはそれを反映した最新の情報を返すため、ForEachループが回るごとに対象の配列サイズが小さくなっていきます
そのため、配列要素数がForEachマクロ内部のIndexを下回り、ループが打ち切られます

開始時点の要素数を2とすると、下記のような動作になります

1回目:ArrayIndex=0, 要素数2(LastIndex=1) -> Removeが実行されて要素数が-1
2回目:ArrayIndex=1, 要素数1(LastIndex=0) -> ArrayIndexがLastIndexを上回ったのでRemoveはせずComplete

GetAllChildrenの結果全てに対してForEachを実行したい場合は、一度変数に保存して、ループ前時点のすべての情報を確保する必要があります

1 Like

ご回答いただいた内容でしっかり納得できました。大変助かりました。

恥ずかしながら、Pure関数とNonPure関数の存在について知りませんでしたが、
これからはこちらも意識しながら実装を進めていこうと思います。