フォームに配置したオブジェクトの変数について

検索ダイアログを作成してみました。
入力オブジェクトにFrom.IDなどとオブジェクト記述を配置したのですが、
項目数が多いためOn Load時にプログラムでFrom.IDを参照して初期化しようとしたのですが、
内容を確かめた所Formの内容はプロパティ名が一切ない空の状態でした。
※DIALOGでオブジェクトは渡していません。

仕方がないのでFORM GET OBJECTSでフォーム上に定義したFrom.IDなどを取得できるかと
確認してみたのですが変数はポインタ参照なのでnilになっていて取得する事はできませんでした。
フォーム上に配置したFrom.IDなどを取得する方法はないのでしょうか。

色々調べてみたのですが、フォームオブジェクトの変数がオブジェクトのプロパティや式の場合、
SelfやOBJECT GET POINTERの代替もないですね。 :frowning:

汎用的にプログラムで参照/変更する方法が全て対応不可なのは困ります。
v18リリースまでに代替案を提供してください。 :pray:

フォームオブジェクトの「式(または変数)」プロパティに入力できるものは,

(インター)プロセス変数
空欄=フォームローカル変数または(a)値を返すフォーミュラ(v12)
コマンドで動的に読み書き(v13)
(b)オブジェクトのプロパティまたはバリアント(v17/18)

と拡張されてきた経緯がありますが,(a)と(b) の用法で,
「汎用的にプログラムで参照/変更する方法がすべて対応不可」なのは,
見落としやスケジュール上の問題というよりも,
ハードコーディングがベストプラクティスという意味に受け取る必要があると思います。

  • オブジェクトのプロパティは参照であること
  • 参照は複数のオブジェクト間で共有できること
  • ランゲージでデータソースが読み書きできること
  • ユーザーインタフェースのイベントサイクルでランゲージが評価されること
  • ランゲージの評価は別のイベントを発動するかもしれないこと
  • フォームがイベントサイクルが完結したタイミングでリフレッシュされること

等の要素を考慮すると,
フォームオブジェクトのデータソースは,
変数を設定した場合よりもプロパティを設定した場合のほうが,
ずっと扱いが複雑になります。

汎用的なコードを記述されるのであれば,
フォーム側のイベントで参照するというスタイルではなく,
DIALOGをコールするメソッド側で,
コマンドに渡すオブジェクト(Form)を一種のクラスのように定形化する,
といった方式のほうが良いかもしれません。

理論的には,Form convert to dynamic(バイナリモード)またはJSONフォームの解析で
デザインモード定義のデータソースは「読む」ことはできると思います。

しかし,
フォームオブジェクトの「式または変数」はソースコードの一部であり,
これをランタイムで参照するような処理はデバッグ目的に限定し,
ロジックの一部にするのは避けたほうが無難だと思います。

こうした「指針」は,主観的なものなので,
原則的にドキュメントには記述されません。

たとえば,
17R6で呼び出し連鎖が参照できるようになりましたが,
https://doc.4d.com/4Dv17R6/4D/17-R6/Get-call-chain.301-4381538.ja.html
ドキュメントを読む限り,どんな用途で使用するべき・べからずについての言及はありません。

それでも,ブログをみると,

https://blog.4d.com/retrieve-the-current-execution-call-chain/

呼び出し連鎖を条件分岐に使わないでください,という開発部からの「お願い」があり,
実際には正しい用法と間違った用法がある,ということがわかります。

何か難しい話になってますね。 :frowning:
ドキュメントとブログを読んでみたのですがピンと来ないです。

具体的な例題はないでしょうか。
ドキュメントとブログを見ないとな開発部の意図が伝わらないのは問題があると思います。

教えていただいたFORM Convert to dynamicで検討してみた結果、これがベストな様です。

1.On loadで取得
form_o:=FORM Convert to dynamic(Current form name)

2.欲しいイベントで
$tergetObject_o:=form_o.pages[FORM Get current page].objects[FORM Event.objectName]

これでOBJECT GET系のコマンドを使わずに該当するフォームオブジェクトのプロパティの内容を取得できました。
javascriptのDOMの様にイメージでしょうか。

コマンドがなくて取得できなかった部分も参照できるのでこちらの方が便利かも。 :mrgreen:
少なくとも私が欲しかったものはこれで解決できました。
ありがとうございました。