カレントセレクション型のリストボックスで、任意のセル情報を取り出すには?
2 posters
カレントセレクション型のリストボックスで、任意のセル情報を取り出すには?
お世話になります。
配列型リストボックスでは、任意のセルの情報をプログラムから簡単に取り出せますが、カレントセレクション型のリストボックスではどの様に行うのが正しいのかわかりません。10列10行のリストの3列3行目の値を取り出したいだけなど、任意のセルの値を参照する簡単な方法はありませんでしょうか?
例えば3列3行目のセルの値を取り出したい時、リストが表示されている状態だとLISTBOX GET ARRAYSで取得した列ポインタ配列の先に示されるフィールドはレコードがロードされていないので空です。
そこで、LISTBOX GET TABLE SOURCEにてバインドされているテーブルを取り出し、GOTO SELECTED RECORDにて得たい行のレコードをロードします。
指定のセルがフィールドならこれで良いのですが、フォーミュラ式が割り当てられていた場合に困りました。その場合、列ポインタ配列の先がNilなのでLISTBOX Get column formulaにてフォーミュラ式を取り出します。それを評価したら問題ないかと思いきや、EXECUTE FORMULAでは戻り値を得られないので、フォーミュラ結果をOB SETするように括って実行させ、オブジェクト経由でやっと値を得ることができました。
こんな回りくどい事をしなくても、画面上には表示されている情報なので、もっと簡単に取り出しできそうで・・・
よろしくお願いします。
配列型リストボックスでは、任意のセルの情報をプログラムから簡単に取り出せますが、カレントセレクション型のリストボックスではどの様に行うのが正しいのかわかりません。10列10行のリストの3列3行目の値を取り出したいだけなど、任意のセルの値を参照する簡単な方法はありませんでしょうか?
例えば3列3行目のセルの値を取り出したい時、リストが表示されている状態だとLISTBOX GET ARRAYSで取得した列ポインタ配列の先に示されるフィールドはレコードがロードされていないので空です。
そこで、LISTBOX GET TABLE SOURCEにてバインドされているテーブルを取り出し、GOTO SELECTED RECORDにて得たい行のレコードをロードします。
指定のセルがフィールドならこれで良いのですが、フォーミュラ式が割り当てられていた場合に困りました。その場合、列ポインタ配列の先がNilなのでLISTBOX Get column formulaにてフォーミュラ式を取り出します。それを評価したら問題ないかと思いきや、EXECUTE FORMULAでは戻り値を得られないので、フォーミュラ結果をOB SETするように括って実行させ、オブジェクト経由でやっと値を得ることができました。
こんな回りくどい事をしなくても、画面上には表示されている情報なので、もっと簡単に取り出しできそうで・・・
よろしくお願いします。
osaru- 投稿数 : 67
登録日 : 2017/08/14
Re: カレントセレクション型のリストボックスで、任意のセル情報を取り出すには?
上記のポストに関連して、カレントセレクション型のリストボックスで、選択されている任意の行の情報を取り出したいと思っていましたが、ドキュメントにありました。
https://doc.4d.com/4Dv16/4D/16.5/Managing-List-Box-Objects.300-4226955.ja.html
結局、リストボックスにバインドされているレコードを捜査して、上記"$ListboxSet"に含まれるかどうかIs in setでの検証をするしかないのかなぁ(それともUSE SETして処理した後USE NAMED SELECTIONしたほうが効率良さそうですけど選択状態まで復元されるのでしょうか?)ここで疑問なのは、フォーム上に複数存在するリストボックスで現在選択しているのが何番目のセット名になっているのか知りようが無いような・・・カレントセレクション型・・・簡単に表示まで実現できる反面、込み入った事をしようと思うと悩まされています。
https://doc.4d.com/4Dv16/4D/16.5/Managing-List-Box-Objects.300-4226955.ja.html
セレクションタイプのリストボックス: 選択行はデフォルトでは、 $ListboxSetX と呼ばれる修正可能なセットにより管理されます(Xは0から始まり、フォーム内のリストボックスの数に応じて一つずつ増加していきます)。このセットはリストボックスのプロパティリストで定義します。このセットは4Dが自動 で管理します。ユーザがリストボックス中で1つ以上の行を選択すると、セットが即座に更新されます。他方、プログラムからリストボックスの選択を更新する た めに、"セット"テーマのコマンドを使用することができます。
結局、リストボックスにバインドされているレコードを捜査して、上記"$ListboxSet"に含まれるかどうかIs in setでの検証をするしかないのかなぁ(それともUSE SETして処理した後USE NAMED SELECTIONしたほうが効率良さそうですけど選択状態まで復元されるのでしょうか?)ここで疑問なのは、フォーム上に複数存在するリストボックスで現在選択しているのが何番目のセット名になっているのか知りようが無いような・・・カレントセレクション型・・・簡単に表示まで実現できる反面、込み入った事をしようと思うと悩まされています。
osaru- 投稿数 : 67
登録日 : 2017/08/14
Re: カレントセレクション型のリストボックスで、任意のセル情報を取り出すには?
配列セルは,すべて値が変数に格納されていますが,
数式セルは,On Display Detailのイベントの後は参照できません。
(セル毎に変数があるわけではないので・・・)
さらにいえば,On Display Detailは,画面に表示されている行,
またバッファリング用の予備行(表示されている行の数と同じ)しか発生しませんから,
配列のように,すべてのセルが「埋まって」いるわけでもありません。
フォーミュラを評価するには:
4DEVALタグで実現できるかもしれません。
例:
$formula:="[Table_1]Field_2+\"abc\""
$formula:="$4deval($1->:="+$formula+")"
$result:=""
PROCESS 4D TAGS($formula;$formula;->$result)
数式セルは,On Display Detailのイベントの後は参照できません。
(セル毎に変数があるわけではないので・・・)
さらにいえば,On Display Detailは,画面に表示されている行,
またバッファリング用の予備行(表示されている行の数と同じ)しか発生しませんから,
配列のように,すべてのセルが「埋まって」いるわけでもありません。
フォーミュラを評価するには:
4DEVALタグで実現できるかもしれません。
例:
$formula:="[Table_1]Field_2+\"abc\""
$formula:="$4deval($1->:="+$formula+")"
$result:=""
PROCESS 4D TAGS($formula;$formula;->$result)
miyako- 投稿数 : 468
登録日 : 2016/07/05
Re: カレントセレクション型のリストボックスで、任意のセル情報を取り出すには?
任意のセルではなく,選択された行が対象だったのでしょうか。
その場合,プロパティリストの「ハイライトセット」で判別できます。
(ドキュメントの表記が紛らわしいですが,修正可能とは,$ListboxSetXというデフォルト名には縛らないということです)
プロパティリストに記入せずに,後からコマンドで設定することもできます。
(LISTBOX SET TABLE SOURCE)
フォーム上に複数存在するリストボックス・・・については,
反対にLISTBOX GET TABLE SOURCEでセット名が特定できます。
Is in setを使用するべきか,USE SETするべきかは,
レコード数等に応じて判断するのが良いと思います。
カレントセレクション型リストボックスの場合,
CUT NAMED SELECTION //カレントセレクションを取り置き
USE SET($ListboxSet) //選択行をカレントセレクションに
USE NAMED SELECTION //カレントセレクションを復元
COPY SET("$ListboxSet";"$ListboxSet") //選択状態を復元
みたいな要領でカレントセレクションを復元することが必要ですが,
命名セレクションであれば,その必要はありません。
命名セレクションは,
レコード番号の順序およびカレントレコードのスナップショットですが,
選択状態は含まれません。
なお,v17以降は,コレクション型のリストボックスというものもありますので,
合わせて検討できるかもしれません。
その場合,プロパティリストの「ハイライトセット」で判別できます。
(ドキュメントの表記が紛らわしいですが,修正可能とは,$ListboxSetXというデフォルト名には縛らないということです)
プロパティリストに記入せずに,後からコマンドで設定することもできます。
(LISTBOX SET TABLE SOURCE)
フォーム上に複数存在するリストボックス・・・については,
反対にLISTBOX GET TABLE SOURCEでセット名が特定できます。
Is in setを使用するべきか,USE SETするべきかは,
レコード数等に応じて判断するのが良いと思います。
カレントセレクション型リストボックスの場合,
CUT NAMED SELECTION //カレントセレクションを取り置き
USE SET($ListboxSet) //選択行をカレントセレクションに
USE NAMED SELECTION //カレントセレクションを復元
COPY SET("$ListboxSet";"$ListboxSet") //選択状態を復元
みたいな要領でカレントセレクションを復元することが必要ですが,
命名セレクションであれば,その必要はありません。
命名セレクションは,
レコード番号の順序およびカレントレコードのスナップショットですが,
選択状態は含まれません。
なお,v17以降は,コレクション型のリストボックスというものもありますので,
合わせて検討できるかもしれません。
最終編集者 miyako [ 2019-06-04, 1:47 pm ], 編集回数 1 回
miyako- 投稿数 : 468
登録日 : 2016/07/05
Re: カレントセレクション型のリストボックスで、任意のセル情報を取り出すには?
miyako wrote:任意のセルではなく,選択された行が対象だったのでしょうか。
任意のセル情報取り出しが最初にしたかった事で、後々、選択している行の情報も取り出したくなった・・・という事でした。
https://doc.4d.com/4Dv16/4D/16.5/LISTBOX-GET-TABLE-SOURCE.301-4226954.ja.html
LISTBOX GET TABLE SOURCEを見ると、ハイライトセット名称が得られる事が判りました。ありがとうございました。
配列セルは,すべて値が変数に格納されていますが,
数式セルは,On Display Detailのイベントの後は参照できません。
(セル毎に変数があるわけではないので・・・)
セレクション型リストボックスの仕様なんですね。承知致しました。
こちらも中々ややこしいですね。4DEVALタグで実現できるかもしれません。
色々試行錯誤したお陰で、ほぼ実現したいことができるようになりました。
LISTBOX Get column formulaでわざわざ式の取り出しができるのですから当然評価結果も取り出すカラクリがあるのだろうと思いましたが、あまり想定されていないみたいですね。
osaru- 投稿数 : 67
登録日 : 2017/08/14
Permissions in this forum:
返信投稿: 不可
|
|