リストボックス:3つのタイプの見分け方

最新バージョンのリストボックスは3つのタイプ(配列型、セレクション型、コレクション型)がありますが
これをプログラムから判定する方法はありますか?

ドキュメントを見てみたのですが直接的なコマンドは無いようなので教えてください。 :pray:

汎用的なコードでリストボックスの『型』を区別しようと考えたことはないのですが,

たとえば・・・

https://doc.4d.com/4Dv17R2/4D/17-R2.1720/LISTBOX-Get-property.301-3856980.ja.htmlLISTBOX Get property> に型固有の定数を渡して -1 または “” が返されるかどうか

https://doc.4d.com/4Dv17R2/4D/17-R2.1720/LISTBOX-GET-TABLE-SOURCE.301-3856992.ja.htmlLISTBOX GET TABLE SOURCE> で -1 または “” が返されるかどうか

で配列型か否かは判別できるかもしれません。

コレクション型は,さらにエンティティセレクション型とオブジェクトのコレクション型に分かれるので,やっかいです。

判定する手段はないんですね。残念。 :frowning:

おそらく配列型とセレクション型は淘汰されてコレクション型へ移行するのだと思いますが、
移行期にこれらが混在するため判定処理が必要だと考えました。
今後提供される見込みも無い様なので、メソッドの引数にリストボックスのタイプを記述する様な対応を考えてみます。

判定する方法見つけました。

https://doc.4d.com/4Dv17R3/4D/17-R3/LISTBOX-GET-CELL-POSITION.301-3906800.ja.htmlLISTBOX GET CELL POSITION>のColVarポインターで判定できる様です。
配列型の場合、配列のポインタ
セレクション型の場合、フィールドのポインタ
コレクション型の場合、Null
になるのでこれで判定できそうです。

ただし、また疑問が出てきました。配列型及びセレクション型ではこのポインタ経由でデータにアクセスできたのですが
コレクション型の場合アクセスする方法がありません。どう取得/更新するのが正しい方法なのでしょうか? :frowning:

いろいろ検討してみたのですが、
コレクション型リストボックスの場合、LISTBOX GET CELL POSITIONのColVarはNullではなく、

1.リストボックスのプロパティで設定しているコレクション/エンティティセレクションのソース
2.取得したCELLのオブジェクト名
3.リストボックスカラムのプロパティで設定されているデータタイプ
を含むオブジェクト変数が返ってくるのが望ましいと思います。

後リストボックスカラムのデータタイプに時間型を追加してもらうのもお願いします。

これでコレクション型に移行できると思います。 :pray:

こちらで検証した限りでは,

<code 4D>
C_TEXT($1;$objectName)

$objectName:=$1
If (OBJECT Get type(;$objectName)=Object type listbox)
//array or collection
$p:=OBJECT Get pointer(Object named;$objectName)
If (Not(Is nil pointer($p)))
Case of
: (Type($p->)=Boolean array)
//array
: (Type($p->)=Is longint)
C_TEXT($selectionName;$highlightName)
LISTBOX GET TABLE SOURCE(
;$objectName;$tableNum;$selectionName;$highlightName)
If ($tableNum=-1)
//named selection or entity collection
Else
//current selection
End if

End case
End if
End if
</code 4D>

といった具合に,

配列とカレントセレクションは特定できても,「命名セレクション」(named selection/highlight setが未設定の場合)と「エンティティセレクションまたはコレクション」の区別はつきませんでした。

いずれにしても,コレクション型は,オブジェクトのプロパティが中心になり,ポインターがほとんど使用できないので,従来のタイプとコードを一緒にするのは難しいかもしれません。

一方,ORDAでは,エンティティセレクション型とコレクション型は区別しない(Thisはエンティティであってもオブジェクトであってもリストボックス的には構わない)という考え方になるかと思います。

システム全体として汎用的に処理を書いている部分があります。
これらの部分はリストボックス及びオブジェクトのコマンドをつかって参照して書いていますので、
コレクション型に関しても特定できるのが望ましいと思います。

一から書き直すとか勘弁して欲しいです。 :frowning:

コレクション型リストボックス特有のプロパティにつていも参照できる様にしてほしいです。 :pray:

ところで時間の表示上の問題はどうなるのでしょうか?このまま放置?

: Keiji HOSAKA

時間の表示上の問題

ACI0099171: Time field is not supported in collection listbox; values are displayed as numeric

で登録しました。

https://forums.4d.com/4DBB_Main/x_User/298210/files/28246693.zip

配列型リストボックスを作成してコレクション型に変更しても,
データタイプが時間から文字列に変えられてしまいますね。

登録ありがとうございます。

もし対応してもらえる場合なのですが
データ上変わらないのであれば、リストボックス上ではどちらで扱われているのか
コマンドなどで確認できる様にして欲しいです。
補足をお願いいたします。
でないと汎用的なプログラムが書けません。 :pray:

おそらくプロパティのデータタイプを参照できるのが良いかと思います。

時間型について開発部から回答がありました。

オブジェクト型はTimeをサポートしていないので,
コレクション型リストボックスのセルにはTime string(This.myTime)というフォーミュラを使用してください,
とのことです。

ご期待に沿うことができず,申し訳ありません。

: Keisuke MIYAKO

時間型について開発部から回答がありました。

オブジェクト型はTimeをサポートしていないので,
コレクション型リストボックスのセルにはTime string(This.myTime)というフォーミュラを使用してください,
とのことです。

ご期待に沿うことができず,申し訳ありません。
表示はそれで良いのかもしれませんが入力はどうするの? :frowning: