リストボックスの選択解除を行いたい

4Dv15.4

リストボックス(データソース:配列)のグループ化を行っている一覧から、複数列のリストボックスに変更を行っている中で、
選択解除をどのようにすれば良いかと悩んでいます。

列数が1の場合、グループ化されている全ての配列の変数に0を代入する事で解除を行っていました。
複数列のリストボックスでは解除されません。

よろしくお願いいたします。

http://doc.4d.com/4Dv16/4D/16.2/LISTBOX-SELECT-ROW.301-3433526.ja.htmlLISTBOX SELECT ROW> (*; リストボックスのオブジェクト名 ;0;lk remove from selection)

で選択解除できます。

グループ化された配列をリストボックスに変換した場合,個別の配列はリストボックスの「列」配列となり,それぞれが構造的には1列のリストボックスになります。それぞれのリストボックスは,かつてグループ化されていた配列を内包するブール型の配列です。このブール型の配列をリストボックス全体の配列と呼びます。

グループ化された配列から変換されたリストボックスは,旧式のコーディング(0の代入)でも動くよう,特別な配慮が払われています。また,「結合」プロパティにより,選択行の同期が取られるようになります。デザイン上,変換されたリストボックスは互いに隣接していたかと思いますが,実際には,フォーム上のどこにあっても,結合しているボックス同士は互いに選択行の同期が取られるようになっています。なお,グループ化された配列とは違い,リストボックスは複数行の選択ができ,クリック以外の操作(矢印キーやショートカット)でも選択できますので,原則的にOn Clickedではなく,On Selection Changeで監視します。

さて,複数行のリストボックスは,「結合」プロパティではなく,リストボックス全体の配列で制御します。選択された行にはTrue,そうでない行にはFalseが代入されています。ですから,この配列の各要素にFalseを代入すれば,都合,選択が解除されます。しかし,配列に直接アクセスする方法でリストボックスを制御することは推奨されていません。配列の添字(インデックス)は整数(max.32,767)ですが,リストボックスには数十万行の要素が表示される場合もあるからです。

現在の選択行を調べるには,配列の添字(インデックス)を参照するのではなく,http://doc.4d.com/4Dv16/4D/16.2/LISTBOX-GET-CELL-POSITION.301-3433522.ja.htmlLISTBOX GET CELL POSITION>でカレント位置を取得してください。また,選択状態を変更するには,配列の添字(インデックス)に選択行番号(またはゼロ)を代入するのではなく,冒頭に挙げたコマンドで行を選択してください。

ありがとうございます。

LISTBOX SELECT ROWですね。
試行錯誤していたソースの中で記述している跡がありましたが、うまく動作をしていなかったようです。

DIALOGで表示した一覧画面から一覧を1行を選択し、別のDIALOGを表示してCANCELで元の一覧画面を表示した際に、Form Eventでフォームイベントタイプを取得するとOn Clickedの4が返ってきているのがなぜなのか。。。

画面が戻ってきた際に、今までの仕組みの配列に0を代入している記述を利用して、画面が戻ってきて配列の代入が0であれば、LISTBOX SELECT ROWで選択を解除しようと考えています。
何か見落として正常に動作しないのかも知れませんので、もう少し悩んでみます。

この件の一覧の制御は、選択を行っている対象に対して、参照処理、更新処理、削除処理を行っています。
どの処理を行っても選択を解除する流れになっていましたので、別ダイアログから戻ってきたら一覧を選択解除を行う方法ではなく、別ダイアログを呼び出す前にLISTBOX SELECT ROWで選択解除を行う事で対応が出来ました。

ありがとうございます。

: Nose MINORU

別のDIALOGを表示してCANCELで元の一覧画面を表示した際に、Form Eventでフォームイベントタイプを取得するとOn
Clickedの4が返ってきているのがなぜなのか。。。

リストフォーム・リストボックスのダブルクリック操作で,詳細画面に移動した後,復帰するイベントは_On Close Detail_として定義されていますが,DIALOGからDIALOGに移動した後,CANCELまたはACCEPTでひとつ前のダイアログに復帰するイベントは,特に定義されていません。そのため,そのタイミング(DIALOGの次の行)でForm eventを参照しても,DIALOGを誘発したイベント(通常はOn Clickedですが,理論的にはOn Double Clickedなどもあり得ます)が返されます。つまり,時間的には離れていますが,メソッドが完了していない以上,DIALOGに至ったフォームイベントが継続しているという扱いになります。

http://doc.4d.com/4Dv15/4D/15.4/Form-event.301-3274360.ja.html